视差滚动(Parallax Scrolling)的一点小心得
下面内容来源于我知乎的这个答案:http://www.zhihu.com/question/20990029/answer/21436067
假期有空,整理到博客园这边,并做了一些语境的调整。
———————— 正文 ————————
先说说什么是视差。
视差滚动(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%时,翻页结束。其他分镜如此类推。
这边推荐一个做视差滚动的插件:Jarallax(Welcome to Jarallax.com)
设计思路清晰,API设计也很直观。依赖于jQuery1.7的版本,再高的版本就不支持了哦!
另外,作者貌似已经没有维护了...
做视差滚动,大家做关注的莫过于:如何让滚动更加平滑?
但这个问题就太大了,这边我就简单回答一下吧(不细谈前端技术层面的优化,如:DOM数量、页面渲染优化这些)。
开头处,我提到的三种实现分类,实际上是这样一个情况:

1类是最自由的,用户甚至可以直接调整进度条,实现“快进”。
在这种设计下,用户鼠标滚轮的最小刻度,就是动画的一帧。因为不同浏览器之间,鼠标滚轮的最小刻度是不一样的。这就导致了,在不同浏览器之间,页面滚动过程中,动画播放的帧率是有差异的。如果遇到奇葩浏览器,鼠标滚动的最小刻度很大,动画甚至会出现“掉帧”的情况。
解决方法很简单,一般采取增加页面长度的方式,来稀释鼠标滚轮的最小刻度。
但还是会有一些情况出现,如户快拖动进度条时,“掉帧”的情况难免还是会出现。
3类的实现,滚轮只是动画的触发按钮。当用户滚动了一下鼠标,之前设计好的动画就开始播放。当播放结束后,对滚动事件的监听,才会重新被激活。这种设计,弱化了交互,但提供了更优质的动画展现。因为动画的播放时间和帧率不是用户控制的,是事先代码所设定好的。
2类就不说了,介乎与1和3之间。
简单的说,鱼(流畅)与熊掌(操控性)不可得兼。
关于1类,就先到这里吧。以后有机会,再跟大家聊聊其他两个类别的。
本文地址:http://www.cnblogs.com/maplejan/p/3538157.html
视差滚动(Parallax Scrolling)的一点小心得的更多相关文章
- 视差滚动(Parallax Scrolling)效果的原理和实现
		
视差滚动(Parallax Scrolling)是指让多层背景以不同的速度移动,形成立体的运动效果,带来非常出色的视觉体验.作为今年网页设计的热点趋势,越来越多的网站应用了这项技术. 一.什么是视差滚 ...
 - 【转】视差滚动(Parallax Scrolling)效果的原理和实现
		
原文:http://www.cnblogs.com/JoannaQ/archive/2013/02/08/2909111.html 视差滚动(Parallax Scrolling)是指让多层背景以不同 ...
 - 视差滚动(Parallax Scrolling)插件补充
		
13. Windows Windows (github) 是一个让你用占据整个屏幕的section来构建单面网站的插件.该插件提供给你一些回调函数,当新的section出现在可视区并且并且处理快照时被 ...
 - BUI Webapp用于项目中的一点小心得
		
接触BUI也有一段时间,也用在了移动端的项目开发中,总的来说,该框架用起来也挺灵活的,控件可以自由定制,前提是自己能认真地学习该框架的api,因为api里面说的东西比较详细,如果没有仔细看的,可能有些 ...
 - ASP.NET MVC  Autofac依赖注入的一点小心得(包含特性注入)
		
前言 IOC的重要性 大家都清楚..便利也都知道..新的ASP.NET Core也大量使用了这种手法.. 一直憋着没写ASP.NET Core的文章..还是怕误导大家.. 今天这篇也不是讲Core的 ...
 - Qt使用com组件的一点小心得(使用Qt自带的工具dumpcpp生成.h和.cpp文件)
		
这几天工作中要用到Qt调用com组件,主要用到的类型有dll和ocx,使用他们的方法很简单:1.将com组件注册到系统中.2.使用Qt自带的工具dumpcpp将com组件生成cpp和头文件.3.然后就 ...
 - python+tesseract验证码识别的一点小心得
		
由于公司需要,最近开始学习验证码的识别 我选用的是tesseract-ocr进行识别,据说以前是惠普公司开发的排名前三的,现在开源了.到目前为止已经出到3.0.2了 当然了,前期我们还是需要对验证码进 ...
 - 学习KMP算法的一点小心得
		
KMP算法应用于 在一篇有n个字母的文档中 查找某个想要查找的长度为m的单词:暴力枚举:从文档的前m个字母和单词对比,然后是第2到m+1个,然后是第3到m+2个:这样算法复杂度最坏就达到了O(m*n) ...
 - 近日使用Taro框架的一点小心得
		
1.yarn npm安装的包,跟权限问题有关,与网络也有关 2.Vue框架首先,是解决了view-model的问题,解放开发的双手,使得显示和数据和控制分开 3.当你觉得最近没有技术文章看时,就看收藏 ...
 
随机推荐
- C++编译与链接(0)-.h与.cpp中的定义与声明
			
C++中有的东西需要放在可以在.h文件中定义,有的东西则必须放在.cpp文件中定义,有的东西在不同的cpp文件中的名字可以一样,而有的则不能一样 那么究竟哪些东西可在头文件中定义,声明,哪些东西又必须 ...
 - Beta阶段团队项目开发篇章3
			
例会时间 2016.12.6晚 例会照片 个人工作 上阶段任务验收 中英文切换功能已经实现,调查结果分析已经完成,博客基本撰写完成,在征求其他组员意见后发布.任务基本完成. 任务分配 组员 任务内容 ...
 - 安装centos6及安装redhat6后的配置
			
一.安装centos6 在引导到镜像后,选择: 我选择第二个,使用基本的显卡驱动安装系统 #第一个也是可以选的(安装或升级现有的系统) 之后,与 RHEL5 同样,使用光盘引导安装,系统会提示我们是否 ...
 - PBS命令和使用
			
PBS是公开源代码的作业管理系统,在此环境下运行,用户不需要指定程序在哪些节点上运行,程序所需的硬件资源由PBS管理和分配. PBS(Portable Batch System)是由NASA开发的灵活 ...
 - java 数据结构与算法---队列
			
原理来自百度百科 一.队列的定义 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插 ...
 - String、StringBuffer与StringBuilder比较
			
关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺点,到底什么时候该用谁呢?下面我们从以下几点说明一下 1.三者在执行速度方面的比较: StringBuilder > St ...
 - 深入理解JAVA虚拟机阅读笔记5——Java内存模型与线程
			
Java内存模型是定义线程共享的变量的访问规则(实例字段.静态字段和构成数组对象的元素),但不包括线程私有的局部变量和方法参数. 1.主内存与工作内存 Java内存模型规定,所有的变量都必须存储在主内 ...
 - 第219天:Angular---过滤器
			
在Angular中,过滤器的功能主要是格式化数据表达式,且可以自定义过滤器.作用域(scope)主要服务于页面模板,在控制器和页面中起桥梁作用,保存模板中的数据对象,为模板中的元素提供方法和属性. 一 ...
 - Qt中 QString 转 char*
			
Qt下面,字符串都用QString,确实给开发者提供了方便,想想VC里面定义的各种变量类型,而且函数参数类型五花八门,经常需要今年新那个类型转换 Qt再使用第三方开源库时,由于库的类型基本上都是标准的 ...
 - Java  输入/输出   反射
			
Java 输入/输出 反射 输入输出和反射 一.数据流的基本概念 流一般分为 ( Input Stream ) 和输出流 ( Output Stream ) 两类,但这种划分并不是绝对的.比如一 ...