原生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 相关文章推荐
js onpropertychange输入框 事件获取属性
Mar 26 Javascript
jQuery获取动态生成的元素示例
Jun 15 Javascript
简单实现js选项卡切换效果
Feb 03 Javascript
JavaScript获取css行间样式,内连样式和外链样式的简单方法
Jul 18 Javascript
Jquery和Js获得元素标签名称的方法总结
Oct 08 Javascript
AngularJS  ng-repeat遍历输出的用法
Jun 19 Javascript
微信小程序实现鼠标拖动效果示例
Dec 01 Javascript
vue实现购物车抛物线小球动画效果的方法详解
Feb 13 Javascript
express启用https使用小记
May 21 Javascript
vue分页器组件编写方法详解
Jun 28 Javascript
vue proxy 的优势与使用场景实现
Jun 15 Javascript
JS Canvas接口和动画效果大全
Apr 29 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常用Output和ptions/Info函数集介绍
2013/06/19 PHP
YiiFramework入门知识点总结(图文教程)
2015/12/28 PHP
PHP实现的下载远程文件类定义与用法示例
2017/07/05 PHP
javascript qq右下角滑出窗口 sheyMsg
2010/03/21 Javascript
jQuery 源码分析笔记(6) jQuery.data
2011/06/08 Javascript
js Event对象的5种坐标
2011/09/12 Javascript
jquery连缀语法如何实现
2012/11/29 Javascript
让input框实现类似百度的搜索提示(基于jquery事件监听)
2014/01/31 Javascript
JS生成不重复随机数组的函数代码
2014/06/10 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
2014/09/03 Javascript
使用javascript实现监控视频播放并打印日志
2015/01/05 Javascript
JQuery.validate在ie8下不支持的快速解决方法
2016/05/18 Javascript
酷! 不同风格页面布局幻灯片特效js实现
2021/02/19 Javascript
深入理解JS中的Function.prototype.bind()方法
2016/10/11 Javascript
JavaScript表单验证实现代码
2017/05/22 Javascript
bootstrap modal+gridview实现弹出框效果
2017/08/15 Javascript
详解为什么Vue中不要用index作为key(diff算法)
2020/04/04 Javascript
分享一下Python 开发者节省时间的10个方法
2015/10/02 Python
python编程实现希尔排序
2017/04/13 Python
Python下实现的RSA加密/解密及签名/验证功能示例
2017/07/17 Python
Python 使用type来定义类的实现
2019/11/19 Python
Python实现井字棋小游戏
2020/03/09 Python
基于python实现坦克大战游戏
2020/10/27 Python
pymysql模块使用简介与示例
2020/11/17 Python
css3实现针线缝合效果(图解步骤)
2013/02/04 HTML / CSS
加拿大折扣、优惠券和交易网站:WagJag
2018/02/07 全球购物
如何用Lucene索引数据库
2016/02/23 面试题
怎么写有吸引力的自荐信
2013/11/17 职场文书
春节活动策划方案
2014/01/24 职场文书
媒矿安全生产承诺书
2014/05/23 职场文书
五好文明家庭事迹材料
2014/12/20 职场文书
2015年综治维稳工作总结
2015/04/07 职场文书
小学生节水倡议书
2015/04/29 职场文书
历史博物馆观后感
2015/06/05 职场文书
离婚协议书格式范本
2016/03/18 职场文书
VUE使用draggable实现组件拖拽
2022/04/06 Vue.js