原生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的冒泡事件的阻止与允许(三种实现方法)
Feb 01 Javascript
解决IE6的PNG透明JS插件使用介绍
Apr 17 Javascript
使用jquery选择器如何获取父级元素、同级元素、子元素
May 14 Javascript
JavaScript实现图片DIV竖向滑动的方法
Apr 25 Javascript
深入剖析JavaScript:Object类型
May 10 Javascript
jqGrid用法汇总(全经典)
Jun 28 Javascript
require.js+vue开发微信上传图片组件
Oct 27 Javascript
基于JavaScript实现自动更新倒计时效果
Dec 19 Javascript
jquery 判断是否支持Placeholder属性的方法
Feb 07 Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
Feb 16 Javascript
JS实现自定义弹窗功能
Aug 08 Javascript
解决vue项目运行npm run serve报错的问题
Oct 26 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
espresso double下 咖啡粉超细时 饼压力对咖啡的影响
2021/03/03 冲泡冲煮
php递归列出所有文件和目录的代码
2008/09/10 PHP
php获取某个目录大小的代码
2008/09/10 PHP
在Windows系统上安装PHP运行环境文字教程
2010/07/19 PHP
一个php短网址的生成代码(仿微博短网址)
2014/05/07 PHP
php对象工厂类完整示例
2018/08/09 PHP
用于自动添加Digg This!按钮的JavaScript
2006/12/23 Javascript
JavaScript 面向对象之命名空间
2010/05/04 Javascript
js设置控件的隐藏与显示的两种方法
2014/08/21 Javascript
基于jquery实现放大镜效果
2015/08/17 Javascript
jQuery+Ajax+PHP+Mysql实现分页显示数据实例讲解
2015/09/27 Javascript
基于jquery实现页面滚动到底自动加载数据的功能
2015/12/19 Javascript
Eclipse编辑jsp、js文件时卡死现象的解决办法汇总
2016/02/02 Javascript
js前端面试题及答案整理(一)
2016/08/26 Javascript
JavaScript判断浏览器对CSS3属性是否支持的多种方法
2016/11/13 Javascript
JavaScript中String对象的方法介绍
2017/01/04 Javascript
JavaScript面向对象精要(上部)
2017/09/12 Javascript
详解使用vscode+es6写nodejs服务端调试配置
2017/09/21 NodeJs
Vue 中axios配置实例详解
2018/07/27 Javascript
深入浅析Node环境和浏览器的区别
2018/08/14 Javascript
如何将百度地图包装成Vue的组件的方法步骤
2019/02/12 Javascript
你准备好迎接vue3.0了吗
2020/04/28 Javascript
JavaScript数组排序的六种常见算法总结
2020/08/18 Javascript
[00:16]热血竞技场
2019/03/06 DOTA
[57:36]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第三场 2月1日
2021/03/11 DOTA
Python中的元类编程入门指引
2015/04/15 Python
python引用(import)某个模块提示没找到对应模块的解决方法
2019/01/19 Python
Windows10下Tensorflow2.0 安装及环境配置教程(图文)
2019/11/21 Python
基于python实现ROC曲线绘制广场解析
2020/06/28 Python
Python SMTP发送电子邮件的示例
2020/09/23 Python
Microsoft新加坡官方网站:购买微软最新软件和技术产品
2016/10/28 全球购物
机关副主任个人四风问题整改措施
2014/09/26 职场文书
公安民警正风肃纪剖析材料
2014/10/10 职场文书
检讨书1000字
2014/10/11 职场文书
2015年安全生产管理工作总结
2015/05/25 职场文书
导游词之秦皇岛燕塞湖
2020/01/03 职场文书