<div class="wrap">
<div class="content"></div>
<div class="scroll">
<div class="bar"></div>
</div>
</div>
* {
margin: 0;
padding: 0;
user-select: none;
}
.wrap {
overflow: hidden;
position: relative;
width: 400px;
height: 600px;
background-color: #f1f1f1;
margin: 10px auto;
box-shadow: 0 0 10px red;
}
.content {
position: absolute;
left: 0;
top: 0;
width: 380px;
padding: 10px;
line-height: 30px;
text-indent: 2em;
}
.scroll {
position: absolute;
top: 0;
right: 0;
width: 16px;
height: 600px;
background-color: #ccc;
}
.bar {
position: absolute;
width: 16px;
border-radius: 10px;
background-color: #333;
}
var oWrap = document.querySelector('.wrap');
var oContent = document.querySelector('.content');
var oScroll = document.querySelector('.scroll');
var oBar = document.querySelector('.bar');
var rate = 0;
//初始函数
initSCroll();
function initSCroll() {
//初始bar的高度;
oBar.style.height = oWrap.offsetHeight / oContent.offsetHeight * oScroll.offsetHeight + 'px';
//内容展示比例
rate = (oContent.offsetHeight - oWrap.offsetHeight) / (oScroll.offsetHeight - oBar.offsetHeight);
};
var eventTypeMap = {
isDown: false,
startPos: {
y: 0,
top: 0
},
'mousedown': function(e) {
this.isDown = true;
this.startPos.y = e.clientY;
this.startPos.top = oBar.offsetTop;
},
'mousemove': function(e) {
if (!this.isDown) {
return false;
}
var _y = e.clientY - this.startPos.y + this.startPos.top;
scrollBar(_y);
},
'mouseup': function(e) {
if (!this.isDown) {
return false;
}
this.isDown = false;
},
'mousewheel': function(e) {
var _y = oBar.offsetTop;
if (e.wheelDelta > 0) {
_y -= 10;
} else {
_y += 10;
}
scrollBar(_y);
}
};
//事件
oBar.addEventListener('mousedown', eventSort, false);
document.addEventListener('mousemove', eventSort, false);
document.addEventListener('mouseup', eventSort, false);
oBar.addEventListener('mousewheel', eventSort, false);
//事件分流
function eventSort(e) {
if (eventTypeMap[e.type] && typeof eventTypeMap[e.type] === 'function') {
eventTypeMap[e.type](e);
}
};
function scrollBar(_y) {
_y = Math.max(0, _y);
_y = Math.min(_y, oScroll.offsetHeight - oBar.offsetHeight);
oBar.style.top = _y + 'px';
oContent.style.marginTop = -_y * rate + 'px';
}