zoukankan      html  css  js  c++  java
  • 常见效果实现之返回顶部(结合淡入、淡出、减速滚动)

    返回顶部是经常会见到的效果,代码比较简单,使用2个对象和一个主函数。职责明确方便复用。在性能方面考虑了由于连续触发onscroll事件,频繁调用回调函数而产生的性能问题。可以将回调函数缓存一段时候后执行,即当这段时间内多次触发了onscroll事件,但回调函数只会执行一次。 

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="gb2312" />
    <title>结合淡入/淡出/减速运动效果实现的返回顶部功能</title>
    <style>
    .fixed{
    	position:fixed; bottom:100px; 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模拟。不过很有很多网站都它进行了降级处理。

  • 相关阅读:
    HDU 5716 带可选字符的多字符串匹配(ShiftAnd)
    挑战程序设计竞赛 2.2 一往直前!贪心法
    再叩首
    2016 Multi-University Training Contest 1 总结
    2016 Multi-University Training Contest 2 总结
    2016 Multi-University Training Contest 3 总结
    2016 Multi-University Training Contest 4 总结
    2016 Multi-University Training Contest 5&6 总结
    2016 Multi-University Training Contest 7 总结
    2016 Multi-University Training Contest 8 总结
  • 原文地址:https://www.cnblogs.com/rentj1/p/2308443.html
Copyright © 2011-2022 走看看