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


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实现的几个小loading效果
Sep 27 HTML / CSS
HTML5 CSS3给网站设计带来出色效果
Jul 16 HTML / CSS
CSS3文本换行word-wrap解决英文文本超过固定宽度不换行
Oct 10 HTML / CSS
CSS3中currentColor关键字的妙用
Feb 27 HTML / CSS
CSS3之transition实现下划线的示例代码
May 30 HTML / CSS
利用CSS3的3D效果制作正方体
Mar 10 HTML / CSS
Html5上传图片 移动端、PC端通用代码
Jun 08 HTML / CSS
canvas绘制文本内容自动换行的实现代码
Jan 14 HTML / CSS
HTML5 语义化结构化规范化
Oct 17 HTML / CSS
html5-websocket基于远程方法调用的数据交互实现
Dec 04 HTML / CSS
Html5无刷新修改browser Url的方法
Jan 15 HTML / CSS
CSS使用伪类控制边框长度的方法
Jan 18 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学习笔记之二 php入门知识
2011/01/12 PHP
PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
2012/06/07 PHP
解析php session_set_save_handler 函数的用法(mysql)
2013/06/29 PHP
JavaScript this调用规则说明
2010/03/08 Javascript
javascript之Partial Application学习
2013/01/10 Javascript
Javascript判断文件是否存在(客户端/服务器端)
2014/09/16 Javascript
JS简单操作select和dropdownlist实例
2014/11/26 Javascript
原生javascript实现隔行换色
2015/01/04 Javascript
jQuery模拟黑客帝国矩阵效果实例
2015/06/28 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
2015/11/25 Javascript
JavaScript编写带旋转+线条干扰的验证码脚本实例
2016/05/30 Javascript
Active控件问题小结(附解决办法)
2016/06/09 Javascript
AngularJS入门教程之服务(Service)
2016/07/27 Javascript
Node.js学习之查询字符串解析querystring详解
2017/09/28 Javascript
JavaScript检查数据中是否存在相同的元素(两种方法)
2018/10/07 Javascript
js实现搜索栏效果
2018/11/16 Javascript
大转盘抽奖小程序版 转盘抽奖网页版
2020/04/16 Javascript
微信小程序实现左侧滑栏过程解析
2019/08/26 Javascript
JS实现可用滑块滑动的缓动图代码
2019/09/01 Javascript
jQuery实现消息弹出框效果
2019/12/10 jQuery
[08:40]Navi Vs Newbee
2018/06/07 DOTA
Python单链表的简单实现方法
2014/09/23 Python
在Python中封装GObject模块进行图形化程序编程的教程
2015/04/14 Python
python在Windows下安装setuptools(easy_install工具)步骤详解
2016/07/01 Python
python 实现登录网页的操作方法
2018/05/11 Python
python3 中文乱码与默认编码格式设定方法
2018/10/31 Python
python实现公司年会抽奖程序
2019/01/22 Python
国际书籍零售商:Wordery
2017/11/01 全球购物
销售工作人员的自我评价分享
2013/11/10 职场文书
婚礼秀策划方案
2014/05/19 职场文书
品牌服务方案
2014/06/03 职场文书
交通事故一次性赔偿协议书范本
2014/11/02 职场文书
办公用房租赁协议书
2014/11/29 职场文书
党员民主生活会材料
2014/12/15 职场文书
学校国庆节活动总结
2015/03/23 职场文书
Linux中一对多配置日志服务器的详细步骤
2022/07/23 Servers