利用3D transform实现视差滚动
前言
最近在网页中运用『视差滚动』比较流行,能让网页有一种立体层次感。
视差滚动(Parallax Scrolling)是指让多层背景以不同的速度移动,形成立体的运动效果,带来非常出色的视觉体验。作为网页设计的热点趋势,越来越多的网站应用了这项技术。
——百度百科
说白了,『视差滚动』就是让同一页面的不同元素在滚动的时候,滚动速度各不相同,从而让人觉得页面有层次。然而css3
新增的3D transform
特性本身就可以为元素增加立体感,所以很适合用来实现『视差滚动』。
原理
相当于在同一三维坐标系中,为不同层次的元素设置不同的z
坐标,就自然形成了不同的立体层面,滚动的时候不同z
坐标的元素拥有不同的滚动速度(从结果上来说是这样的),且z
坐标越小(即离屏幕平面向内越远)的平面,滚动速度看起来越慢。
- 利用
perspective
属性构造一个相机(观察者)容器,然后设置perspective-origin
(消失点?相机焦点?); - 利用
transform-style
属性构造一个3d
容器:
1 | transform-style: preserve-3d; |
也就是其内的元素呈现方式为3d
,相当于构建了一个三维坐标系;
- 在
3d
容器内利用transform: translateZ()
设置不同的z
坐标,体现层次;不过只设置z
坐标,元素在投影到屏幕平面时,尺寸就不是原来的尺寸了,需要使用scale()
进行缩放:
1 | 缩放系数 = (z坐标 - perspective设置值)/ perspective设置值 |
- 光有
z
坐标并不会自动按照z
的大小进行层次覆盖,而是按照html
的先后顺序进行覆盖,所以还需要按照层级手动添加z-index
属性;
示例
1 | #view{/* 相机容器 */ |
1 | <section id="view"> |