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

返回顶部是经常会见到的效果,代码比较简单,使用2个对象和一个主函数。职责明确方便复用。在性能方面考虑了由于连续触发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模拟。不过很有很多网站都它进行了降级处理。

posted @ 2011-12-31 10:05  rentj  阅读(565)  评论(0编辑  收藏  举报