这是我参与更文挑战的第29天,活动详情查看: 更文挑战
前言
大家深夜好哇!每到夜深人静的时候,就是我文思泉涌的时候,今天我们来谈谈css实现的“视差滚动”效果。
说起视差滚动,我之前听都没听说过,更别说用过了,偶尔有文章提到视差滚动,就觉得好像很高大上一样。其实了解之后,不就是页面滚动时不同的元素滚动的速率不同嘛!
好了,今天我们就用css来简单的实现一下视差滚动~
构思
首先,我的构思效果是上中下三个DOM元素,分别是文字1、图片、文字2,图片的滚动速率是正常的,文字1的滚动速率 < 文字2的滚动速率 < 图片的滚动速率。
以这个构思来说,我搭建了基础的页面DOM结构如下:
<style>
.box {
margin: 300px auto;
width: 600px;
height: 600px;
background: url("./namei.png") no-repeat center;
overflow-x: hidden;
overflow-y: auto;
}
img{
display: block;
height: 100px;
margin: auto;
}
p{
font-size: 60px;
font-weight: bold;
color: #333;
}
</style>
<div class="box">
<div class="top">
<p>你好呀,我是南极大冰块~目前是一名在线掘金高级摸鱼师~</p>
</div>
<img src="./qb.gif" alt="">
<div class="bottom">
<p>你好呀,我是南极大冰块~目前是一名在线掘金高级摸鱼师,精通摸鱼、划水、坐着睡觉、拍马屁、吹牛、甩锅、吵架等前端开发必备技能~关注我,一起学习好玩的前端知识吧!</p>
</div>
</div>
复制代码
运行效果如下:
如果是js的话,我们可以监听页面滚动的距离,然后手动去调整每个DOM元素的滚动速率,但是我们该怎么用css改变DOM元素滚动的速率呢?
答案很简单,它就是年度最佳css属性、救场王、人称万能的——transform
!
你一定经常使用transform: translate();
,但是我们更多的是使用它的2D效果,但它其实更强大的是3D变形~
当我们给元素设置transform: translateZ(-1px);
时,就相当于这个元素离我们远了1倍,比如我们现在给.bottom
元素加上transform: translateZ(-1px);
之后,可看到如下效果:
当当当当~ 没有任何效果!
这是为什么呢?这是因为.bottom
元素并没有获得透视的效果,所以transform: translateZ(-1px);
看起来并没有生效。
我们可以用perspective
来给.bottom
元素添加透视效果。perspective
说明如下:
为元素定义
perspective
属性时,其子元素会获得透视效果,而不是元素本身。属性值可设置为number,表示元素距离视图的距离,以像素计。
所以这时候我们给.box
元素添加perspective: 1px;
即可,效果如下:
当当当当~ transform: translateZ(-1px);
生效啦,字小了一倍。
这时候,我们可以想到,字小了一倍是因为.bottom
元素离我们远了一倍,那么滚动的时候,页面滚动100px
,实际上.bottom
元素滚动的只会是50px
,不同元素滚动的速率不同的问题迎刃而解了!
根据这个思路,我们把代码完善如下:
<style>
.box {
margin: 300px auto;
width: 600px;
height: 600px;
background: url("./namei.png") no-repeat center;
overflow-x: hidden;
overflow-y: auto;
perspective: 1px;
}
.top{
height: 500px;
transform: translateZ(-3px);
}
img{
display: block;
height: 100px;
margin: auto;
}
.bottom{
height: 800px;
transform: translateZ(-1px);
}
p{
font-size: 60px;
font-weight: bold;
color: #333;
}
</style>
<div class="box">
<div class="top">
<p>你好呀,我是南极大冰块~目前是一名在线掘金高级摸鱼师~</p>
</div>
<img src="./qb.gif" alt="">
<div class="bottom">
<p>你好呀,我是南极大冰块~目前是一名在线掘金高级摸鱼师,精通摸鱼、划水、坐着睡觉、拍马屁、吹牛、甩锅、吵架等前端开发必备技能~关注我,一起学习好玩的前端知识吧!</p>
</div>
</div>
复制代码
运行效果如下所示:
完美达到预期:文字1的滚动速率 < 文字2的滚动速率 < 图片的滚动速率
后记
今天是我坚持日更的第二十八天,最近老是加班,每天除了上班、通勤、吃饭、遛狗之外,只有7、8个小时的样子,可是我还是挤出时间做到了每日更文。
嗐~ 一个人真心想做一件事,怎么会觉得难呢?
每天输出一点点,进步一点点。日拱一卒,功不唐捐。大家也要一起加油呀~ 嘻嘻~
如果本文对你有帮助,别再只是悄悄收藏啦!大胆点儿,比如点个赞呀,关注大冰块呀,一起和大冰块学习更多好玩的技术博客吧!
更文挑战的文章目录如下:
- 2021.06.01 《多图预警!详细谈谈Flex布局的容器元素和项目元素的属性~》
- 2021.06.02 《如何把css渐变背景玩出花样来》
- 2021.06.03 《如何使用SVG制作沿任意路径排布的文字效果》
- 2021.06.04 《3大类15小类前端代码规范,让团队代码统一规范起来!》
- 2021.06.05 《团队管理之git提交规范:大家竟然都不会写commit记录?| 周末学习》
- 2021.06.06 《如何控制css鼠标样式以及扩大鼠标点击区域 | 周末学习》
- 2021.06.07 《纯css实现:仿掘金账户密码登录时,小熊猫捂眼动作切换的小彩蛋》
- 2021.06.08 《从11个方面详细谈谈原型和原型链》
- 2021.06.09 《深入谈谈JavaScript的作用域及作用域链》
- 2021.06.10 《JavaScript中的闭包究竟是什么》
- 2021.06.11 《纯css实现:炫酷的视频文本蒙版效果》
- 2021.06.12 《申请一个免费的毒鸡汤api,并且用原生JS实现竖行文本的打字机效果》
- 2021.06.13 《纯css实现:多行文本框内的斑马条纹效果》
- 2021.06.14 《原生JS实现触摸滑动监听事件》
- 2021.06.15 《原生JS实现鼠标滚轮触发页面横向滚动》
- 2021.06.16 《原生JS实现跳转或刷新页面时,浏览器提示当前页面未保存》
- 2021.06.17 《原生JS的三大基础弹框探究》
- 2021.06.18 《纯css实现:固定在页面底部的按钮》
- 2021.06.19 《纯css实现:单行文本的打字机动画效果》
- 2021.06.20 《纯css实现:如何做个完美的平行四边形》
- 2021.06.21 《谈谈基于JS实现阻止别人调试通过控制台调试网站的问题》
- 2021.06.22 《纯css实现:文字被颜色逐渐填满的特效》
- 2021.06.23 《h5实现一个刮刮卡的动画效果》
- 2021.06.24 《纯css实现:文字可换行的下划线、波浪线等效果》
- 2021.06.25 《实现多行文字被颜色逐渐填满的特效》
- 2021.06.26 《纯css实现:一起来从0到1画个路灯吧》
- 2021.06.27 《纯css实现:理发店门口的转灯效果》
- 2021.06.28 《聊聊css中文字的换行问题》)