原生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脚本性能的优化方法
Feb 02 Javascript
JavaScript this调用规则说明
Mar 08 Javascript
多次注册事件会导致一个事件被触发多次的解决方法
Aug 12 Javascript
Lua表达式和控制结构学习笔记
Dec 15 Javascript
jquery模拟进度条实现方法
Aug 03 Javascript
javascript 使用for循环时该注意的问题-附问题总结
Aug 19 Javascript
Jquery实现遮罩层的简单实例(就是弹出DIV周围都灰色不能操作)
Jul 14 Javascript
全面解析Bootstrap表单样式的使用
Sep 09 Javascript
vue scroller返回页面记住滚动位置的实例代码
Jan 29 Javascript
vue 自定义右键样式的实例代码
Nov 06 Javascript
PHP读取远程txt文档到数组并实现遍历
Aug 25 Javascript
vue 数据操作相关总结
Dec 17 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在DOS命令行下却无法链接MySQL的技术笔记
2010/12/29 PHP
Nginx下配置codeigniter框架方法
2015/04/07 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
2019/02/20 PHP
从零开始学习jQuery (三) 管理jQuery包装集
2011/02/23 Javascript
弹出层之1:JQuery.Boxy (一) 使用介绍
2011/10/06 Javascript
屏蔽相应键盘按钮操作
2014/03/10 Javascript
jQuery获取动态生成的元素示例
2014/06/15 Javascript
chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
2015/10/09 Javascript
ES6中Proxy代理用法实例浅析
2017/04/06 Javascript
jQuery插件FusionCharts绘制2D双折线图效果示例【附demo源码】
2017/04/14 jQuery
强大的 Angular 表单验证功能详细介绍
2017/05/23 Javascript
js轮播图的插件化封装详解
2017/07/17 Javascript
详解vue 实例方法和数据
2017/10/23 Javascript
node.js微信小程序配置消息推送的实现
2019/02/13 Javascript
如何为你的JS项目添加智能提示与类型检查详解
2019/03/12 Javascript
通过javascript实现段落的收缩与展开
2019/06/26 Javascript
基于Express框架使用POST传递Form数据
2019/08/10 Javascript
Vue项目中Api的组织和返回数据处理的操作
2019/11/04 Javascript
Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能详解
2020/04/29 Javascript
在Docker上开始部署Python应用的教程
2015/04/17 Python
python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
2018/01/17 Python
python: line=f.readlines()消除line中\n的方法
2018/03/19 Python
基于DataFrame筛选数据与loc的用法详解
2018/05/18 Python
实践Vim配置python开发环境
2018/07/02 Python
python 字典的打印实现
2019/09/26 Python
python 实现turtle画图并导出图片格式的文件
2019/12/07 Python
Tensorflow中k.gradients()和tf.stop_gradient()用法说明
2020/06/10 Python
正规的求职信范文分享
2013/12/11 职场文书
求职简历中自我评价
2014/01/28 职场文书
自我鉴定书
2014/03/24 职场文书
出生证明公证书
2014/04/09 职场文书
班级年度安全计划书
2014/05/01 职场文书
保护环境的标语
2014/06/09 职场文书
小学生家长意见
2015/06/03 职场文书
oracle索引总结
2021/09/25 Oracle
GO语言字符串处理函数之处理Strings包
2022/04/14 Golang