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


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 相关文章推荐
Web页面中八种创建多列等高(等高列布局)的实现技术
Dec 24 HTML / CSS
CSS书写规范、顺序和命名规则
Mar 06 HTML / CSS
图解CSS3制作圆环形进度条的实例教程
May 26 HTML / CSS
结合 CSS3 transition transform 实现简单的跑马灯效果的示例
Feb 07 HTML / CSS
利用CSS3 动画 绘画 圆形动态时钟
Mar 20 HTML / CSS
CSS3实现网站商品展示效果图
Jan 18 HTML / CSS
详解CSS3 filter:drop-shadow滤镜与box-shadow区别与应用
Aug 24 HTML / CSS
鲜为人知的HTML5语音合成功能
May 17 HTML / CSS
移动端html5 meta标签的神奇功效
Jan 06 HTML / CSS
CSS3 画基本图形,圆形、椭圆形、三角形等
Sep 20 HTML / CSS
使用CSS连接数据库的方式
Feb 28 HTML / CSS
css让页脚保持在底部位置的四种方案
Jul 23 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 开源AJAX框架14种
2009/08/24 PHP
PHP程序员必须清楚的问题汇总
2014/12/18 PHP
php设计模式之单例模式用法经典示例分析
2019/09/20 PHP
解决Laravel自定义类引入和命名空间的问题
2019/10/15 PHP
JavaScript 特殊字符
2007/04/05 Javascript
javascript学习(二)javascript常见问题总结
2013/01/02 Javascript
基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解
2013/05/07 Javascript
jquery中prop()方法和attr()方法的区别浅析
2013/09/06 Javascript
js使用for循环与innerHTML获取选中tr下td值
2014/09/26 Javascript
javascript实现PC网页里的拖拽效果
2016/03/14 Javascript
基于jQuery插件jqzoom实现的图片放大镜效果示例
2017/01/23 Javascript
webpack构建react多页面应用详解
2017/09/15 Javascript
Angular 4根据组件名称动态创建出组件的方法教程
2017/11/01 Javascript
Vue2仿淘宝实现省市区三级联动
2020/04/15 Javascript
JS中的BOM应用
2018/02/02 Javascript
Javascript中parseInt的正确使用方式
2018/10/17 Javascript
详解Vue2 添加对scss的支持
2019/01/02 Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
2019/05/23 Javascript
JS实现数组删除指定元素功能示例
2019/06/05 Javascript
layui实现数据分页功能
2019/07/27 Javascript
使用Vue实现调用接口加载页面初始数据
2019/10/28 Javascript
Python 查找list中的某个元素的所有的下标方法
2018/06/27 Python
对python xlrd读取datetime类型数据的方法详解
2018/12/26 Python
python通过paramiko复制远程文件及文件目录到本地
2019/04/30 Python
python图形绘制奥运五环实例讲解
2019/09/14 Python
使用python3批量下载rbsp数据的示例代码
2019/12/20 Python
Python 实现黑客帝国中的字符雨的示例代码
2020/02/20 Python
在python中使用nohup命令说明
2020/04/16 Python
Django框架请求生命周期实现原理
2020/11/13 Python
基于Django集成CAS实现流程详解
2020/11/28 Python
Ajax的工作原理
2015/12/04 面试题
应届毕业生专业个人求职自荐信格式
2013/11/20 职场文书
小学生家长评语集锦
2014/01/30 职场文书
小学校园广播稿(3篇)
2014/09/19 职场文书
2014年“世界无车日”活动方案
2014/09/21 职场文书
杨善洲观后感
2015/06/04 职场文书