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


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 相关文章推荐
一个可以显示阴历的JS代码
Mar 05 Javascript
jquery实现树形二级菜单实例代码
Nov 20 Javascript
基于jQuery的图片不完全按比例自动缩小
Jul 11 Javascript
tuzhu_req.js 实现仿百度图片首页效果
Aug 11 Javascript
js仿百度登录页实现拖动窗口效果
Mar 11 Javascript
jQuery实现两个select控件的互移操作
Dec 22 Javascript
微信小程序swiper组件用法实例分析【附源码下载】
Dec 07 Javascript
node 命令方式启动修改端口的方法
May 12 Javascript
vue2.0 如何在hash模式下实现微信分享
Jan 22 Javascript
vue通信方式EventBus的实现代码详解
Jun 10 Javascript
JavaScript中的this/call/apply/bind的使用及区别
Mar 06 Javascript
浅谈Vue使用Elementui修改默认的最快方法
Dec 05 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
destoon文章模块调用企业会员资料的方法
2014/08/22 PHP
Yii中srbac权限扩展模块工作原理与用法分析
2016/07/14 PHP
php事件驱动化设计详解
2016/11/10 PHP
Jquery乱码的一次解决过程 图解教程
2010/02/20 Javascript
JavaScript 放大镜 放大倍率和视窗尺寸
2011/05/09 Javascript
用Jquery.load载入页面后样式没了页面混乱的解决方法
2014/10/20 Javascript
使用javascript实现json数据以csv格式下载
2015/01/09 Javascript
JS组件Bootstrap Select2使用方法详解
2020/04/17 Javascript
基于JS实现Android,iOS一个手势动画效果
2016/04/27 Javascript
JS实现的手机端精简幻灯片效果
2016/09/05 Javascript
node.js中fs.stat与fs.fstat的区别详解
2017/06/01 Javascript
Javascript中的getter和setter初识
2017/08/17 Javascript
Vue源码学习之初始化模块init.js解析
2017/11/02 Javascript
微信小程序中添加客服按钮contact-button功能
2018/04/27 Javascript
JS数组实现分类统计实例代码
2018/09/30 Javascript
jQuery+css last-child实现选择最后一个子元素操作示例
2018/12/10 jQuery
解决vue单页面应用中动态修改title问题
2019/06/09 Javascript
2019最新21个MySQL高频面试题介绍
2020/02/06 Javascript
利用QT写一个极简单的图形化Python闹钟程序
2015/04/07 Python
详解Python的Django框架中的Cookie相关处理
2015/07/22 Python
使用Python脚本将文字转换为图片的实例分享
2015/08/29 Python
在Python函数中输入任意数量参数的实例
2019/07/16 Python
Python 离线工作环境搭建的方法步骤
2019/07/29 Python
python实现两个文件夹的同步
2019/08/29 Python
Python 元组拆包示例(Tuple Unpacking)
2019/12/24 Python
openCV提取图像中的矩形区域
2020/07/21 Python
Python3安装模块报错Microsoft Visual C++ 14.0 is required的解决方法
2020/07/28 Python
HTML5 使用 sessionStorage 进行页面传值的方法
2018/07/02 HTML / CSS
安踏官方商城:anta.cn
2019/12/16 全球购物
2014年社区植树节活动方案
2014/02/28 职场文书
人资专员岗位职责
2014/04/04 职场文书
淘宝好评语大全
2014/05/05 职场文书
大型活动组织方案
2014/05/10 职场文书
2015年“我们的节日·重阳节”活动总结
2015/07/29 职场文书
《水上飞机》教学反思
2016/02/20 职场文书
Java异常体系非正常停止和分类
2022/06/14 Java/Android