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


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实现仿Windows关机效果
Mar 10 Javascript
AJAX使用了UpdatePanel后无法使用alert弹出脚本
Apr 02 Javascript
通过javascript获取iframe里的值示例代码
Jun 24 Javascript
Google Dart编程语法和基本类型学习教程
Nov 27 Javascript
通过jquery 获取URL参数并进行转码
Aug 18 Javascript
Javascript原型链和原型的一个误区
Oct 22 Javascript
javascript元素动态创建实现方法
May 13 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记8)
Dec 24 Javascript
JavaScript中的this,call,apply使用及区别详解
Jan 29 Javascript
input file上传 图片预览功能实例代码
Oct 25 Javascript
Vue.js实现模拟微信朋友圈开发demo
Apr 20 Javascript
网页中的图片查看器viewjs使用方法
Jul 11 Javascript
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
国内咖啡文化
2021/03/03 咖啡文化
php 5.3.5安装memcache注意事项小结
2011/04/12 PHP
ThinkPHP实现动态包含文件的方法
2014/11/29 PHP
php验证码生成代码
2015/11/11 PHP
PHP获取不了React Native Fecth参数的解决办法
2016/08/26 PHP
Fleaphp常见函数功能与用法示例
2016/11/15 PHP
PHP后台微信支付和支付宝支付开发
2017/04/28 PHP
如何实现iframe(嵌入式帧)的自适应高度
2006/07/26 Javascript
修改jquery里的dialog对话框插件为框架页(iframe) 的方法
2010/09/14 Javascript
Js中setTimeout()和setInterval() 何时被调用执行的用法
2013/04/12 Javascript
Jquery 复选框取值兼容FF和IE8(测试有效)
2013/10/29 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
jquery获取复选框被选中的值
2014/03/22 Javascript
javascript页面渲染速度测试脚本分享
2014/04/15 Javascript
Javascript解析URL方法详解
2014/12/05 Javascript
基于Node.js + WebSocket打造即时聊天程序嗨聊
2016/11/29 Javascript
详解Node.js实现301、302重定向服务
2017/04/07 Javascript
js获取元素的偏移量offset简单方法(必看)
2017/07/05 Javascript
原生javascript实现文件异步上传的实例讲解
2017/10/26 Javascript
vue的for循环使用方法
2019/02/12 Javascript
layui实现数据表格点击搜索功能
2020/03/26 Javascript
jquery 遍历hash操作示例【基于ajax交互】
2019/10/12 jQuery
JavaScript实现动态生成表格
2020/08/02 Javascript
浅析Python中signal包的使用
2015/11/13 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
2016/05/03 Python
Django视图和URL配置详解
2018/01/31 Python
Python基于更相减损术实现求解最大公约数的方法
2018/04/04 Python
浅谈tensorflow模型保存为pb的各种姿势
2020/05/25 Python
数据库的约束含义
2012/09/09 面试题
电大毕业生自我鉴定
2013/11/10 职场文书
《金钱的魔力》教学反思
2014/02/24 职场文书
执行力心得体会范文
2016/01/11 职场文书
分享:关于学习的励志名言赏析
2019/08/16 职场文书
MySql新手入门的基本操作汇总
2021/05/13 MySQL
深入理解java.lang.String类的不可变性
2021/06/27 Java/Android
MySQL之select、distinct、limit的使用
2021/11/11 MySQL