原生js实现淘宝首页点击按钮缓慢回到顶部效果


Posted in Javascript onApril 06, 2014

淘宝首页的回到顶部按钮是这样的:下拉到一定距离后按钮才显示出来,鼠标放到按钮上时,按钮背景会变成灰色,并且图标变成了文字。点击按钮缓慢回到顶部

我们先分析下实现这样的效果需要添加哪些事件。鼠标移进移出按钮,按钮表现发生变化,所以需要给按钮添加mouseover, mouseout事件。要侦听滚动条的变化,所以需要给window添加scroll事件,点击按钮回到顶部,按钮添加click事件。我们将事件处理程序封装成三个函数moveIn, moveOut, goTop;

下面先给出html/css代码

<div class="container"> 
<div class="header">头部</div> 
<div class="content">主要内容,高度是2000px</div> 
<div class="footer>底部</div> 
<div id="btn">返回顶部</div> 
</div>

.container { width: 980px; margin: 0 auto; height: auto; background: #aaa;} 
.content { height: 2000px; border: 1px solid blue; } 
#btn { 
position:fixed; 
bottom: 50px; 
right: 0; 
width: 54px; 
height: 55px; 
background: url(icons.png) no-repeat 0 -110px; } //背景图可随意找一张 
font-size: 12px; 
line-height: 55px; 
text-align: center; 
text-indent: -9999em; 
cursor: pointer; 
display: none;

下面是完整的js代码
window.addEventListener("load",function() { 
var btn = document.getElementById("btn"); 
btn.addEventListener("mouseover",moveIn, false); 
btn.addEventListener("mouseout", moveOut, false); function moveIn() { 
btn.style.color = "#ffffff"; //修改的是内联样式,具有最高的优先级; 
btn.style.textIndent = "0em"; 
btn.style.backgroundImage = "none"; 
btn.style.backgroundColor = "#FF4401"; 
} 
function moveOut() { 
btn.style.textIndent = "-9999em"; 
btn.style.backgroundImage = "url(icons.png)"; 
} 
function goTop(acceleration, time) { //修改参数可调整返回顶部的速度 
acceleration = acceleration || 0.1; 
time = time || 10; 
var speed = 1 + acceleration; 
function getScrollTop() { //取得滚动条的竖直距离 
return document.documentElement.scrollTop || document.body.scrollTop; 
} 
function setScrollTop(value) { //设置滚动条的竖直距离,实现效果的关键就是在很短的间隔时间内不断地修改滚动条的竖直距离,以实现滚动效果 
document.documentElement.scrollTop = value; 
document.body.scrollTop = value; 
} 
window.onscroll = function() { 
var scrollTop = getScrollTop(); 
if (scrollTop > 100) { //判断滚动条距离窗口顶部多远时显示出来,这里是100px 
btn.style.display = "block"; 
} else { 
btn.style.display = "none"; 
} 
}; 
btn.onclick = function () { 
var timer = setInterval(function() { 
setScrollTop(Math.floor(getScrollTop() / speed)); //这行代码是关键,取得滚动条竖直距离,除以speed后再给滚动条设置竖直距离 
if (getScrollTop() == 0) 
clearInterval(timer); 
}, time); 
}; 
} 
goTop(0.2, 8); 
}, false);

当然,还有其他的实现方法,下面给出其他方法的关键代码
btn.onclick = function() { 
clearInterval(timer); 
var timer = setInterval(function() { 
var now = scrollTop; //滚动条竖直距离 
speed = (0 - now) / 10; 
speed = Math.floor(speed); 
if (now == 0); 
clearInterval(timer); 
document.documentElement.scrollTop = now + speed; //标准模式下的浏览器 
document.body.scrollTop = now + speed; //怪异模式下的浏览器 
}, 15); 
}

原生js实现淘宝首页点击按钮缓慢回到顶部效果 
这里的代码主要还是参考了网上其他资源,再加了一点自己的理解。当然还有其他实现方法,比如JavaScript最早时间就支持的window.scrollTo()。用jQ来实现的话代码量将会变得很少,可参看w3cplus

个人觉得,先学好原生JavaScript,比如搞清楚数据类型,闭包,继承,作用域,DOM,CSS,事件处理,Ajax等,用熟练后学习其他框架将会容易很多。

Javascript 相关文章推荐
Ajax异步提交表单数据的说明及方法实例
Jun 22 Javascript
JS保留两位小数 四舍五入函数的小例子
Nov 20 Javascript
实例分析javascript中的call()和apply()方法
Nov 28 Javascript
jQuery实现表格展开与折叠的方法
May 04 Javascript
JQuery学习总结【一】
Dec 01 Javascript
文件上传的几个示例分享【推荐】
Dec 16 Javascript
AngularJS改变元素显示状态
Apr 20 Javascript
详细讲解vue2+vuex+axios
May 27 Javascript
JS点击图片弹出文件选择框并覆盖原图功能的实现代码
Aug 25 Javascript
微信小程序支付及退款流程详解
Nov 30 Javascript
JavaScript实现多张图片放大镜效果示例【不限定图片尺寸,rem单位】
May 14 Javascript
基于vue+uniapp直播项目实现uni-app仿抖音/陌陌直播室功能
Nov 12 Javascript
将字符串中由空格隔开的每个单词首字母大写
Apr 06 #Javascript
当达到输入长度时表单自动切换焦点
Apr 06 #Javascript
javascript中的取反再取反~~没有意义
Apr 06 #Javascript
jQuery toggleClass应用实例(附效果图)
Apr 06 #Javascript
javascript数组操作总结和属性、方法介绍
Apr 05 #Javascript
JavaScript中的prototype和constructor简明总结
Apr 05 #Javascript
JavaScript中的typeof操作符用法实例
Apr 05 #Javascript
You might like
重新认识php array_merge函数
2014/08/31 PHP
codeigniter中实现一次性加载多个view的方法
2015/03/20 PHP
PHP实现读取文件夹及批量重命名文件操作示例
2019/04/15 PHP
php/JS实现的生成随机密码(验证码)功能示例
2019/06/06 PHP
PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作详解
2019/06/14 PHP
Aster vs KG BO3 第一场2.18
2021/03/10 DOTA
javascript 贪吃蛇实现代码
2008/11/22 Javascript
C#中TrimStart,TrimEnd,Trim在javascript上的实现
2011/01/17 Javascript
基于JQuery的日期联动实现代码
2011/02/24 Javascript
javascript打开word文档的方法
2014/04/16 Javascript
浅谈JavaScript实现面向对象中的类
2014/12/09 Javascript
jQuery中removeProp()方法用法实例
2015/01/05 Javascript
JS实现输入框提示文字点击时消失效果
2016/07/19 Javascript
概述如何实现一个简单的浏览器端js模块加载器
2016/12/07 Javascript
layui选项卡效果实现代码
2017/05/19 Javascript
Angular.js中$resource高大上的数据交互详解
2017/07/30 Javascript
bootstrap confirmation按钮提示组件使用详解
2017/08/22 Javascript
angularjs获取到My97DatePicker选中的值方法
2018/10/02 Javascript
JavaScript中常用的简洁高级技巧总结
2019/03/10 Javascript
说说Vuex的getters属性的具体用法
2019/04/15 Javascript
node 标准输入流和输出流代码实例
2019/09/19 Javascript
[52:57]2014 DOTA2国际邀请赛中国区预选赛 LGD-CDEC VS HGT
2014/05/21 DOTA
Python实现对比不同字体中的同一字符的显示效果
2015/04/23 Python
Python批量创建迅雷任务及创建多个文件
2016/02/13 Python
详解Python的Lambda函数与排序
2016/10/25 Python
Python3 获取文件属性的方式(时间、大小等)
2020/03/12 Python
django自带的权限管理Permission用法说明
2020/05/13 Python
keras的三种模型实现与区别说明
2020/07/03 Python
10分钟入门CSS3 Animation
2018/12/25 HTML / CSS
英国蛋糕装饰用品一站式商店:Craft Company
2019/03/18 全球购物
经贸日语专业个人求职信
2013/12/13 职场文书
婚前协议书怎么写
2014/04/15 职场文书
2014法制宣传日活动总结
2014/07/09 职场文书
医院领导班子整改方案
2014/10/01 职场文书
2015年药店工作总结
2015/04/20 职场文书
angular异步验证器防抖实例详解
2022/03/31 Javascript