纯CSS实现视差滚动效果

前言

视差滚动效果大家可能都听过,基本上都是JS实现的,有对应插件 – Parallax.js.

实际上,如果你对兼容性要求不是很高,比方说忽略IE浏览器,则我们使用简单的几行CSS代码就可以实现视差滚动效果了。

先上效果图

image

目前,Chrome以及FireFox等浏览器(不包括IE11在内的浏览器)都是有效果。

CSS实现部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
div {
box-sizing: border-box;
}

#container {
/* 滚动容器 */
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
perspective: 1px; // 3D视图
overflow-x: hidden;
overflow-y: scroll;
}

#group1 {
/* 视差元素的父级需要3D视角 */
height: 1000px;
position: relative;
transform-style: preserve-3d;
font-size: 20px;
}

.background {
/* 滚动比较慢的背景元素 */
transform: translateZ(-1px);
height: 500px;
width: 100%;
position: absolute;
top: 0;
background: #FF8A8A;
padding-top: 100px;
}

.foreground {
position: absolute;
top: 500px;
height: 500px;
width: 100%;
background: #23819C;
opacity: 0.8;
padding-top: 100px;
}

HTML部分

1
2
3
4
5
6
7
8
9
10
<div id='container'>
<div id="group1">
<div class="background">
<center>I'm an element far away.</center>
</div>
<div class="foreground">
<center>I'm an element close by.</center>
</div>
</div>
</div>

大家可以注意上面代码出现了一个1px(来自perspective), 一个-1px(来自transform)以及scale(2)中的2. 这几个数字之间有什么关系呢?

实现原理

我们先看下面这个3D视角示意图(来自这里)

image

当我们在屏幕前面1个单位的地方,看屏幕后面1个单位的元素,肉眼所见的画面大小只有实际的1/2,即所谓的近大远小。此时scale(2)让内容放大到原来2倍,正好在平面上看上去好像是原来大小。

虽然肉眼所见体积似乎是1:1,但是,滚动时候的位移变化还是1:2, 应该很好理解。举个极端的例子,我们坐在电瓶车上看天上的月亮,虽然车子在40码的速度奔啊奔,但是,好像月亮的位置没有移动,一直就在头顶。网页中的3D就是模拟真实世界的3D效果,因此,也会有这种视差体验。

或者这么讲吧,CSS3 3D天然视差效果,滚动,只是视差体现的一个触发条件。

于是,如果我们想实现3层视差滚动怎么办?很简单,来个transform: translateZ(-2px)试试~

结语

据我测试,直接body或html滚动似乎难以实现视差滚动效果,不过天色已晚,我没深究,有兴趣的小伙伴可以研究分享下。