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


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 相关文章推荐
php gethostbyname获取域名ip地址函数详解
Jan 24 Javascript
通过Jscript中@cc_on 语句识别IE浏览器及版本的代码
May 07 Javascript
js获取元素到文档区域document的(横向、纵向)坐标的两种方法
May 17 Javascript
js 时间格式与时间戳的相互转换示例代码
Dec 25 Javascript
javascript的事件触发器介绍的实现
Jun 05 Javascript
封装好的js判断操作系统与浏览器代码分享
Jan 09 Javascript
jQuery控制Div拖拽效果完整实例分析
Apr 15 Javascript
javascript下拉列表中显示树形菜单的实现方法
Nov 17 Javascript
分享几种比较简单实用的JavaScript tabel切换
Dec 31 Javascript
json实现添加、遍历与删除属性的方法
Jun 17 Javascript
vue scroll滚动判断的实现(是否滚动到底部、滚动方向、滚动节流、获取滚动区域dom元素)
Jun 11 Javascript
JQuery通过键盘控制键盘按下与松开触发事件
Aug 07 jQuery
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/01 无线电
分享8个最佳的代码片段在线测试网站
2013/06/29 PHP
php解析html类库simple_html_dom(详细介绍)
2013/07/05 PHP
PHP base64编码后解码乱码的解决办法
2014/06/19 PHP
php实现替换手机号中间数字为*号及隐藏IP最后几位的方法
2016/11/16 PHP
解决安装WampServer时提示缺少msvcr110.dll文件的问题
2017/07/09 PHP
PHP基于关联数组20行代码搞定约瑟夫问题示例
2017/11/07 PHP
js实现iframe动态调整高度的代码
2008/01/06 Javascript
javascript学习笔记(七)Ajax和Http状态码
2014/10/08 Javascript
jQuery给多个不同元素添加class样式的方法
2015/03/26 Javascript
详解javascript遍历方式
2015/11/11 Javascript
JavaScript+canvas实现七色板效果实例
2016/02/18 Javascript
vue2 自定义动态组件所遇到的问题
2017/06/08 Javascript
Javascript实现base64的加密解密方法示例
2017/06/27 Javascript
js指定步长实现单方向匀速运动
2017/07/17 Javascript
JavaScript寄生组合式继承实例详解
2018/01/06 Javascript
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
2018/02/08 Javascript
Angular 组件之间的交互的示例代码
2018/03/24 Javascript
Python中动态获取对象的属性和方法的教程
2015/04/09 Python
解读Python编程中的命名空间与作用域
2015/10/16 Python
python 采集中文乱码问题的完美解决方法
2016/09/27 Python
python3 实现一行输入,空格隔开的示例
2018/11/14 Python
手写一个python迭代器过程详解
2019/08/27 Python
Python获取一个用户名的组ID过程解析
2019/09/03 Python
英国最红的高街时尚品牌:Topshop
2016/08/05 全球购物
大整数数相乘的问题
2012/07/22 面试题
什么是事务?为什么需要事务?
2012/01/09 面试题
外语专业毕业生个人的自荐信
2013/11/19 职场文书
最新的互联网创业计划书
2014/01/10 职场文书
幼儿园元旦家长感言
2014/02/27 职场文书
网络编辑职责
2014/03/01 职场文书
竞选村长演讲稿
2014/04/28 职场文书
体操比赛口号
2014/06/10 职场文书
开会通知短信大全
2015/04/20 职场文书
行政处罚事先告知书
2015/07/01 职场文书
go使用Gin框架利用阿里云实现短信验证码功能
2021/08/04 Golang