原生JS实现平滑回到顶部组件


Posted in Javascript onMarch 16, 2016

返回顶部组件是一种极其常见的网页功能,需求简单:页面滚动一定距离后,显示返回顶部的按钮,点击该按钮可以将滚动条滚回至页面开始的位置。

实现思路也很容易,只要改变document.documentElement.scrollTop或document.body.scrollTop的值即可。

本文抛弃所有加速减速的酷炫效果,回归软件的本质,提供一个最简洁的实现,只追求实用性,不追求所谓的用户体验,效果如下

原生JS实现平滑回到顶部组件

由于思路跟代码都很简单,所以就直接贴出实现细节了:

var BackTop = function (domE,distance) {
if (!domE) return;
var _onscroll = window.onscroll,
_onclick = domE.onclick;
window.onscroll = throttle(function(){
typeof _onscroll === 'function' && _onscroll.apply(this, arguments);
toggleDomE();
},100);
domE.onclick = function(){
typeof _onclick === 'function' && _onclick.apply(this, arguments);
document.documentElement.scrollTop = 0;
document.body.scrollTop = 0;
};
function toggleDomE(){
domE.style.display = (document.documentElement.scrollTop || document.body.scrollTop) > (distance || 500) ? 'block' : 'none';
}
function throttle(func, wait) {
var timer = null;
return function () {
var self = this, args = arguments;
if (timer) clearTimeout(timer);
timer = setTimeout(function () {
return typeof func === 'function' && func.apply(self, args);
}, wait);
}
}
};

调用方式:

<script>
new BackTop(document.getElementById('backTop'))
</script>

之所以写这篇博客,弄这么个简单的东西,有两个方面的原因:

1)这段时间一直在手写一些常见的简单组件,这算是一个简单中更简单的一个,为了让这系列的博客更加完整,所以把这个组件补充了进来;

2)我想表达自己在工作过程中的一个观点:就是不要过渡用用户体验来装饰你的软件或者说产品,用户体验这个东西说白了就是两个词,一个是好印象,第二个就是好玩,但这并不是产品开发运营的最终目的,你把东西做的再漂亮,产品的核心价值和服务做的不够的话,就算把返回顶部这种功能做成超级无敌的火箭也是徒劳无功的。做前端开发,得锻炼点控制产品经理瞎提用户体验功能的度,以这个组件来说,我认为做加速或减速效果都是多余的,既增加开发时间,又耽误用户使用的时间,抛弃自己心中那点对技术玩弄的固执,可以让自己的工作做的更加完美。

下面给大家分享几种常用网页返回顶部代码

一、使用HTML的锚标记最简单了

但是唯一的缺点就是样式不怎么样,会显示这个锚标记。

<aname="top"id="top"></a>

放置位置在<body>标签之后随便找个地方放都可以,只要靠近顶部即可。

页面底部放置:

<ahref="#top"target="_self">返回顶部</a>

二、使用Javascript Scroll函数返回顶部

scrooll函数用来控制滚动条的位置,有两种很简单的实现方式:

方式1(推荐:简单方便):

<ahref="javascript:scroll(0,0)">返回顶部</a>

scroll第一个参数是水平位置,第二个参数是垂直位置,比如要想定位在垂直50像素处,改成scroll(0,50)就可以了。

方式2(注重效果:缓慢向上):

本方式是渐进式返回顶部,要好看一些,代码如下:

functionpageScroll() {window.scrollBy(0,-10);scrolldelay=setTimeout('pageScroll()',100);}<ahref="pageScroll();">返回顶部</a>

这样就会动态返回顶部,不过虽然返回到顶部但是代码仍在运行,还需要在pageScroll函数加一句给停止掉。

if(document.documentElement.scrollTop==0)clearTimeout(scrolldelay);

三、使用Onload加上scroll功能实现动态返回顶部

首先在网页body标签结束之前加上:

<divid="gotop">返回顶部</div>

2、再调用以下JS脚本部分:

BackTop=function(btnId){varbtn=document.getElementById(btnId);vard=document.documentElement;window.onscroll=set;btn.onclick=function(){btn.style.display="none";window.onscroll=null;this.timer=setInterval(function(){d.scrollTop-=Math.ceil(d.scrollTop*0.1);if(d.scrollTop==0)clearInterval(btn.timer,window.onscroll=set);},10);};functionset(){btn.style.display=d.scrollTop?'block':"none"}};BackTop('gotop');

这些可以放到网页中中,也可以独立存成一个js文件,比如gotop.js,再通过以下形式:

<scriptsrc="/js/gotop.js"type=text/javascript></script>

来调用,当然了位置最好放在“返回顶部”标签的下面,该调用方法已假设文件路径为JS,放在其它位置请根据实际修改。

Javascript 相关文章推荐
javascript 获取元素位置的快速方法 getBoundingClientRect()
Nov 26 Javascript
easyui datagrid 键盘上下控制选中行示例
Mar 31 Javascript
jquery实现文本框数量加减功能的例子分享
May 10 Javascript
推荐10 款 SVG 动画的 JavaScript 库
Mar 24 Javascript
Underscore.js 1.3.3 中文注释翻译说明
Jun 25 Javascript
javascript 中的console.log和弹出窗口alert
Aug 30 Javascript
JQueryMiniUI按照时间进行查询的实现方法
Jun 07 jQuery
JavaScript原型继承_动力节点Java学院整理
Jun 30 Javascript
Vue中Table组件Select的勾选和取消勾选事件详解
Mar 19 Javascript
vue实现自定义H5视频播放器的方法步骤
Jul 01 Javascript
详解Howler.js Web音频播放终极解决方案
Aug 23 Javascript
vue 数字翻牌器动态加载数据
Apr 20 Vue.js
基于jquery实现百度新闻导航菜单滑动动画
Mar 15 #Javascript
dedecms页面如何获取会员状态的实例代码
Mar 15 #Javascript
JavaScript隐式类型转换
Mar 15 #Javascript
JavaScript正则表达式匹配 div  style标签
Mar 15 #Javascript
Angularjs整合微信UI(weui)
Mar 15 #Javascript
一步步教大家编写酷炫的导航栏js+css实现
Mar 14 #Javascript
原生javascript+css3编写的3D魔方动画旋扭特效
Mar 14 #Javascript
You might like
如何获得PHP相关资料
2006/10/09 PHP
c#中的实现php中的preg_replace
2009/12/21 PHP
PHP加密函数 Javascript/Js 解密函数
2013/09/23 PHP
JavaScipt基本教程之JavaScript语言的基础
2008/01/16 Javascript
从零开始学习jQuery (十) jQueryUI常用功能实战
2011/02/23 Javascript
ExtJS实现文件下载的方法实例
2013/11/09 Javascript
JS获取当前日期时间并定时刷新示例
2021/03/04 Javascript
浅谈javascript的分号的使用
2015/05/12 Javascript
JQuery中DOM加载与事件执行实例分析
2015/06/13 Javascript
jquery之别踩白块游戏的简单实现
2016/07/25 Javascript
jquery+html仿翻页相册功能
2016/12/20 Javascript
JS实现中国公民身份证号码有效性验证
2017/02/20 Javascript
使用JS实现气泡跟随鼠标移动的动画效果
2017/09/16 Javascript
微信小程序 swiper组件构建轮播图的实例
2017/09/20 Javascript
微信小程序图片轮播组件gallery slider使用方法详解
2018/01/31 Javascript
vue项目webpack中Npm传递参数配置不同域名接口
2018/06/15 Javascript
Vue中 v-if 和v-else-if页面加载出现闪现的问题及解决方法
2018/10/12 Javascript
基于mpvue搭建微信小程序项目框架的教程详解
2019/04/10 Javascript
通过实例学习React中事件节流防抖
2019/06/17 Javascript
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
python 字符串格式化代码
2013/03/17 Python
在RedHat系Linux上部署Python的Celery框架的教程
2015/04/07 Python
利用ctypes提高Python的执行速度
2016/09/09 Python
pyqt5 删除layout中的所有widget方法
2019/06/25 Python
python批量修改xml属性的实现方式
2020/03/05 Python
python with语句的原理与用法详解
2020/03/30 Python
Html5新增标签有哪些
2017/04/13 HTML / CSS
伦敦新晋轻奢耳饰潮牌:Tada & Toy
2020/05/25 全球购物
用JAVA实现一种排序,JAVA类实现序列化的方法(二种)
2014/04/23 面试题
安全资料员岗位职责
2013/12/14 职场文书
幼教求职信
2014/03/12 职场文书
婚前财产公证书
2014/04/10 职场文书
《孙权劝学》教学反思
2014/04/23 职场文书
党员干部群众路线个人整改措施
2014/09/18 职场文书
2014年会计人员工作总结
2014/12/10 职场文书
一篇文章弄懂MySQL查询语句的执行过程
2021/05/07 MySQL