常见效果实现之返回顶部(结合淡入、淡出、减速滚动)


Posted in Javascript onJanuary 04, 2012

在性能方面考虑了由于连续触发onscroll事件,频繁调用回调函数而产生的性能问题。可以将回调函数缓存一段时候后执行,即当这段时间内多次触发了onscroll事件,但回调函数只会执行一次。

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="gb2312" /> 
<title>结合淡入/淡出/减速运动效果实现的返回顶部功能</title> 
<style> 
.fixed{ 
position:fixed; bottom:100px; width:20px; right:100px; height:80px; font-size:12px; 

 cursor:pointer; background-color:#ccc; opacity:0; filter: alpha(opacity=0); 
} 
.placeholder{ height:2000px;} 
</style> 
</head> 
<body> 
<div id="gotop" class="fixed"> 
返回顶部 
</div> 
<script> 
var tool = { 
//此方法为了避免在 ms 段时间内,多次执行func。常用 resize、scoll、mousemove等连续性事件中 
buffer: function(func, ms, context){ 
var buffer; 
return function(){ 
if(buffer) return; 
buffer = setTimeout(function(){ 
func.call(this) 
buffer = undefined; 
},ms); 
}; 
}, 
/*读取或设置元素的透明度*/ 
opacity: function(elem, val){ 
var setting = arguments.length > 1; 
if("opacity" in elem.style){//elem.style["opacity"] 读取不到CSS class中的值 
return setting ? elem.style["opacity"] = val : elem.style["opacity"]; 
}else{ 
if(elem.filters && elem.filters.alpha) { 
return setting ? elem.filters.alpha["opacity"] = val*100 : elem.filters.alpha["opacity"]/100; 
} 
} 
}, 
//获取或设置文档对象的scrollTop 
//function([val]) 
documentScrollTop: function(val){ 
var elem = document; 
return (val!== undefined) ? 
elem.documentElement.scrollTop = elem.body.scrollTop = val : 
Math.max(elem.documentElement.scrollTop, elem.body.scrollTop); 
} 
}; 
//动画效果 
var effect = { 
//淡入 
fadein: function (elem){ 
var val = 0; 
var interval = 25; 
setTimeout(function(){ 
val += 0.1; 
if(val>1){ 
tool.opacity(elem, 1) 
return; 
}else { 
tool.opacity(elem, val) 
setTimeout(arguments.callee, interval); 
} 
},interval); 
}, 
//淡出 
fadeout: function (elem){ 
var val = 1; 
var interval = 25; 
setTimeout(function(){ 
val -= 0.1; 
if(val < 0){ 
tool.opacity(elem, 0) 
return; 
}else { 
tool.opacity(elem,val) ; 
setTimeout(arguments.callee, interval); 
} 
},interval); 
}, 
//减速移动滚动条 
move: function(scrollTop){ 
setTimeout(function(){ 
scrollTop = Math.floor((scrollTop * 0.65)); 
tool.documentScrollTop(scrollTop); 
if(scrollTop !=0 ){ 
setTimeout(arguments.callee, 25); 
} 
},25); 
} 
}; 
//主程序 
(function(){//gotop 
var visible = false; 
var elem = document.getElementById("gotop"); 
function onscroll(){ 
var scrollTop = tool.documentScrollTop(); 
if(scrollTop > 0){ 
if(!visible){ 
effect.fadein(elem) 
visible = true; 
} 
}else{ 
if(visible){ 
effect.fadeout(elem); 
visible = false; 
} 
} 
} 
function onclick(){ 
var scrollTop = tool.documentScrollTop(); 
effect.move(scrollTop); 
} 
elem.onclick = onclick; 
window.onscroll = tool.buffer(onscroll, 200, this); 
})(); 
</script> 
<div class="placeholder">placeholder</div> 
</body> 
</html>

兼容性和bugs相关问题:
1 opacity: function(elem, val){

if(val){//使用这种判断方式当传0,空字符串时会产生BUG 。
2:document.documentElement.scrollTop chrome取不到值 。
3: elem.style.opacity 读取不到在CSS Class中定义的值。
4:IE6不支持fixed定位,虽然可以使用absolute模拟。不过很有很多网站都它进行了降级处理。

Javascript 相关文章推荐
JavaScript中合并数组的N种方法
Sep 16 Javascript
JavaScript函数中关于valueOf和toString的理解
Jun 14 Javascript
过期软件破解办法实例详解
Jan 04 Javascript
详解JavaScript中this的指向问题
Jan 20 Javascript
详解vue2.0的Element UI的表格table列时间戳格式化
Jun 13 Javascript
JavaScript中如何判断一个值的类型
Sep 15 Javascript
phantomjs导出html到pdf的方法总结
Oct 19 Javascript
vue项目中仿element-ui弹框效果的实例代码
Apr 22 Javascript
深入浅出vue图片路径的实现
Sep 04 Javascript
vue.js click点击事件获取当前元素对象的操作
Aug 07 Javascript
JS实现无限轮播无倒退效果
Sep 21 Javascript
Vue和Flask通信的实现
May 19 Vue.js
Textarea与懒惰渲染实现代码
Jan 04 #Javascript
js中有关IE版本检测
Jan 04 #Javascript
国外大牛IE版本检测!现在IE都到9了,IE检测代码
Jan 04 #Javascript
IE的有条件注释判定IE版本详解(附实例代码)
Jan 04 #Javascript
js变量以及其作用域详解
Jul 18 #Javascript
分享一个asp.net pager分页控件
Jan 04 #Javascript
调试Node.JS的辅助工具(NodeWatcher)
Jan 04 #Javascript
You might like
Discuz板块横排显示图片的实现方法
2007/05/28 PHP
php文件上传 你真的掌握了吗
2016/11/28 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
2017/03/01 PHP
jQuery 通过事件委派一次绑定多种事件,以减少事件冗余
2010/06/30 Javascript
jQuery解析XML与传统JavaScript方法的差别实例分析
2015/03/05 Javascript
js 获取元素在页面上的偏移量的方法汇总
2015/04/13 Javascript
Bootstrap时间选择器datetimepicker和daterangepicker使用实例解析
2016/09/17 Javascript
利用纯JS实现像素逐渐显示的方法示例
2017/08/14 Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
2017/09/21 Javascript
Hexo已经看腻了,来手把手教你使用VuePress搭建个人博客
2018/04/26 Javascript
Vue实现PopupWindow组件详解
2018/04/28 Javascript
NodeJs搭建本地服务器之使用手机访问的实例讲解
2018/05/12 NodeJs
WebPack配置vue多页面的技巧
2018/05/15 Javascript
Vue多系统切换实现方案
2018/06/05 Javascript
JS实现可视化文件上传
2018/09/08 Javascript
基于leaflet.js实现修改地图主题样式的流程分析
2020/05/15 Javascript
[02:03]《现实生活中的DOTA2》—林书豪&DOTA2职业选手出演短片
2015/08/18 DOTA
Python修改Excel数据的实例代码
2013/11/01 Python
python中的对象拷贝示例 python引用传递
2014/01/23 Python
基于wxpython开发的简单gui计算器实例
2015/05/30 Python
Python使用Pycrypto库进行RSA加密的方法详解
2016/06/06 Python
如何在python中使用selenium的示例
2017/12/26 Python
Python matplotlib以日期为x轴作图代码实例
2019/11/22 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
2020/03/30 Python
收集的22款给力的HTML5和CSS3帮助工具
2012/09/14 HTML / CSS
英国现代家具和装饰网站:PN Home
2018/08/16 全球购物
东芝官网商城:还原日式美学,打造美好生活
2018/12/27 全球购物
戴尔新加坡官网:Dell Singapore
2020/12/13 全球购物
高中自我鉴定范文
2013/11/03 职场文书
车间班组长的职责
2013/12/13 职场文书
给国外客户的邀请函
2014/01/30 职场文书
公司委托书格式
2014/08/01 职场文书
摩登时代观后感
2015/06/03 职场文书
python入门学习关于for else的特殊特性讲解
2021/11/20 Python
Java练习之潜艇小游戏的实现
2022/03/16 Java/Android
Vue.Draggable实现交换位置
2022/04/07 Vue.js