原生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 相关文章推荐
jquery 弹出层注册页面等(asp.net后台)
Jun 17 Javascript
封装的原生javascript弹出层代码
Sep 24 Javascript
javascript匿名函数应用示例介绍
Mar 07 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
Jul 17 Javascript
Jquery根据浏览器窗口改变调整大小的方法
Feb 07 Javascript
jQuery用noConflict代替$的实现方法
Apr 12 jQuery
vue 计时器组件的实现代码
Sep 14 Javascript
深入理解React高阶组件
Sep 28 Javascript
webpack-url-loader 解决项目中图片打包路径问题
Feb 15 Javascript
node链接mongodb数据库的方法详解【阿里云服务器环境ubuntu】
Mar 07 Javascript
详解Node.js一行命令上传本地文件到服务器
Apr 22 Javascript
node.js实现简单的压缩/解压缩功能示例
Nov 05 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 file_put_contents()功能函数(集成了fopen、fwrite、fclose)
2011/05/24 PHP
ThinkPHP实现非标准名称数据表快速创建模型的方法
2014/11/29 PHP
实例详解PHP中html word 互转的方法
2016/01/28 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
js两行代码按指定格式输出日期时间
2011/10/21 Javascript
JS获得选取checkbox整行数据的方法
2015/01/28 Javascript
JS点击链接后慢慢展开隐藏着图片的方法
2015/02/17 Javascript
41个Web开发者必须收藏的JavaScript实用技巧
2016/07/22 Javascript
Knockout结合Bootstrap创建动态UI实现产品列表管理
2016/09/14 Javascript
js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法
2017/02/08 Javascript
JavaScript中object和Object的区别(详解)
2017/02/27 Javascript
Vue.js弹出模态框组件开发的示例代码
2017/07/26 Javascript
通过button将form表单的数据提交到action层的实例
2017/09/08 Javascript
VUE2 前端实现 静态二级省市联动选择select的示例
2018/02/09 Javascript
vue利用axios来完成数据的交互
2018/03/23 Javascript
Vue实现表格中对数据进行转换、处理的方法
2018/09/06 Javascript
微信公众平台获取access_token的方法步骤
2019/03/29 Javascript
Node.js+Vue脚手架环境搭建的方法步骤
2020/03/08 Javascript
JavaScript利用键盘码控制div移动
2020/03/19 Javascript
Python下载懒人图库JavaScript特效
2015/05/28 Python
在Django框架中编写Context处理器的方法
2015/07/20 Python
Python实现的爬虫功能代码
2017/06/24 Python
PyTorch CNN实战之MNIST手写数字识别示例
2018/05/29 Python
Python运维自动化之nginx配置文件对比操作示例
2018/08/29 Python
解决每次打开pycharm直接进入项目的问题
2018/10/28 Python
浅谈Python反射 &amp; 单例模式
2019/03/21 Python
Python连接Oracle之环境配置、实例代码及报错解决方法详解
2020/02/11 Python
Python阶乘求和的代码详解
2020/02/14 Python
python 解决print数组/矩阵无法完整输出的问题
2020/02/19 Python
python opencv 检测移动物体并截图保存实例
2020/03/10 Python
python文件排序的方法总结
2020/09/13 Python
PHP两种查询函数array/row的区别
2013/06/03 面试题
医学院学生求职简历的自我评价
2013/10/24 职场文书
网络营销策划方案
2014/06/04 职场文书
大学生就业意向书
2015/05/11 职场文书
企业文化学习心得体会
2016/01/21 职场文书