原生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 相关文章推荐
在iframe里的页面编写js,实现在父窗口上创建动画效果展开和收缩的div(不变动iframe父窗口代码)
Dec 20 Javascript
js判断变量是否未定义的代码
Mar 28 Javascript
JS的事件绑定深入认识
Jun 26 Javascript
jQuery form插件的使用之处理server返回的JSON, XML,HTML数据
Jan 26 Javascript
jQuery.form插件的使用及跨域异步上传文件
Apr 27 Javascript
jQuery mobile在页面加载时添加加载中效果 document.ready 和window.onload执行顺序比较
Jul 14 Javascript
JS实现快速的导航下拉菜单动画效果附源码下载
Nov 01 Javascript
Vue生命周期示例详解
Apr 12 Javascript
EasyUI在Panel上动态添加LinkButton按钮
Aug 11 Javascript
AngularJs的UI组件ui-Bootstrap之Tooltip和Popover
Jul 13 Javascript
Node批量爬取头条视频并保存方法
Sep 20 Javascript
使用Angular自定义字段校验指令的方法示例
Feb 01 Javascript
基于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
全国FM电台频率大全 - 11 浙江省
2020/03/11 无线电
全国FM电台频率大全 - 31 新疆维吾尔族自治区
2020/03/11 无线电
php中hashtable实现示例分享
2014/02/13 PHP
如何解决PHP使用mysql_query查询超大结果集超内存问题
2016/03/14 PHP
PHP对象链式操作实现原理分析
2016/10/09 PHP
JavaScript加密解密7种方法总结分析
2007/10/07 Javascript
用document.documentElement取代document.body的原因分析
2009/11/12 Javascript
不使用中间变量,交换int型的 a, b两个变量的值。
2010/10/29 Javascript
BAT及各大互联网公司2014前端笔试面试题--JavaScript篇
2014/10/29 Javascript
一个极为简单的requirejs实现方法
2016/10/20 Javascript
jquery css实现邮箱自动补全
2016/11/14 Javascript
Vue自定义指令介绍(2)
2016/12/08 Javascript
使用BootStrap实现悬浮窗口的效果
2016/12/13 Javascript
JavaScript中在光标处插入添加文本标签节点的详细方法
2017/03/22 Javascript
自定义Vue中的v-module双向绑定的实现
2019/04/17 Javascript
vue项目中微信登录的实现操作
2020/09/08 Javascript
python实现类似ftp传输文件的网络程序示例
2014/04/08 Python
python 采集中文乱码问题的完美解决方法
2016/09/27 Python
Tensorflow实现部分参数梯度更新操作
2020/01/23 Python
flask 框架操作MySQL数据库简单示例
2020/02/02 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
2020/03/04 Python
keras 自定义loss model.add_loss的使用详解
2020/06/22 Python
Python Map 函数的使用
2020/08/28 Python
Pytho爬虫中Requests设置请求头Headers的方法
2020/09/22 Python
实例讲解CSS3中的box-flex弹性盒属性布局
2016/06/09 HTML / CSS
html5中地理位置定位api接口开发应用小结
2013/01/04 HTML / CSS
HTML5注册表单的自动聚焦与占位文本示例代码
2013/07/19 HTML / CSS
护理专业自荐信
2013/12/03 职场文书
药剂专业学生求职信范文
2013/12/28 职场文书
渡河少年教学反思
2014/02/12 职场文书
信息技术培训感言
2014/03/06 职场文书
信用社竞聘演讲稿
2014/05/16 职场文书
社区志愿者活动总结
2014/06/26 职场文书
银行实习推荐信
2015/03/27 职场文书
培训讲师开场白
2015/06/01 职场文书
新学期感想
2015/08/10 职场文书