十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
视差滚动(Parallax Scrolling)是指多层背景以不同的速度移动,形成立体的运动效果,带来非常出色的视觉体验。一般把网页解剖为:背景层、内容层和悬浮层(贴图层)。
目前创新互联建站已为数千家的企业提供了网站建设、域名、网络空间、网站托管、服务器租用、企业网站设计、自流井网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
当滚动鼠标滚轮的时候,各图层以不同速度移动,形成视差的效果。这就是时差滚动的大致原理。
原理是这样,但落实到技术细节上时,实现的方法却各种各样。
我个人大致归纳了一下:
1、以 “页面滚动条” 作为 “视差动画进度条” 的;
2、以 “滚轮刻度” 当作 “动画帧度” 去播放动画的(或者直接称为“隐藏进度条”);
3、鉴听mousewheel事件,事件被触发即播放动画,实现“翻页”效果;
下面的回答,均以上述1类的实现方式为基准。
为什么是1类呢?因为它很直观,和我们日常接触到的视频播放器是一样的:
下面,以Every Last Drop这个页面做为分析对象,去回答题主的问题。
做滚动网页的时候,是怎么实现页面的翻页?
首先,根据页面动画所需的分镜,去等比划分进度条。
例如:共有11个分镜,则分镜大致可以划分为:0%、10%、20%、30% .... 100%
但需要注意的是,整个滚动过程实际分为两个部分:分镜切换 和 分镜动画。
我们要预先划分好他们的比例,如:每一个分镜,2%的进度用于分镜切换,7%的进度用于分镜动画。
则进度大致可以划分为:
------------------------------------------
0%(初始,分镜1)
↓
(消耗2%用于切换分镜)
↓
2%(完全进入分镜2)
↓
(消耗8%用于分镜动画的播放)
↓
10%(分镜2动画播放完毕)
↓
(消耗2%用于切换分镜)
↓
12%(完全进入分镜3)
↓
...(略)
------------------------------------------
按照上面的划分,当进度条滚动到10%的时候,就要开始进行分镜2到分镜3的切换,也就是所谓的翻页。当滚动到12%时,翻页结束。其他分镜如此类推。
(如果题主想问的是技术实现细节,估计要失望了!)
在做时间轴的时候,一般都要调用别人的js库。那么这个滚动页面,是不是也有一个js库?
随便在google搜一下,就搜到很多关于视差滚动插件的文章:10个优秀视差滚动插件
这里补充一点:做视差滚动页面绝对是体力活。
本着我为人人的分享精神,还是推荐一个我觉得好用凑合好用的时差滚动库:
Jarallax(Welcome to Jarallax.com)
设计思路清晰,API设计也很直观。依赖于jQuery1.7的版本,再高的版本就不支持了哦!
另外,作者貌似已经没有维护了...
滚动时每层不同滚动速率的实现原理是什么?
初中物理:单位时间相同,位移距离不同,速度也不同。
如何让滚动更加平滑?
这个问题就太大了,能重新开一个问题了。
这边我就简单回答一下吧(不细谈前端技术层面的优化,如:DOM数量、页面渲染优化这些)。
开头处,我提到的三种实现分类,实际上是这样一个情况:
1类是最自由的,用户甚至可以直接调整进度条,实现“快进”。
在这种设计下,用户鼠标滚轮的最小刻度,就是动画的一帧。因为不同浏览器之间,鼠标滚轮的最小刻度是不一样的。这就导致了,在不同浏览器之间,页面滚动过程中,动画播放的帧率是有差异的。如果遇到奇葩浏览器,鼠标滚动的最小刻度很大,动画甚至会出现“掉帧”的情况。
解决方法很简单,一般采取增加页面长度的方式,来稀释鼠标滚轮的最小刻度。
但还是会有一些情况出现,如户快拖动进度条时,“掉帧”的情况难免还是会出现。
3类的实现,滚轮只是动画的触发按钮。当用户滚动了一下鼠标,之前设计好的动画就开始播放。当播放结束后,对滚动事件的监听,才会重新被激活。这种设计,弱化了交互,但提供了更优质的动画展现。因为动画的播放时间和帧率不是用户控制的,是事先代码所设定好的。
2类就不说了,介乎与1和3之间。
简单的说,鱼(流畅)与熊掌(操控性)不可得兼。
何为滚动视差
视差滚动(Parallax Scrolling)是指让多层背景以不同的速度移动,形成立体的运动效果,带来非常出色的视觉体验。 作为网页设计的热点趋势,越来越多的网站应用了这项技术。
通常而言,滚动视差在前端需要辅助 Javascript 才能实现。但是使用background-attachment也可以做到这样的效果。
要了解background-attachment的作用可以参考我的另一篇关于它的简单介绍:
什么是background-attachment
使用background-attachment: fixed实现滚动视差
首先,我们使用background-attachment: fixed来实现滚动视差。fixed 此关键字表示背景相对于视口固定。即使一个元素拥有滚动机制,背景也不会随着元素的内容滚动。
这里的关键在于,即使一个元素拥有滚动机制,背景也不会随着元素的内容滚动。也就是说, 背景图从一开始就已经被固定死在初始所在的位置。
我们使用,图文混合排布的方式,实现滚动视差,HTML 结构如下, .g-word表示内容结构,.g-img表示背景图片结构 :
关键 CSS:
效果如下:
嗯?有点神奇,为什么会是这样呢?可能很多人会和我一样,第一次接触这个属性对这样的效果感到懵逼。
我们把上面background-attachment: fixed注释掉,或者改为background-attachment: local,再看看效果:
这次,图片正常跟随滚动条滚动了,按常理,这种效果才符合我们大脑的思维。
而滚动视差效果,正是不按常理出牌的一个效果,重点来了:
当页面滚动到图片应该出现的位置,被设置了background-attachment: fixed的图片并不会继续跟随页面的滚动而跟随上下移动,而是相对于视口固定死了。
好,我们再来试一下, 如果把所有.g-word内容区块都去掉 ,只剩下全部设置了background-attachment: fixed的背景图区块,会是怎么样呢?
效果如下:
结合这张 GIF,相信能对background-attachment: fixed有个更深刻的认识,移动的只有视口,而背景图是一直固定死的。
综上,就是 CSS 使用background-attachment: fixed实现滚动视差的一种方式,也是相对而言比较容易的一种。
参考文章: 滚动视差?CSS 不在话下
这个是网页“视差滚动”的效果,知乎有相关的回答网页链接。
推荐的视差滚动插件:skrollr.js
html5 视觉差滚动效果
原理就是一种利用控制各个图片层之间滚动的速度,来产生一种立体空间的效果,每个层都用一个png透明图片做为背景,然后滚动的时候控制一下每个不同的速度。
不过有两个方面需要注意:
1、以大量图片为特色的网站应该考虑图像的预加载问题,以便为用户提供更好更流畅的视觉体验;
2、某些网站页面在移动设备上的效果可能较之在PC上有所不同,一些功能也可能无法正常使用。