首页 > 代码库 > js源生惯性滚动与回弹(备用)

js源生惯性滚动与回弹(备用)

js源生惯性滚动与回弹(备用)

<!DOCTYPE html><html lang="zh-CN"> <head>  <meta charset="UTF-8" />  <meta name="Keywords" content="" />  <meta name="Description" content="" />  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />  <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" />  <meta name="apple-mobile-web-app-capable" content="yes" />  <meta content="telephone=no" name="format-detection" />  <meta content="email=no" name="format-detection" />  <title>Document</title>  <style>    body{margin:0;padding:0;}    div{position:relative;width:200px;height:300px;margin:3em auto;border:1px solid #CCC;overflow:hidden;-webkit-user-select:none;user-select:none;}    ol{width:100%;}    ol>li{height:30px;}  </style> </head> <body>  <div>    <ol>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>    </ol>  </div>  <script>   function myScroll(ctx){     var ol=ctx.firstElementChild||ctx.firstChild,        offset=50,        cur=0,        isDown=false,        vy=0,        isInTransition=false;        ctx.addEventListener("mousedown",function(e){            if(isInTransition)return;            clearTimeout(this._timer);            vy=0;            this._oy=e.clientY-cur;            this._cy=e.clientY;            this._oh=this.scrollHeight;            this._ch=this.clientHeight;            this._startTime=e.timeStamp;            isDown=true;        });        ctx.addEventListener("mousemove",function(e){            if(isDown)          {             if(e.timeStamp-this._startTime>40)            {               this._startTime=e.timeStamp;               cur=e.clientY-this._oy;               if(cur>0)              {                cur*=0.4;                            }              else if(cur<this._ch-this._oh)              {                cur=(cur+this._oh-this._ch)*0.4-this._oh+this._ch;               }               setPos(cur);            }             vy=e.clientY-this._cy;             this._cy=e.clientY;          }        },false);                ctx.addEventListener("mouseleave",mleave,false);        ctx.addEventListener("mouseup",mleave,false);        function setPos(y){          ol.style.transform="translateY("+y+"px) translateZ(0)";        }                function ease(target){               isInTransition=true;                      ctx._timer=setInterval(function(){             cur-=(cur-target)*0.2;             if(Math.abs(cur-target)<1)             {               cur=target;               clearInterval(ctx._timer);               isInTransition=false;             }             setPos(cur);                       },20);        }        function mleave(e){          if(isDown)          {            isDown=false;            var t=this,friction=((vy>>31)*2+1)*0.5,oh=this.scrollHeight-this.clientHeight;            this._timer=setInterval(function(){              vy-=friction;              cur+=vy;              setPos(cur);              if(-cur-oh>offset)              {                                clearTimeout(t._timer);                ease(-oh);                return;              }              if(cur>offset)              {                clearTimeout(t._timer);                ease(0);                return;              }              if(Math.abs(vy)<1)              {                  clearTimeout(t._timer);                if(cur>0)                {                  ease(0);                  return;                }                if(-cur>oh)                {                   ease(-oh);                   return;                }              }            },20);          }        }   }   myScroll(document.querySelector("div"));  </script> </body></html>

 

js源生惯性滚动与回弹(备用)