前言

视差滚动(Parallax Scrolling)是指让多层背景以不同的速度移动,形成立体的运动效果,带来非常出色的视觉体验。

目前最火热的视差开源库为parallax.js

官方地址:https://github.com/wagerfield/parallax

体验地址:http://matthew.wagerfield.com/parallax/

原理

视差滚动原理其实并不难,parallax.js的源码也仅有600行,大致讲解一下

1、默认情况通过requestAnimationFrame方式做数值计算,否则用setTimeout

  1. if (!window.requestAnimationFrame) {
  2. window.requestAnimationFrame = function(callback, element) {
  3. var currTime = new Date().getTime();
  4. var timeToCall = Math.max(0, 16 - (currTime - lastTime));
  5. var id = window.setTimeout(function() { callback(currTime + timeToCall); },
  6. timeToCall);
  7. lastTime = currTime + timeToCall;
  8. return id;
  9. };
  10. }

2、优先通过DeviceOrientationEvent判断是否支持陀螺仪,否则通过mousemove事件监听鼠标移动

  1. Plugin.prototype.enable = function() {
  2. if (!this.enabled) {
  3. this.enabled = true;
  4. if (this.orientationSupport) {
  5. this.portrait = null;
  6. window.addEventListener('deviceorientation', this.onDeviceOrientation);
  7. setTimeout(this.onOrientationTimer, this.supportDelay);
  8. } else {
  9. this.cx = 0;
  10. this.cy = 0;
  11. this.portrait = false;
  12. window.addEventListener('mousemove', this.onMouseMove);
  13. }
  14. window.addEventListener('resize', this.onWindowResize);
  15. this.raf = requestAnimationFrame(this.onAnimationFrame);
  16. }
  17. };

3、css动画优先采用transform的translate3d,否则使用translate进行平移

  1. if (this.transform3DSupport) {
  2. this.css(element, 'transform', 'translate3d('+x+','+y+',0)');
  3. } else if (this.transform2DSupport) {
  4. this.css(element, 'transform', 'translate('+x+','+y+')');
  5. }

4、通过设置CSS让浏览器开启GPU加速

  1. Plugin.prototype.accelerate = function($element) {
  2. for (var i = 0, l = $element.length; i < l; i++) {
  3. var element = $element[i];
  4. this.css(element, 'transform', 'translate3d(0,0,0)');
  5. this.css(element, 'transform-style', 'preserve-3d');
  6. this.css(element, 'backface-visibility', 'hidden');
  7. }
  8. };

5、层运动的计算规则

  • 每一个层的运动量依赖于3个因素:
  • scalarX和scalarY的值
  • 父DOM元素的尺寸大小
  • 一个parallax场景中层的depth值

计算的公式如下:

  1. xMotion = parentElement.width * (scalarX / 100) * layerDepth
  2. yMotion = parentElement.height * (scalarY / 100) * layerDepth

例如在场景中一个data-depth为0.5的层,它的scalarX和scalarY值都为10(默认值),它的父容器的尺寸为1000px x 1000px,那么这个层在x和y方向的总运动量就为:

  1. xMotion = 1000 * (10 / 100) * 0.5 = 50 # 50px of positive and negative motion in x
  2. yMotion = 1000 * (10 / 100) * 0.5 = 50 # 50px of positive and negative motion in y

使用方式

非常简单,官方建议使用ul+li标签的无序列表(当然你用div或者其他标签都行),你只需要给它们一个class layer和一个data-depth属性来指定该层的深度。深度为0的层将是固定不动的,深度为1的层运动效果最激烈的层。0-1之间的层会根据值来相对移动。

  1. <ul id="scene">
  2. <li class="layer" data-depth="0.00"><img src="layer1.png"></li>
  3. <li class="layer" data-depth="0.20"><img src="layer2.png"></li>
  4. <li class="layer" data-depth="0.40"><img src="layer3.png"></li>
  5. <li class="layer" data-depth="0.60"><img src="layer4.png"></li>
  6. <li class="layer" data-depth="0.80"><img src="layer5.png"></li>
  7. <li class="layer" data-depth="1.00"><img src="layer6.png"></li>
  8. </ul>

别忘了设置样式

  1. ul {
  2. list-style: none;
  3. display: block;
  4. padding: 0;
  5. margin: 0;
  6. }
  7. . scene,
  8. . scene .layer {
  9. height: 100%;
  10. width: 100%;
  11. position: absolute;
  12. }
  1. //jquery.parallax.js
  2. $('. scene').parallax();
  3. //parallax.js
  4. var scene = document.getElementById('scene');
  5. var parallax = new Parallax(scene);

一般这样使用就足够了,除非是比较复杂的效果,要设置一些特定参数,调用API,具体内容参见官方文档

结合swiper.js

使用方式上不变,只不过需要把需要视差的元素再包裹一层

  1. <div class="swiper-slide">
  2. <ul class="parallax">
  3. <li class="layer" data-depth="0.5"><img style="position: absolute;left:0;top: 5%" class="ani" swiper-animate-effect="fadeInUp" swiper-animate-duration="1s" swiper-animate-delay="0.3s" src="./img/5.jpg" alt=""></li>
  4. <li class="layer" data-depth="0.2">
  5. <video id="video" style="width: 80%;left: 10%;top: 20%" src="./video/test.mp4" preload autoplay controls>
  6. </video>
  7. </li>
  8. </ul>
  9. </div>

最终效果图:

demo地址:

https://github.com/leestar54/h5-demo/blob/master/parallax.html

那些H5用到的技术(5)——视差滚动效果的更多相关文章

  1. 分享七款视差滚动效果的jQuery 插件

    视差(Parallax)是指从不同的点看一个物体时形成的视觉差异,这个名词是源自希腊文的παράλλαξις (parallaxis),意思是”改变”.在网页设计中,视差滚动(Parallax Scr ...

  2. 16个最棒的jQuery视差滚动效果教程

    今天我们整理了16个最棒的jQuery视差滚动效果教程 , 并附有演示地址,你可以快速的查看教程的效果,或者应用在自己的项目中.希望本文对想要学习或者使用jQuery视差效果的朋友有帮助,慢慢的欣赏吧 ...

  3. css实现视差滚动效果

    今天逛京东金融的时候发现他家网站首页的滚动效果看着很有意思,于是就做了一个,demo链接http://1.liwenyang.applinzi.com/index.html 大多数的视差滚动效果都是使 ...

  4. 使用javascript开发的视差滚动效果的云彩 极客标签 - 做最棒的极客知识分享平台

    www.gbtags.com 使用javascript开发的视差滚动效果的云彩 阅读全文:使用javascript开发的视差滚动效果的云彩 极客标签 - 做最棒的极客知识分享平台

  5. 使用javascript开发的视差滚动效果的云彩

    在线演示 jquery.parallax.js是一款能够帮助你快速开发视差效果的jQuery插件,在这里我们使用它来开发一款漂亮的云朵视差效果. 主要代码: Javascript ........ 阅 ...

  6. [Swift通天遁地]九、拔剑吧-(13)创建页面的景深视差滚动效果

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  7. [Swift通天遁地]九、拔剑吧-(14)创建更美观的景深视差滚动效果

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  8. 利用background-attachment做视差滚动效果

    视差滚动(Parallax Scrolling)是指让多层背景以不同的速度移动,形成立体的运动效果,带来非常出色的视觉体验.作为今年网页设计的热点趋势,越来越多的网站应用了这项技术. 不明白的可以先看 ...

  9. CSS完成视差滚动效果

    一.是什么 视差滚动(Parallax Scrolling)是指多层背景以不同的速度移动,形成立体的运动效果,带来非常出色的视觉体验 我们可以把网页解刨成:背景层.内容层.悬浮层 当滚动鼠标滑轮的时候 ...

随机推荐

  1. java String,StringBuffer,StringBuilder区别及联系

    String 字符串常量(不可变)StringBuffer 字符串变量(线程安全,可变) StringBuilder 字符串变量(非线程安全,性能优,可变) 简要的说, String 类型和 Stri ...

  2. 编写高质量代码改善C#程序的157个建议——建议83:小心Parallel中的陷阱

    建议83:小心Parallel中的陷阱 Parallel的For和ForEach方法还支持一些相对复杂的应用.在这些应用中,它允许我们在每个任务启动时执行一些初始化操作,在每个任务结束后,又执行一些后 ...

  3. CF869C The Intriguing Obsession(组合数学瞎搞,O(n)莫名过)

    — This is not playing but duty as allies of justice, Nii-chan! — Not allies but justice itself, Onii ...

  4. Linq研究

    微软在.NET 3.5中加入了LINQ技术,作为配套改进了C#语言,加入了Lambda表达式,扩展方法,匿名类型等新特性用以支持LINQ.微软同时提出了要使用声明式编程,即描述计算规则,而不是描述计算 ...

  5. Android 画指南针

    1.无意看到了一个指南针的UI,在这里简单的模仿了一下.其实就是第画布的一些变化而已. 别人的效果图是: 3.简单说一下思路: 1)首先是画一个黑色圆盘 2) 然后画圆盘上的刻度(就是对Canvas一 ...

  6. MSSQL Server中partition by与group by的区别

    在使用over等开窗函数时,over里头的分组及排序的执行晚于“where,group by,order by(但此排序顺序优先级是最高的)”的执行. ①group by 列名 合并(列值相同的并作一 ...

  7. python3.7.0安装

    如何安装Python的操作步骤: 1.第一步先去python的官方网站下载python的安装包 地址:https://www.python.org/downloads/ 根据自己的系统选择对应的安装包 ...

  8. 在一台服务器上搭建相对高可用HiveServer实践

    本文来自网易云社区 作者:刘杰 问题及原因 组里之前搭建了一个hiveserver提供给猛犸上的ETL程序调用,hiveserver隔三差五地挂掉重启,网上查了些资料,也咨询了猛犸那边维护hivese ...

  9. WordCount(JAVA实现)

    201631103228,201631101227 1.项目需求 对程序设计语言源文件统计字符数.单词数.行数,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速地处理多个文件. wc. ...

  10. leetcode 213. 打家劫舍 II JAVA

    题目: 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻 ...