.test{
width: 300px;
height: 100px;
overflow: auto;
}
于是我们可能与我们的界面不搭,或则不好看,不符合…那么可以自己自定义一个。或则,希望自己有一双发现美的卡姿兰大眼睛…
这里的思路不是指马克思主义道路,指我们可以大概思考一下代码怎样的实现…
一个大容器放左边一个容器,右边一个,左边容器放超出的内容(测试文本尽可能多点);右边容器放滚动条
<div class="box">
<div class="left_con">
<div class="box_text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris facilisis enim libero, at lacinia diam fermentum id. Pellentesque habitant morbi tristique senectus et netus.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris facilisis enim libero, at lacinia diam fermentum id. Pellentesque habitant morbi tristique senectus et netus.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris facilisis enim libero, at lacinia diam fermentum id. Pellentesque habitant morbi tristique senectus et netus.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris facilisis enim libero, at lacinia diam fermentum id. Pellentesque habitant morbi tristique senectus et netus.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris facilisis enim libero, at lacinia diam fermentum id. Pellentesque habitant morbi tristique senectus et netus.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris facilisis enim libero, at lacinia diam fermentum id. Pellentesque habitant morbi tristique senectus et netus.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris facilisis enim libero, at lacinia diam fermentum id. Pellentesque habitant morbi tristique senectus et netus.结尾处
div>
div>
<div class="right_con">
<div class="box_scroll">div>
div>
div>
如果没有定位需要在盒子中设置
let boxText = document.querySelector('.box_text')
let leftCon = document.querySelector('.left_con')
let rightCon = document.querySelector('.right_con')
let boxScroll = document.querySelector('.box_scroll')
let textH = boxText.scrollHeight
let leftH = leftCon.offsetHeight
let rightH = rightCon.offsetHeight
boxScroll.style.height = parseInt(leftH/textH*rightH) + 'px'
1.也可以自己在css设置一个高度,最后通过左边的滚动距离来算出,当滚动条滚动的距离,根据比例算出滚动内容应该滚动的距离
3. 当鼠标在滚动条按下的时候,获取一些主要的信息
let bool = false //设置开启滚动条是否可以滚动
let startY //记录每一次鼠标开启的初始位置
boxScroll.onmousedown = function(e){
// 3.1 对e做以下兼容
e = window.event || e
bool = true //开启滚动
startY = e.pageY //记录鼠标按下的初始位置
}
// 按住滚动条boxScroll时,滚动条随着移动
document.onmousemove = function(e){
//滚动条随着移动
if(!bool){
return
}
boxScroll.style.top = e.pageY - startY + 'px'
}
let barY //滚动条的滚动距离
......
barY = e.pageY - startY
if(barY<0){
barY = 0
}else if(barY>rightH-boxScroll.clientHeight){
barY = rightH-boxScroll.clientHeight
}
boxScroll.style.top = barY + 'px'
boxScroll.style.top = barY + 'px'
boxText.style.top = -barY *(rightH/boxScroll.clientHeight) + 'px'
let endY = 0 //初始化为0
document.onmouseup = function(e){
bool = false //滚动完毕
endY = boxScroll.offsetTop //此时记录滚动条的位置,为下次滚动不回使得滚动条回到0
}
window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty()
这是兼容写法,其实是选中后又取消
<script>
let boxText = document.querySelector('.box_text')
let leftCon = document.querySelector('.left_con')
let rightCon = document.querySelector('.right_con')
let boxScroll = document.querySelector('.box_scroll')
let textH = boxText.scrollHeight //768
let leftH = leftCon.offsetHeight //500
let rightH = rightCon.offsetHeight
boxScroll.style.height = parseInt(leftH/textH*rightH) + 'px'
let bool = false
let startY
let barY
let endY = 0
// let scrollT
boxScroll.onmousedown = function(e){
e = window.event || e
bool = true
startY = e.pageY
}
document.onmousemove = function(e){
e = window.event || e
if(!bool){
return
}
barY = e.pageY - startY + endY
if(barY<0){
barY = 0
}else if(barY>rightH-boxScroll.clientHeight){
barY = rightH-boxScroll.clientHeight
}
boxScroll.style.top = barY + 'px'
boxText.style.top = -barY *(rightH/boxScroll.clientHeight) + 'px'
window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty()
}
document.onmouseup = function(e){
bool = false
endY = boxScroll.offsetTop
}
</script>
可以给内容添加滚轮事件,然后内容滚动,滚动条跟着滚动;可能有更简单的思路;不同结构实现的方式可能不一致
isScroll
[better-scroll](https://ustbhuangyi.github.io/better-scroll/doc/zh-hans/#better-scroll 是什么)