使用CSS3来实现滚动视差效果的教程


Posted in HTML / CSS onAugust 24, 2015

“视差(parallax)”效果现在在互联网上越来越流行了。如果你还没听说过什么是视差效果,它其实就是利用图片形成不同的层,分别以不同的速度,不同的方向移动产生的效果。这会产生出很奇妙的视觉效果,能有力的吸引住浏览者的目光。

观看演示

在web设计中,最常见的实现视差效果的方式是使用jQuery插件。但这种方法有一些弊端。这些插件大多都是在window对象的scroll事件上放置监听器。这会导致JavaScript需要处理大量的事件触发(处理scroll事件很容易造成浏览器性能问题,使用时需要非常小心。)移动不同的层,计算背景的位置,设置图片的属性,这都引起了大量的DOM操作。

简言之,使用JavaScript来实现视差效果会让页面的滚动出现性能问题,出现卡顿。

background-attachment属性回顾
background-attachment -- 定义背景图片随滚动轴的移动方式
取值: scroll | fixed | inherit
scroll: 随着页面的滚动轴背景图片将移动
fixed: 随着页面的滚动轴背景图片不会移动
inherit: 继承
初始值: scroll
继承性: 否
适用于: 所有元素
background:背景.attachment:附着.
示例

CSS Code复制内容到剪贴板
  1. body    
  2. {   
  3.  background-image:url('list-orange.png');   
  4.  background-attachment:fixed;   
  5.  background-repeat:repeat-x;   
  6.  background-position:center center;   
  7. }  

屏幕的背景图片为一条橙色线.随着滚动轴移动,橙色线的视觉位置不变.
CSS background-attachment 属性示例

使用background-attachment: fixed实现视差效果

为什么只有一小部分人知道,这种效果实际上可以用CSS实现。

为了实现视差效果,多个背景图片必须放置在不同的元素上。这些背景图需要定义成background-attachment: fixed。通过设定background-attachment,我们可以改变背景图像的效果和位置。

background-attachment的缺省值是scroll,也就是背景图片和内容的位置是相对静止的。这我们大家都见过,当我们上下滚动一个网页时,背景和内容一起滚动。

当把background-attachment设置成fixed时,事情会变得有趣。fixed是说背景图片不随内容一起滚动,而是跟窗口保持静止。也就是说,当你拖动滚动条时,背景图片没有变化。这就能够产生漂亮的视差效果。

让我看一个实际实现:

CSS Code复制内容到剪贴板
  1. <!-- Four containers for setting the background images -->   
  2. <div class="parallax">   
  3.   <div class="bg__foo">foo</div>   
  4.   <div class="bg__bar">bar</div>   
  5.   <div class="bg__baz">baz</div>   
  6.   <div class="bg__bazz">bazz</div>   
  7. </div>   
  8. // setting base styles to image containers   
  9. [class*="bg__"] {   
  10.   height: 50vh;   
  11.   
  12.   text-indent: -9999px;   
  13.   
  14.   /* fix background */  
  15.   background-attachmentfixed;   
  16.   
  17.   /* center it */  
  18.   background-positioncenter center;   
  19.   
  20.   /* Scale it nicely to the element */  
  21.   background-size: cover;   
  22.   
  23.   /* just make it look a bit better  */  
  24.   &:nth-child(2n) {   
  25.     box-shadow: inset 0 0 1em #111;   
  26.   }   
  27. }   
  28.   
  29. .bg__foo {   
  30.   background-imageurl(   
  31.     http://www.webhek.com/wordpress/wp-content/uploads/2014/07/parallax1.jpg   
  32.   );   
  33. }   
  34.   
  35. .bg__bar {   
  36.   background-imageurl(   
  37.     http://www.webhek.com/wordpress/wp-content/uploads/2014/07/parallax2.jpg   
  38.   );   
  39. }   
  40.   
  41. .bg__baz {   
  42.   background-imageurl(   
  43.     http://www.webhek.com/wordpress/wp-content/uploads/2014/07/parallax3.jpg   
  44.   );   
  45. }   
  46.   
  47. .bg__bazz {   
  48.   height: 100vh;   
  49.   
  50.   background-imageurl(   
  51.     http://www.webhek.com/wordpress/wp-content/uploads/2014/07/parallax1.jpg   
  52.   );   
  53. }  

关于这种技术的浏览器兼容情况,你可以参考这里,基本上,现代浏览器和IE9+的浏览器都支持。

观看演示

对我个人而言,我更喜欢CSS技术实现的视差效果,而不是用JavaScript。用CSS实现,是受浏览器原生支持,没有编程逻辑,没有对DOM额外的操作,使得整个方案非常的简洁漂亮。

即使是CSS实现的视差效果,也会给浏览器带来负担。

background-attachment: fixed会导致浏览器更多的渲染,也会影响浏览器滚动的效率。所以,开发时一定要多做测试,视性能情况而决定实现的效果。

HTML / CSS 相关文章推荐
CSS3中Animation属性的使用详解
Aug 06 HTML / CSS
纯HTML5+CSS3制作图片旋转
Jan 12 HTML / CSS
轻松掌握CSS3中的字体大小单位rem的使用方法
May 24 HTML / CSS
html5 web本地存储将取代我们的cookie
Dec 26 HTML / CSS
突袭HTML5之Javascript API扩展3—本地存储全新体验
Jan 31 HTML / CSS
html5中 media(播放器)的api使用指南
Dec 26 HTML / CSS
详解html5页面 rem 布局适配方法
Jan 12 HTML / CSS
HTML5声音录制/播放功能的实现代码
May 03 HTML / CSS
HTML5实现签到 功能
Oct 09 HTML / CSS
HTML5 客户端数据库简易使用:IndexedDB
Dec 19 HTML / CSS
CSS3通过var()和calc()函数实现动画特效
Mar 30 HTML / CSS
HTML通过表单实现酒店筛选功能
May 18 HTML / CSS
CSS3中的opacity属性使用教程
Aug 19 #HTML / CSS
实例讲解CSS3中的border-radius属性
Aug 18 #HTML / CSS
详解CSS3中使用gradient实现渐变效果的方法
Aug 18 #HTML / CSS
全方位了解CSS3的Regions扩展
Aug 07 #HTML / CSS
CSS3中Animation属性的使用详解
Aug 06 #HTML / CSS
利用CSS3的transition属性实现滑动效果
Aug 05 #HTML / CSS
详解CSS3中@media的实际使用
Aug 04 #HTML / CSS
You might like
15种PHP Encoder的比较
2007/04/17 PHP
PHP实现的XXTEA加密解密算法示例
2018/08/28 PHP
PHP连接及操作PostgreSQL数据库的方法详解
2019/01/30 PHP
js 实现无干扰阴影效果 简单好用(附文件下载)
2009/12/27 Javascript
jQuery学习笔记之DOM对象和jQuery对象
2010/12/22 Javascript
raphael.js绘制中国地图 地图绘制方法
2014/02/12 Javascript
Javascript基础教程之break和continue语句
2015/01/18 Javascript
jquery实现的3D旋转木马特效代码分享
2015/08/25 Javascript
js实现String.Fomat的实例代码
2016/09/02 Javascript
JS求解三元一次方程组值的方法
2017/01/03 Javascript
vue2.0 子组件改变props值,并向父组件传值的方法
2018/03/01 Javascript
创建echart多个联动的示例代码
2018/11/23 Javascript
JavaScript实现的3D旋转魔方动画效果实例代码
2019/07/31 Javascript
json解析大全 双引号、键值对不在一起的情况
2019/12/06 Javascript
记录微信小程序 height: calc(xx - xx);无效问题
2019/12/30 Javascript
JS实现横向轮播图(初级版)
2020/06/24 Javascript
微信小程序实现限制用户转发功能的实例代码
2020/02/22 Javascript
[01:04]DOTA2:伟大的Roshan雕塑震撼来临
2015/01/30 DOTA
[02:01]2018完美盛典-开场舞《双子星》
2018/12/16 DOTA
Python多线程编程(八):使用Event实现线程间通信
2015/04/05 Python
Python中Django框架下的staticfiles使用简介
2015/05/30 Python
python中的文件打开与关闭操作命令介绍
2018/04/26 Python
解决pycharm remote deployment 配置的问题
2019/06/27 Python
Django获取应用下的所有models的例子
2019/08/30 Python
python爬虫爬取监控教务系统的思路详解
2020/01/08 Python
python编写扎金花小程序的实例代码
2021/02/23 Python
阿联酋优惠券服务:Living Kool
2019/12/12 全球购物
linux面试相关问题
2013/04/28 面试题
函授自我鉴定
2013/11/06 职场文书
小学生打架检讨书
2014/01/26 职场文书
委托协议书范本
2014/04/22 职场文书
捐资助学感谢信
2015/01/21 职场文书
不同意离婚代理词
2015/05/23 职场文书
我是特种兵观后感
2015/06/11 职场文书
小学副班长竞选稿
2015/11/21 职场文书
教你用eclipse连接mysql数据库
2021/04/22 MySQL