原生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无限极树形菜单,json格式、数组格式通用示例
Jul 30 Javascript
ExtJS如何设置与获取radio控件的选取状态
Jan 22 Javascript
Bootstrap 粘页脚效果
Mar 28 Javascript
jquery checkbox的相关操作总结
Oct 17 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
Feb 05 Javascript
AngularJS路由切换实现方法分析
Mar 17 Javascript
微信小程序 实现动态显示和隐藏某个控件
Apr 27 Javascript
简单谈谈JS中的正则表达式
Sep 11 Javascript
SVG动画vivus.js库使用小结(实例代码)
Sep 14 Javascript
基于JavaScript 实现拖放功能
Sep 12 Javascript
vue动态加载SVG文件并修改节点数据的操作代码
Aug 17 Javascript
js实现滚动条自动滚动
Dec 13 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
2006/12/14 PHP
php写的带缓存数据功能的mysqli类
2012/09/06 PHP
php常用字符串String函数实例总结【转换,替换,计算,截取,加密】
2016/12/07 PHP
php提高脚本性能的4个技巧
2020/08/18 PHP
基于jQuery替换table中的内容并显示进度条的代码
2011/08/02 Javascript
angularJS中$apply()方法详解
2015/01/07 Javascript
JQuery 两种方法解决刚创建的元素遍历不到的问题
2016/04/13 Javascript
jQuery实现移动端手机商城购物车功能
2016/09/24 Javascript
扩展Bootstrap Tooltip插件使其可交互的方法
2016/11/07 Javascript
Vue.js 2.0 移动端拍照压缩图片上传预览功能
2017/03/06 Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
2018/03/01 Javascript
基于 Immutable.js 实现撤销重做功能的实例代码
2018/03/01 Javascript
[44:10]2018DOTA2亚洲邀请赛 4.5 淘汰赛 EG vs VP 第一场
2018/04/06 DOTA
Python生成pdf文件的方法
2014/08/04 Python
Python中的列表知识点汇总
2015/04/14 Python
浅谈python为什么不需要三目运算符和switch
2016/06/17 Python
python模拟表单提交登录图书馆
2018/04/27 Python
浅谈django2.0 ForeignKey参数的变化
2019/08/06 Python
Python Django模板之模板过滤器与自定义模板过滤器示例
2019/10/18 Python
wxPython实现绘图小例子
2019/11/19 Python
python pygame实现滚动横版射击游戏城市之战
2019/11/25 Python
Windows 平台做 Python 开发的最佳组合(推荐)
2020/07/27 Python
python3.7中安装paddleocr及paddlepaddle包的多种方法
2020/11/27 Python
详解python使用金山词霸的翻译功能(调试工具断点的使用)
2021/01/07 Python
js实现移动端H5页面手指滑动刻度尺功能
2017/11/16 HTML / CSS
审计班子对照检查材料
2014/08/27 职场文书
2015年酒店工作总结
2015/04/28 职场文书
资金申请报告范文
2015/05/14 职场文书
青春雷锋观后感
2015/06/10 职场文书
关于国庆节的广播稿
2015/08/19 职场文书
大学三好学生主要事迹范文
2015/11/03 职场文书
入党心得体会
2019/06/20 职场文书
redis三种高可用方式部署的实现
2021/05/11 Redis
MySQL 分区表中分区键为什么必须是主键的一部分
2022/03/17 MySQL
本地搭建minio文件服务器(使用bat脚本启动)的方法
2022/07/15 Servers
win10滚动条自动往上跑怎么办?win10滚动条自动往上跑的解决方法
2022/08/05 数码科技