js 代碼 ...
<!DOCTYPE html> <html> <head> <title>滑動條</title> <meta charset="utf-8"> <meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" /> <script type="text/javascript" src="./hScoll.js"></script> </head> <style> *{ margin: 0; padding: 0; } #content{ margin-top: 50px; width:100%; height: 200px; background: #eeeeee; overflow: hidden; position: relative; /**transform: translate(0px, -70px);*/ } #scoll{ overflow: hidden; } #content2{ margin-top: 50px; width:100%; height: 200px; background: red; overflow: hidden; position: relative; /**transform: translate(0px, -70px);*/ } #scoll2{ overflow: hidden; } .scrollbars{ position: absolute; height: 100%; right: 0; top: 0; width: 5px; border-radius: 5px; } .scollb{ position: absolute; right: 0; top: 0; width: 100%; background: #999999; border-radius: 5px; } </style> <body> <div id="content"> <div id="scoll"> <p>1111</p> <p>2222</p> <p>3333</p> <p>4444</p> <p>5555</p> <p>6666</p> <p>7777</p> <p>8888</p> <p>9999</p> <p>0000</p> <p>aaaa</p> <p>bbbb</p> <p>cccc</p> <p>dddd</p> <p>eeee</p> </div> </div> </body> <script> var options ={ interactiveScrollbars:true } window.hScoll.buildScoll('content',options); </script> </html>
js 代碼
/** * Created by hechao on 2017/6/25. */ (function(){ /**添加window對象hScoll屬性*/ window.hScoll = { buildScoll:function(el,options){ App.init(el,options); } } var App = { /**初始化組件*/ init:function(el,option){ App.options = option; App.prevY = 0; App.el = document.getElementById(el); App.scoll = this.el.children[0]; App.h = this.el.offsetHeight;//滑動範圍高度 App.ch = this.el.scrollHeight;//內容的高度 if(parseFloat(this.h)<=parseFloat(this.ch)){ App.sdiv = document.createElement('div'); App.scollb = document.createElement('div'); App.sdiv.setAttribute('class','scrollbars'); App.scollb.setAttribute('class','scollb'); App.scollb.style.height = parseFloat(this.h)*parseFloat(this.h)/parseFloat(this.ch) + 'px'; App.el.appendChild(this.sdiv); App.sdiv.appendChild(this.scollb); App.initevent(); } }, /**綁定事件*/ initevent:function (){ App.el.addEventListener('touchstart', App.touchstart, false); App.el.addEventListener('touchmove', App.touchmove, false); App.el.addEventListener('touchend', App.touchend, false); }, /**記錄滑動初始位置*/ touchstart:function(e){ var point = App.getPoint(e); App.startY = point.pageY; }, /**手指移動時,滾動條滾動*/ touchmove:function(e){ e.preventDefault();//阻止預設行為 var point = App.getPoint(e); App.moveY = point.pageY; App.deltaY = App.startY - App.moveY; if((App.prevY - App.deltaY)<=0 && (App.prevY - App.deltaY)>= -(App.ch-App.h)){ App.domove(App.prevY - App.deltaY); } if(App.options.interactiveScrollbars){ App.domove2(App.prevY - App.deltaY); }else{ if((App.prevY - App.deltaY)<=0 && (App.prevY - App.deltaY)>= -(App.ch-App.h)){ App.domove2(App.prevY - App.deltaY); } } }, /**手指離開時,判斷位置*/ touchend:function(e){ App.prevY = App.prevY - App.deltaY; if(App.prevY >= 0){ App.prevY = 0; App.domove(App.prevY,true); App.domove2(App.prevY,true); } if(App.prevY <= -(App.ch-App.h)){ App.prevY = -(App.ch-App.h); App.domove(App.prevY,true); App.domove2(App.prevY,true); } }, getPoint:function (e) { return e.touches ? e.touches[0] : e; }, /**內容滑動*/ domove:function (y,t){ if(t){ App.scoll.setAttribute('style', 'transform: translate(0px, '+y+'px);transition:transform 300ms ease'); }else{ App.scoll.setAttribute('style', 'transform: translate(0px, '+y+'px);transition:transform 0ms ease'); } }, /**滾動條滑動*/ domove2:function(y,t){ if(t){ App.scollb.setAttribute('style', 'transform: translate(0px, '+-parseFloat(y)*parseFloat(App.h)/parseFloat(App.ch)+'px);transition:transform 0ms ease;height:'+parseFloat(App.h)*parseFloat(App.h)/parseFloat(App.ch) + 'px'+''); }else{ App.scollb.setAttribute('style', 'transform: translate(0px, '+-parseFloat(y)*parseFloat(App.h)/parseFloat(App.ch)+'px);transition:transform 0ms ease;height:'+parseFloat(App.h)*parseFloat(App.h)/parseFloat(App.ch) + 'px'+''); } } } })();