常见效果实现之返回顶部(结合淡入、淡出、减速滚动)
来源:广州中睿信息技术有限公司官网
发布时间:2012/10/21 23:25:16 编辑:admin 阅读 434
返回顶部是经常会见到的效果,代码比较简单,使用2个对象和一个主函数。职责明确方便复用。在性能方面考虑了由于连续触发onscroll事件,频繁调用回调函数而产生的性能问题。可以将回调函数缓存一段时候后

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

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

联系我们CONTACT 扫一扫
愿景:成为最专业的软件研发服务领航者
中睿信息技术有限公司 广州•深圳 Tel:020-38931912 务实 Pragmatic
广州:广州市天河区翰景路1号金星大厦18层中睿信息 Fax:020-38931912 专业 Professional
深圳:深圳市福田区车公庙有色金属大厦509~510 Tel:0755-25855012 诚信 Integrity
所有权声明:PMI, PMP, Project Management Professional, PMI-ACP, PMI-PBA和PMBOK是项目管理协会(Project Management Institute, Inc.)的注册标志。
版权所有:广州中睿信息技术有限公司 粤ICP备13082838号-2