详解三种方式实现平滑滚动页面到顶部的功能


Posted in HTML / CSS onApril 23, 2019

背景

最近开发公司的公众号H5,做了一个点击icon滚动到顶部的功能。实现功能比较简单,直接调用window.scrollTo(0, 0),一行代码完成。但是作为一个攻城狮,怎么可能对自己要求这么低,所以我给自己加了个需求,实现 平滑滚动页面到顶部 的功能。经过调研和查看文档,有了以下三种方案。

1.使用CSS

完成功能的最高境界,只用CSS就搞定。代码如下:

html {
    scroll-behavior: smooth;
}

该样式的作用是为有滚动条的元素指定一个滚动的行为,但是只有在当用户手动导航或者 CSSOM scrolling API触发滚动的时候生效,不影响用户行为产生的滚动。就在我庆祝的时候,打开can i use看了下兼容性:

详解三种方式实现平滑滚动页面到顶部的功能

日了狗,还是老老实实用JS实现吧。

2.使用Window.scrollTo API

我们都知道window.scrollTo(x, y),通过传入文档中的x,y轴坐标来实现滚动到页面某个位置的功能。这个API其实还可以传入一个option,是一个对象,left值对应坐标中的x,top对应坐标中的y,还有一个值为behavior,可以让你自定义滚动行为,然后我们这样来实现滚动到顶部:

window.scrollTo({
    left: 0,
    top: 0,
    behavior: 'smooth'
})

真香,搞定。过了几天,产品经理扛着5米大刀来找我,说在Safari上滚动效果奇怪,体检极差。于是我默默打开了MDN文档,滚动到底部:

详解三种方式实现平滑滚动页面到顶部的功能

看到了这张图,虽然API浏览器都几乎支持,但是option选项在Safari上直接挂掉,于是我又打开了stackoverflow,总结了终极方案。

3.使用requestAnimationFrame

经常能看到大名鼎鼎的requestAnimationFrame,但是没机会用上,这次可以尝尝鲜了。我们知道requestAnimationFrame的作用就是告诉浏览器在下次重绘之前执行传入的回调函数,这个行为是浏览器自动帮你做的。于是有了如下代码:

const scrollToTop = () => {
    let scrollTop = document.documentElement.scrollTo || document.body.scrollTop
    if (scrollTop > 0) {
        window.requestAnimationFrame(scrollTop)
        window.scrollTop(0, scrollTop - scrollTo / 8)
    }
}

Done!!!Perfect!!!雀跃的同时,我还是打开了can i use查看了requestAnimationFrame的兼容性:

详解三种方式实现平滑滚动页面到顶部的功能

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
浅析两列自适应布局的3种思路
May 03 HTML / CSS
使用css3制作登录表单的步骤
Apr 07 HTML / CSS
一款简洁的纯css3代码实现的动画导航
Oct 31 HTML / CSS
一款CSS3实现多功能下拉菜单(带分享按)的教程
Nov 05 HTML / CSS
详解CSS3阴影 box-shadow的使用和技巧总结
Dec 03 HTML / CSS
CSS3实现伪类hover离开时平滑过渡效果示例
Aug 10 HTML / CSS
css3中less实现文字长阴影(long shadow)
Apr 24 HTML / CSS
详解FireFox下Canvas使用图像合成绘制SVG的Bug
Jul 10 HTML / CSS
深入解析HTML5使用SVG图像时的viewBox属性用法
Sep 02 HTML / CSS
html5中canvas图表实现柱状图的示例
Nov 13 HTML / CSS
解锁canvas导出图片跨域的N种姿势小结
Jan 24 HTML / CSS
css display table 自适应高度、宽度问题的解决
May 07 HTML / CSS
小程序canvas中文字设置居中锚点
Apr 16 #HTML / CSS
用canvas做一个DVD待机动画的实现代码
Apr 12 #HTML / CSS
Html5适配iphoneX刘海屏的简单实现
Apr 09 #HTML / CSS
html5唤醒APP小记
Mar 27 #HTML / CSS
html5录音功能实战示例
Mar 25 #HTML / CSS
浅析HTML5中的download属性使用
Mar 13 #HTML / CSS
手把手教你实现一个canvas智绘画板的方法
Mar 04 #HTML / CSS
You might like
PHP 七大优势分析
2009/06/23 PHP
php curl登陆qq后获取用户信息时证书错误
2015/02/03 PHP
PHP中JSON的应用技巧
2015/10/10 PHP
php+ajax实现带进度条的上传图片功能【附demo源码下载】
2016/09/14 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
2016/12/23 PHP
jQuery插件原来如此简单 jQuery插件的机制及实战
2012/02/07 Javascript
图片上传判断及预览脚本的效果实例
2013/08/07 Javascript
location.href用法总结(最主要的)
2013/12/27 Javascript
返回顶部按钮响应滚动且动态显示与隐藏
2014/10/14 Javascript
JQuery创建DOM节点的方法
2015/06/11 Javascript
jQuery+HTML5实现图片上传前预览效果
2015/08/20 Javascript
Angularjs实现多个页面共享数据的方式
2016/03/29 Javascript
json与jsonp知识小结(推荐)
2016/08/16 Javascript
jQuery层次选择器用法示例
2016/09/09 Javascript
JavaScript仿微信(电话)联系人列表滑动字母索引实例讲解(推荐)
2017/08/16 Javascript
Vue组件库发布到npm详解
2018/02/17 Javascript
vue 1.0 结合animate.css定义动画效果
2018/07/11 Javascript
python利用beautifulSoup实现爬虫
2014/09/29 Python
Python+PIL实现支付宝AR红包
2018/02/09 Python
基于python log取对数详解
2018/06/08 Python
python将控制台输出保存至文件的方法
2019/01/07 Python
如何用Python来搭建一个简单的推荐系统
2019/08/07 Python
HTML5 canvas画图并保存成图片的jcanvas插件
2014/01/17 HTML / CSS
localStorage、sessionStorage使用总结
2017/11/17 HTML / CSS
区域销售经理岗位职责
2013/12/10 职场文书
计算机专业优秀大学生自我总结
2014/01/21 职场文书
机工车间主任岗位职责
2014/03/05 职场文书
三字经教学反思
2014/04/26 职场文书
共产党员批评与自我批评
2014/10/15 职场文书
办公室年度工作总结2015
2015/05/21 职场文书
春节晚会开场白
2015/05/29 职场文书
搞笑欢迎词大全
2015/09/30 职场文书
2016年“我们的节日·重阳节”主题活动总结
2016/04/01 职场文书
python实现高效的遗传算法
2021/04/07 Python
微软Win11有哪些隐藏功能? windows11多个功能汇总
2021/11/21 数码科技
Pygame游戏开发之太空射击实战敌人精灵篇
2022/08/05 Python