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


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编写类似iOS中的复选框及带开关的按钮
Apr 11 HTML / CSS
CSS3 linear-gradient线性渐变生成加号和减号的方法
Nov 21 HTML / CSS
结合 CSS3 transition transform 实现简单的跑马灯效果的示例
Feb 07 HTML / CSS
HTML5 Canvas实现文本对齐的方法总结
Mar 24 HTML / CSS
HTML5 Canvas概述
Aug 26 HTML / CSS
html5的canvas元素使用方法介绍(画矩形、画折线、圆形)
Apr 14 HTML / CSS
HTML5的hidden属性兼容老浏览器的方法
Apr 23 HTML / CSS
HTML5头部标签的一些常用信息小结
Oct 23 HTML / CSS
html5开发三八女王节表白神器
Mar 07 HTML / CSS
5分钟实现Canvas鼠标跟随动画背景
Nov 18 HTML / CSS
html5自定义video标签的海报与播放按钮功能
Dec 04 HTML / CSS
html+css合并表格边框的示例代码
Mar 31 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
关于PHPDocument 代码注释规范的总结
2013/06/25 PHP
详解PHP处理密码的几种方式
2016/11/30 PHP
设定php简写功能的方法
2019/11/28 PHP
PHP的重载使用魔术方法代码实例详解
2021/02/26 PHP
在b/s开发中经常用到的javaScript技术
2006/08/23 Javascript
关于捕获用户何时点击window.onbeforeunload的取消事件
2011/03/06 Javascript
javascript开发随笔一 preventDefault的必要
2011/11/25 Javascript
IE下写xml文件的两种方式(fso/saveAs)
2013/08/05 Javascript
javascript文件中引用依赖的js文件的方法
2014/03/17 Javascript
基于JavaScript实现定时跳转到指定页面
2016/01/01 Javascript
JS实现图片上传预览功能
2016/11/21 Javascript
JS实现的RGB网页颜色在线取色器完整实例
2016/12/21 Javascript
微信小程序 开发经验整理
2017/02/15 Javascript
javascript设计模式之中介者模式学习笔记
2017/02/15 Javascript
JavaScript中this的用法及this在不同应用场景的作用解析
2017/04/13 Javascript
从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例
2017/04/13 Javascript
mac下的nodejs环境安装的步骤
2017/05/24 NodeJs
node.js爬取中关村的在线电瓶车信息
2018/11/13 Javascript
Vue实现验证码功能
2019/12/03 Javascript
JavaScript实现猜数字游戏
2020/05/20 Javascript
Python基于numpy灵活定义神经网络结构的方法
2017/08/19 Python
Python3获取拉勾网招聘信息的方法实例
2019/04/03 Python
python 判断三个数字中的最大值实例代码
2019/07/24 Python
基于Python实现船舶的MMSI的获取(推荐)
2019/10/21 Python
python实现飞机大战小游戏
2019/11/08 Python
Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
2020/06/30 Python
Schutz鞋官方网站:Schutz Shoes
2017/12/13 全球购物
当当网官方旗舰店:中国图书销售夺金品牌
2018/04/02 全球购物
建筑专业毕业生推荐信
2013/11/21 职场文书
2014党员四风对照检查材料思想汇报
2014/09/17 职场文书
2015年宣传工作总结
2015/04/08 职场文书
小学工作总结2015
2015/05/04 职场文书
2015年艾滋病防治工作总结
2015/05/22 职场文书
离婚案件上诉状
2015/05/23 职场文书
python数字类型和占位符详情
2022/03/13 Python
Win11安全功能升级:内置防网络钓鱼功能
2022/04/08 数码科技