当前位置: 首页 > Web前端 > CSS

滚动视差让你不相信“眼见为实”

时间:2023-03-31 13:03:27 CSS

介绍视差滚动(ParallaxScrolling)是指让多层背景以不同的速度移动,形成三维运动效果。其实这项技术早在2013年就已经在国外的一些网站上广泛使用了,因为它给网站带来了非常好的视觉体验,所以无数的网站都应用了这项技术。在最近的一个项目中用到了这块,觉得有必要整理一下。本文主要简单介绍什么是视差滚动,如何实现,以及如何在现有框架(vue/react)中使用视差滚动。什么是视差滚动?视差效应,原本是个天文名词。当我们仰望星空时,远处的星星移动得更慢,而更近的星星移动得更快。当我们坐在车里看着窗外时,我们也有同样的感觉。远处的群山似乎没有动静,近处的稻田飞快地掠过。许多游戏使用视差效果为场景添加三维度。简单来说,当滚动屏幕时,网页中元素的位置会发生变化。但是,不同元素的位置变化速度不同,导致网页中出现元素分层的错觉。看完上面这段话,相信你对视差滚动的概念有了初步的了解。下面我们就来看看如何用css实现视差滚动。css实现css中主要有两种实现方式:分别通过background-attachment:fixed和transform:translate3d。我们来看看具体的实现方式:background-attachment:fixed正常业务开发中可能用不到background-attachment,我们先来认识一下。background-attachmentCSS属性确定背景图像的位置是固定在视口内,还是随包含块滚动。它具有三个属性:fixed:该关键字表示背景相对于视口是固定的。即使元素有滚动机制,背景也不会随着元素的内容滚动。local:该关键字表示背景相对于元素的内容是固定的。如果一个元素有滚动机制,背景将随着元素的内容滚动。scroll:这个关键字表示背景相对于元素本身是固定的,而不是随着它的内容滚动。我们使用background-attachment:fixed来实际显示偏差滚动,看一下示例://html1

2
divclass="a-text">3
4
567//css$img1:'https://images.pexels.com/photos/1097491/pexels-photo-1097491.jpeg';$img2:'https://images.pexels.com/photos/2437299/pexels-photo-2437299.jpeg';$img3:'https://images.pexels.com/photos/1005417/pexels-photo-1005417.jpeg';div{高度:100vh;背景:rgba(0,0,0,.7);颜色:#fff;行高:100vh;文本对齐:居中;font-size:20vh;}.a-img1{background-image:url($img1);背景附件:已修复;背景尺寸:封面;背景位置:中心中心;}.a-img2{背景图像:url($img2);背景附件:已修复;背景尺寸:封面;背景-position:centercenter;}.a-img3{背景图片:url($img3);背景附件:已修复;背景尺寸:封面;background-position:centercenter;}效果如下:当然可以直接去这里查看:https://codepen.io/jack-cool/pen/MWYogYQtransform:translate3d同样的,我们来看看两个概念transform和perspectivetransform:css3属性,可以对元素进行变换(2d/3d),包括translationtranslate,rotationrotate,zoomscale等perspective:css3属性,当元素涉及到3D变换时,perspective可以定义3D立体效果我们眼睛看到的,也就是空间感我们来看例子:htmlonetwothree//csshtml{overflow:hidden;height:100%}body{perspective:1px;变换样式:保留3d;高度:100%;溢出-y:滚动;x:隐藏;}#app{宽度:100vw;高度:200vh;背景:天蓝色;填充顶部:100px;}.one{宽度:500px;高度:200px;背景:#409eff;margin-bottom:50px;}.two{宽度:500px;高度:200px;背景:#67c23a;变换:translateZ(-1px);margin-bottom:150px;}.three{宽度:500px;:#e6a23c;变换:translateZ(-2px);margin-bottom:150px;}效果如下:当然可以直接去这里查看:https://codepen.io/jack-cool/pen/zYxzOpb这里说明一下使用transform:translate3d来实现视差滚动的原理:1.为容器设置transform-style:preserve-3d和perspective:xpx,那么这个容器下的子元素就会在3D空间中;2.分别设置子元素不同的transform:translateZ(),此时不同的子元素在3DZ轴方向上离屏幕的距离不同;3、滚动滚动条,由于子元素设置了不同的transform:translateZ(),那么它们上下滚动的距离相对于translateY的屏幕(我们的眼睛)也是不同的,从而达到了滚动视差的效果。总结就是:父容器设置transform-style:preserve-3d和perspective:xpx,子元素设置不同的transform:translateZ()看完了用css实现滚动视差的两种方式,下面看看如何应用现有框架(vue/react)中的滚动视差。在vue或react中使用在react中使用React-parallax可以在react中使用,代码示例:importReactfrom"react";import{render}from"react-dom";import{Parallax}from"react-parallax";从“./Introduction”导入介绍;conststyles={fontFamily:"sans-serif",textAlign:"center"};constinsideStyles={background:"white",padding:20,position:"absolute",top:"50%",left:"50%",transform:"translate(-50%,-50%)"};constimage1="https://images.pexels.com/photos/830891/pexels-photo-830891.jpeg";constimage2="https://images.pexels.com/photos/1236701/pexels-photo-1236701.jpeg";constimage3="https://images.pexels.com/photos/3210189/pexels-photo-3210189.jpeg";constimage4="https://images.pexels.com/photos/2437299/pexels-photo-2437299.jpeg";constApp=()=>(视差内的HTML

|||

动态模糊

|||

反转方向

|||

(
)}>renderProp

{"\u2728"}

);render(,document.getElementById("root"));效果如下:当然更多细节可以查看:https://codesandbox.io/s/react-parallax-zw5govue可以在vue中使用vue-parallax,代码示例:效果如下:当然,更多细节可以查看:https://codesandbox.io/s/vue-parallaxjs-ljh9g最后大家可以关注我的名字公众号【前端森林】,在这里我会定期发布一些前端相关的前端文章和日常开发过程中的实用总结当然我也是一个活跃的开源社区贡献者,github地址https://github.com/Cosen95,欢迎star!!!