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


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背景渐变中的透明度来设置不同颜色的背景渐变
Mar 31 HTML / CSS
IE8下CSS3选择器nth-child() 不兼容问题的解决方法
Nov 16 HTML / CSS
HTML5等待加载动画效果
Jul 27 HTML / CSS
HTML5的结构和语义(2):结构
Oct 17 HTML / CSS
HTML5 canvas绘制的玫瑰花效果
May 29 HTML / CSS
HTML5响应式(自适应)网页设计的实现
Nov 17 HTML / CSS
浅谈Html5多线程开发之WebWorkers
May 02 HTML / CSS
详解window.open被浏览器拦截的解决方案
Jul 18 HTML / CSS
html table呈现个人简历以及单元格宽度失效的问题解决
Jan 22 HTML / CSS
background-position百分比原理详解
May 08 HTML / CSS
html输入两个数实现加减乘除功能
Jul 01 HTML / CSS
HTML5页面打开微信小程序功能实现
Sep 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
使用数据库保存session的方法
2006/10/09 PHP
PHP set_time_limit(0)长连接的实现分析
2010/03/02 PHP
PHP采用get获取url汉字出现乱码的解决方法
2014/11/13 PHP
手把手编写PHP框架 深入了解MVC运行流程
2016/09/19 PHP
PHP获取数组中指定的一列实例
2017/12/27 PHP
php操作redis数据库常见方法实例总结
2020/02/20 PHP
基于jquery的仿百度搜索框效果代码
2011/04/11 Javascript
高性能Javascript笔记 数据的存储与访问性能优化
2012/08/02 Javascript
javascript实现限制上传文件大小
2015/02/06 Javascript
BootStrap实用代码片段之一
2016/03/22 Javascript
jQuery简单实现列表隐藏和显示效果示例
2016/09/12 Javascript
touch.js 拖动、缩放、旋转 (鼠标手势)功能代码
2017/02/04 Javascript
xmlplus组件设计系列之列表(4)
2017/04/26 Javascript
详解Vue.js分发之作用域槽
2017/06/13 Javascript
谈谈对vue响应式数据更新的误解
2017/08/01 Javascript
使用ef6创建oracle数据库的实体模型遇到的问题及解决方案
2017/11/09 Javascript
JavaScript实现职责链模式概述
2018/01/25 Javascript
JavaScript实现新年倒计时效果
2018/11/17 Javascript
vue组件文档(.md)中如何自动导入示例(.vue)详解
2019/01/25 Javascript
JQuery的加载和选择器用法简单示例
2019/05/13 jQuery
Elasticsearch实现复合查询高亮结果功能
2019/09/10 Javascript
vue实现权限控制路由(vue-router 动态添加路由)
2019/11/04 Javascript
如何在wxml中直接写js代码(wxs)
2019/11/14 Javascript
python输入错误密码用户锁定实现方法
2017/11/27 Python
python模块smtplib实现纯文本邮件发送功能
2018/05/22 Python
用python脚本24小时刷浏览器的访问量方法
2018/12/07 Python
Python判断一个文件夹内哪些文件是图片的实例
2018/12/07 Python
python 缺失值处理的方法(Imputation)
2019/07/02 Python
Python API 操作Hadoop hdfs详解
2020/06/06 Python
Etam艾格英国官网:法国著名女装品牌
2019/04/15 全球购物
行政管理专业推荐信
2013/11/02 职场文书
数学专业推荐信范文
2013/11/21 职场文书
文言文形式的学生求职信
2013/12/03 职场文书
乡镇交通安全实施方案
2014/03/29 职场文书
小学生民族团结演讲稿
2014/08/27 职场文书
贷款担保书范本
2015/09/22 职场文书