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


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 相关文章推荐
CSS3 制作旋转的大风车(充满童年回忆)
Jan 30 HTML / CSS
CSS3实现的文本3D效果附图
Sep 03 HTML / CSS
html5 Canvas画图教程(10)—把面拆成线条模拟出圆角矩形
Jan 09 HTML / CSS
HTML5全屏(Fullscreen)API详细介绍
Apr 24 HTML / CSS
基于html5 DeviceOrientation 实现微信摇一摇功能
Sep 25 HTML / CSS
Html5 Geolocation获取地理位置信息实例
Dec 09 HTML / CSS
使用canvas生成含有微信头像的邀请海报没有微信头像问题
Oct 29 HTML / CSS
五分钟学会HTML5的WebSocket协议
Nov 22 HTML / CSS
Canvas实现放大镜效果完整案例分析(附代码)
Nov 26 HTML / CSS
纯html+css实现Element loading效果
Aug 02 HTML / CSS
能用CSS实现的就不要麻烦JavaScript了
Oct 05 HTML / CSS
flex弹性布局详解
Mar 20 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
Blitz templates 最快的PHP模板引擎
2010/04/06 PHP
php在数组中查找指定值的方法
2015/03/17 PHP
PHP的自定义模板引擎
2017/03/24 PHP
Yii Framework框架使用PHPExcel组件的方法示例
2019/07/24 PHP
js中的值类型和引用类型小结 文字说明与实例
2010/12/12 Javascript
JS实现动态移动层及拖动浮层关闭的方法
2015/04/30 Javascript
jQuery+ajax实现无刷新级联菜单示例
2015/05/21 Javascript
学JavaScript七大注意事项【必看】
2016/05/04 Javascript
JavaScript解八皇后问题的方法总结
2016/06/12 Javascript
JQuery EasyUI学习教程之datagrid 添加、修改、删除操作
2016/07/09 Javascript
JS正则表达式验证中文字符
2017/05/08 Javascript
Bootstrap 模态框(Modal)带参数传值实例
2017/08/20 Javascript
js中时间格式化的几种方法
2018/07/22 Javascript
浅谈VUE单页应用首屏加载速度优化方案
2018/08/28 Javascript
koa-router源码学习小结
2018/09/07 Javascript
Iview Table组件中各种组件扩展的使用
2018/10/20 Javascript
vue在index.html中引入静态文件不生效问题及解决方法
2019/04/29 Javascript
vue-cli点击实现全屏功能
2020/03/07 Javascript
[01:59][TI9趣味视频] 全明星赛奖励
2019/08/23 DOTA
python安装以及IDE的配置教程
2015/04/29 Python
Pandas之Fillna填充缺失数据的方法
2019/06/25 Python
python单向循环链表原理与实现方法示例
2019/12/03 Python
如何基于python操作excel并获取内容
2019/12/24 Python
英国最大的体育&时尚零售公司:JD Sports
2017/12/13 全球购物
华纳兄弟工作室的官方授权商店:WB Shop
2018/11/30 全球购物
大学生饮食配送创业计划书
2014/01/04 职场文书
元旦联欢会策划方案
2014/06/11 职场文书
建筑学专业自荐书
2014/07/09 职场文书
综治工作心得体会
2014/09/11 职场文书
高校群众路线教育实践活动剖析材料
2014/10/10 职场文书
党的群众路线教育实践活动心得体会(企业)
2014/11/03 职场文书
保送生自荐信
2015/03/06 职场文书
护士求职自荐信
2015/03/25 职场文书
女性健康知识讲座主持词
2015/07/04 职场文书
话题作文之成长
2019/12/09 职场文书
nginx实现动静分离的方法示例
2021/11/07 Servers