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


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函数
Aug 01 Javascript
jQuery Select(单选) 模拟插件 V1.3.62 改进版
Jul 17 Javascript
javascript中使用replaceAll()函数实现字符替换的方法
Dec 25 Javascript
javascript 进阶篇3 Ajax 、JSON、 Prototype介绍
Mar 14 Javascript
vue.js的提示组件
Mar 02 Javascript
js实现自动图片轮播代码
Mar 22 Javascript
详解ES6语法之可迭代协议和迭代器协议
Jan 13 Javascript
Vue的轮播图组件实现方法
Mar 03 Javascript
JS添加或删除HTML dom元素的方法实例分析
Mar 05 Javascript
解决layui的radio属性或别的属性没显示出来的问题
Sep 26 Javascript
vant IndexBar实现的城市列表的示例代码
Nov 20 Javascript
Node.js文本文件BOM头的去除方法
Nov 22 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
php函数的常用方法及注意之处小结
2011/07/10 PHP
PHP 读取Postgresql中的数组
2013/04/14 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
2019/09/16 PHP
[原创]后缀就扩展名为js的文件是什么文件
2007/12/06 Javascript
HTML颜色选择器实现代码
2010/11/23 Javascript
时间戳转换为时间 年月日时间的JS函数
2013/08/19 Javascript
js中prototype用法详细介绍
2013/11/14 Javascript
高性能JavaScript循环语句和条件语句
2016/01/20 Javascript
基于JS实现EOS隐藏错误提示层代码
2016/04/25 Javascript
浅谈js的ajax的异步和同步请求的问题
2016/10/07 Javascript
浅谈js对象属性 通过点(.) 和方括号([]) 的不同之处
2016/10/29 Javascript
React Native中NavigatorIOS组件的简单使用详解
2018/01/27 Javascript
一个Vue页面的内存泄露分析详解
2018/06/25 Javascript
JS实现移动端触屏拖拽功能
2018/07/31 Javascript
vue中Axios的封装与API接口的管理详解
2018/08/09 Javascript
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
2019/07/20 Javascript
Javascript柯里化实现原理及作用解析
2020/10/22 Javascript
探索node之事件循环的实现
2020/10/30 Javascript
解决await在forEach中不起作用的问题
2021/02/25 Javascript
[54:53]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第二场
2014/05/23 DOTA
[01:51]2014DOTA2国际邀请赛 这个赛场没有失败者VGTi5再见
2014/07/23 DOTA
python爬虫实战之爬取京东商城实例教程
2017/04/24 Python
使用python实现tcp自动重连
2017/07/02 Python
Python从Excel中读取日期一列的方法
2018/11/28 Python
浅谈python的elementtree模块处理中文注意事项
2020/03/06 Python
python pandas利用fillna方法实现部分自动填充功能
2020/03/16 Python
Python 生成短8位唯一id实战教程
2021/01/13 Python
利用HTML5 Canvas制作键盘及鼠标动画的实例分享
2016/03/15 HTML / CSS
使用SVG实现提示框功能的示例代码
2020/06/05 HTML / CSS
爱淘宝:淘宝网购物分享平台
2017/04/28 全球购物
书法培训心得体会
2014/01/05 职场文书
休学证明范本
2015/06/19 职场文书
SpringCloud Alibaba项目实战之nacos-server服务搭建过程
2021/06/21 Java/Android
js中Object.create实例用法详解
2021/10/05 Javascript
《LOL》“克隆大作战”久违归来 幻灵战队皮肤上线
2022/04/03 其他游戏
CSS实现鼠标悬浮动画特效
2023/05/07 HTML / CSS