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


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 相关文章推荐
JXTree对象,读取外部xml文件数据,生成树的函数
Apr 02 Javascript
js弹出框轻量级插件jquery.boxy使用介绍
Jan 15 Javascript
获取内联和链接中的样式(js代码)
Apr 11 Javascript
js获取字符串最后一位方法汇总
Nov 13 Javascript
原生js实现类似fullpage的单页/全屏滚动
Jan 22 Javascript
jQuery动态生成不规则表格(前后端)
Feb 21 Javascript
javascript基于定时器实现进度条功能实例
Oct 13 Javascript
jquery 获取索引值在一定范围的列表方法
Jan 25 jQuery
安装vue-cli的简易过程
May 22 Javascript
node.js中fs文件系统模块的使用方法实例详解
Feb 13 Javascript
vue实现图书管理系统
Dec 29 Vue.js
vue中三级导航的菜单权限控制
Mar 31 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
php实现telnet功能示例
2014/04/08 PHP
YII模块实现绑定二级域名的方法
2014/07/09 PHP
PHP解析RSS的方法
2015/03/05 PHP
完美解决Thinkphp3.2中插入相同数据的问题
2017/08/01 PHP
比较全面的event对像在IE与FF中的区别 推荐
2009/09/21 Javascript
关于flash遮盖div浮动层的解决方法
2010/07/17 Javascript
JS弹出层单纯的绝对定位居中示例代码
2014/02/18 Javascript
javascript实现类似java中getClass()得到对象类名的方法
2015/07/27 Javascript
BootStrap轮播HTML代码(推荐)
2016/12/10 Javascript
jQuery选择器之表单元素选择器详解
2017/09/19 jQuery
利用Vue2.x开发实现JSON树的方法
2018/01/04 Javascript
轻松搞定jQuery+JSONP跨域请求的解决方案
2018/03/06 jQuery
JS使用setInterval实现的简单计时器功能示例
2018/04/19 Javascript
详解Vue中watch的高级用法
2018/05/02 Javascript
vue实现图片上传到后台
2020/06/29 Javascript
js实现有趣的倒计时效果
2021/01/19 Javascript
[02:28]DOTA2亚洲邀请赛附加赛 RECAP赛事回顾
2015/01/29 DOTA
[00:12]DAC2018 no[o]ne亮相SOLO赛 他是否如他的id一样无人可挡?
2018/04/06 DOTA
[01:01:51]EG vs VG Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
Python 文件重命名工具代码
2009/07/26 Python
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
2014/06/10 Python
Python import自定义模块方法
2015/02/12 Python
遗传算法python版
2018/03/19 Python
Python读取系统文件夹内所有文件并统计数量的方法
2018/10/23 Python
详解Python3网络爬虫(二):利用urllib.urlopen向有道翻译发送数据获得翻译结果
2019/05/07 Python
Django中的静态文件管理过程解析
2019/08/01 Python
Shopee马来西亚:随拍即卖,最佳行动电商拍卖平台
2017/06/05 全球购物
美国女士内衣在线折扣商店:One Hanes Place
2019/03/24 全球购物
系统管理员的职责包括那些?管理的对象是什么?
2016/09/20 面试题
乱丢垃圾袋检讨书
2014/10/08 职场文书
奖学金感谢信
2015/01/21 职场文书
汽车销售员岗位职责
2015/04/11 职场文书
公司员工辞职信范文
2015/05/12 职场文书
导游词之绍兴柯岩古镇
2020/01/09 职场文书
MySQL的索引你了解吗
2022/03/13 MySQL
Mysql中常用的join连接方式
2022/05/11 MySQL