前言

视差滚动(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. Exception (3) Java exception handling best practices

    List Never swallow the exception in catch block Declare the specific checked exceptions that your me ...

  2. js阿拉伯数字转中文大写 方法重多

    方法一  function DX(n) { if (!/^(0|[1-9]\d*)(\.\d+)?$/.test(n)) return "数据非法"; var unit = &qu ...

  3. python字符串字典列表互转

    #-*-coding:utf-8-*- #1.字典 dict = {'name': 'Zara', 'age': 7, 'class': 'First'} #字典转为字符串,返回:<type ' ...

  4. DELPHI XE5-8 弹出列表框供选择

    点击章节练习: var tmplm:Tlistboxitem; begin dm.FDQTMP.SQL.Clear; dm.FDQTMP.SQL.Add('select GSESSON from TS ...

  5. Android-广播发送与接收(Java代码中订阅)

    Android四大组件之一广播,使用的也比较多,广播可大致分为两种,一种是Android系统区域的广播,是由系统指令发出,例如:点亮屏幕广播,开机过程中的一些广播 省略…, 然而还有一种广播就是我们自 ...

  6. [Erlang06]在Erlang shell怎么在目录A下编译目录B下的文件,并把生成文件统一放置目录C?

    问题描述: 我们想快速测试一个小功能,第一个反应就是打开Erl shell 直接输入,但是当想测试一个复杂的函数时,一般会写成一个*.erl文件,然后在shell下: cd(FileDir). c(F ...

  7. Jenkins Pipeline+Maven+Gitlab持续集成构建问题集锦

    问题 1.全局配置一定要写正确,之前where git 给的地址时E:\Git\cmd\git.exe一直报错,其实Windows真正的git.exe在bin目录下 如果是Linux中,使用where ...

  8. python3.5在内存中获取远程图片尺寸

    自已看看,用于获取选程图片的尺寸 >>> from io import BytesIO>>> import requests as rs>>> f ...

  9. .net core i上 K8S(三)Yaml文件运行.netcore程序

    上一章我们通过kubectl run简单运行了一个.netcore网站,但实际的开发中,我们都是通过yaml来实现的. 1.编写yaml文件 关于yaml文件的格式在此就不多描述了,不熟悉的可以去网上 ...

  10. .NET CORE 2.1 导出excel文件的两种方法

    最近在做 MVC 项目的时候遇到项目的导出,下面总结下两种导出到excel 的方法 第一种方法: 将文件写到本地,然后返回这个File 或者返回这个 File 的绝对地址  其中  _hostingE ...