原生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 相关文章推荐
java与javascript之间json格式数据互转介绍
Oct 29 Javascript
JavaScript高级教程5.6之基本包装类型(详细)
Nov 23 Javascript
Bootstrap每天必学之轮播(Carousel)插件
Apr 25 Javascript
Web安全测试之XSS实例讲解
Aug 15 Javascript
详谈Ajax请求中的async:false/true的作用(ajax 在外部调用问题)
Feb 10 Javascript
jQuery实现简单弹窗遮罩效果
Feb 27 Javascript
vue2.0模拟锚点的实例
Mar 14 Javascript
使用svg实现动态时钟效果
Jul 17 Javascript
vue中前进刷新、后退缓存用户浏览数据和浏览位置的实例讲解
Sep 21 Javascript
require.js 加载过程与使用方法介绍
Oct 30 Javascript
Vue简单封装axios之解决post请求后端接收不到参数问题
Feb 16 Javascript
js 实现验证码输入框示例详解
Sep 23 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
php基础知识:类与对象(2) 自动加载对象
2006/12/13 PHP
php 数组使用详解 推荐
2011/06/02 PHP
PHP中的gzcompress、gzdeflate、gzencode函数详解
2014/07/29 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
JavaScript 程序编码规范
2010/11/23 Javascript
js切换div css注意的细节
2012/12/10 Javascript
Jquery 获取对象的几种方式介绍
2014/01/17 Javascript
用jquery的方法制作一个简单的导航栏
2014/06/23 Javascript
jquery实现的淡入淡出下拉菜单效果
2015/08/25 Javascript
JavaScript基础语法之js表达式
2016/06/07 Javascript
JS中的hasOwnProperty()、propertyIsEnumerable()和isPrototypeOf()
2016/08/11 Javascript
微信小程序仿微信运动步数排行(交互)
2018/07/13 Javascript
JavaScript遍历数组的三种方法map、forEach与filter实例详解
2019/02/27 Javascript
微信小程序开发常见问题及解决方案
2019/07/11 Javascript
微信小程序监听用户登录事件的实现方法
2019/11/11 Javascript
小程序使用wxs解决wxml保留2位小数问题
2019/12/13 Javascript
Vue Cli3 打包配置并自动忽略console.log语句的方法
2020/04/23 Javascript
原生JS实现音乐播放器的示例代码
2021/02/25 Javascript
[07:06]2018DOTA2国际邀请赛寻真——卫冕冠军Team Liquid
2018/08/10 DOTA
python生成验证码图片代码分享
2016/01/28 Python
使用Python判断质数(素数)的简单方法讲解
2016/05/05 Python
Python制作Windows系统服务
2017/03/25 Python
python之从文件读取数据到list的实例讲解
2018/04/19 Python
Python线性拟合实现函数与用法示例
2018/12/13 Python
Python使用百度翻译开发平台实现英文翻译为中文功能示例
2019/08/08 Python
Python开发企业微信机器人每天定时发消息实例
2020/03/17 Python
keras训练浅层卷积网络并保存和加载模型实例
2020/07/02 Python
Kate Spade澳大利亚官方网站:美国设计师手袋品牌
2019/09/10 全球购物
Douglas意大利官网:购买香水和化妆品
2020/05/27 全球购物
如何开发一个JQuery插件
2016/07/28 面试题
大学生职业规划前言模板
2013/12/27 职场文书
班主任评语大全
2014/04/26 职场文书
监督检查工作方案
2014/05/28 职场文书
2016年“5.12”护士节致辞
2015/07/31 职场文书
python 机器学习的标准化、归一化、正则化、离散化和白化
2021/04/16 Python
Go语言-为什么返回值为接口类型,却返回结构体
2021/04/24 Golang