ScrollBar.js是一个仅仅120行的滚动条JS插件,使用非常方便
详情阅读:https://git.oschina.net/wuquanyao/scrollbar.js
/*=================================
* ScrollBar.js beta
* Author:wuquanyao
* Email:wqynqa@163.com
*=================================*/
var ScrollBar = {};
(function(ScrollBar){
var parent,root,track,bar,tx,ch,h,sh,rate;
ScrollBar.adapter = function(config)
{
init(config);
}
function init(config)
{
parent = document.querySelector(config['selector']);
root = parent.parentNode;
createBar();
mouseaction();
}
function createBar()
{
track = document.createElement('div');
track.setAttribute('class','scroll-track');
bar = document.createElement('div');
bar.setAttribute('class','scroll-bar');
track.appendChild(bar);
root.appendChild(track);
sh = root.scrollHeight;
ch = root.offsetHeight;
tx = root.offsetTop;
h = ch/sh*ch;
if(h<30){
bar.style.height = '30px';
h = 30;
}else{
bar.style.height = h+'px';
}
rate = (sh-ch)/(ch-h);
}
function mouseaction()
{
function eventparse(obj,type,func){
if(document.attachEvent){
var events = {
click:'onclick',
mouseover:'onmouseover',
mousemove:'onmousemove',
mouseout:'onmouseout',
mousedown:'onmousedown',
mouseup:'onmouseup',
wheel:'DOMMouseScroll'
};
obj.attachEvent(events[type],func);
}else{
var events = {
click:'click',
mouseover:'mouseover',
mousemove:'mousemove',
mouseout:'mouseout',
mousedown:'mousedown',
mouseup:'mouseup',
wheel:'DOMMouseScroll'
};
obj.addEventListener(events[type],func,false);
}
}
function init(){
var bool = false,v;
eventparse(bar,'mousedown',function(event){
bool = true;
});
eventparse(document,'mousemove',function(event){
if(bool){
if(event.clientY<=(tx+10)){
v = 0;
}else if(event.clientY>=(tx+ch-h)){
v = tx+ch-h;
}else{
v = event.clientY;
}
parent.style.transform = 'translate(0px,'+(-v*rate)+'px)';
bar.style.transform = 'translateY('+v+'px)';
}
});
eventparse(document,'mouseup',function(event){
bool = false;
});
// eventparse(track,'click',function(event){
// event.stopPropagation();
// bar.style.transition = 'all 0ms ease 0ms';
// if(event.clientY<(tx+h)){
// bar.style.transform = 'translate(0px,0px)';
// }else if(event.clientY>=(tx+ch-h)){
// bar.style.transform = 'translate(0px,'+(tx+ch-h)+'px)';
// }else{
// bar.style.transform = 'translate(0px,'+(event.clientY-h/2)+'px)';
// }
// parent.style.transform = 'translate(0px,'+((-event.clientY+tx)*rate)+'px)';
// });
var offset=0;
if (window.navigator.userAgent.indexOf("Firefox") >= 0) {
eventparse(parent,'wheel',wheelEvent);
}else{
parent.onmousewheel=parent.onmousewheel=wheelEvent;
}
function wheelEvent(e){
var transform,bO,wv = (e.detail/3*20) || (-(e.wheelDelta/120*20));
if((offset<(sh-ch) &&(offset>=0))){
transform = 'translate(0px,'+(-offset)+'px)';
bO = 'translateY('+(offset/rate)+'px)';
offset = ((offset+wv)>(sh-ch))?offset:( ((offset+wv)<=0)?0:(offset+wv) );
}
bar.style.transform = bO;
parent.style.transform = transform;
}
}
init();
}
})(ScrollBar);