自定义滚动条

<!DOCTYPE html>
<html>

<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        .box {
            width: 300px;
            height: 500px;
            border: 1px solid red;
            margin: 100px;
            position: relative;
        }

        .content {
            height: auto;
            padding: 5px 18px 5px 5px;
            position: absolute;
            top: 0;
            left: 0;
        }

        .scroll {
            width: 18px;
            height: 100%;
            position: absolute;
            top: 0;
            right: 0;
            background-color: #eee;
        }

        .bar {
            width: 100%;
            height: 100px;
            background-color: red;
            cursor: pointer;
            border-radius: 10px;
            position: absolute;
            top: 0;
            left: 0;
        }
    </style>
</head>

<body>
    <div class="box" id="box">
        <div class="content">
            文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分
            文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分
            文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分
            文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分
            文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分
            文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内
            文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分
            文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分
            文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分文字内容部分

        </div>
        <div class="scroll">
            <div class="bar"></div>
        </div>
    </div>
</body>

</html>
<script>
    //获取dom对象
    var box = document.getElementById("box");
    var content = box.children[0];
    var scroll = box.children[1];
    var bar = scroll.children[0];
    // 滚动条初始状态的长度 =  (盒子高度 / 内容高度 X 盒子高度)
    bar.style.height = box.offsetHeight / content.offsetHeight * box.offsetHeight + "px";
    // 鼠标按下事件
    bar.onmousedown = function (e) {
        var e = e || window.e;
        // 鼠标按下时距离滚动条上方的位置
        var y = e.clientY - this.offsetTop;
        // 鼠标移动事件
        document.onmousemove = function (e) {
            var e = e || window.e;
            // 滚动条移动距离
            var barTop = e.clientY - y;
            // 如果距离上方距离小于0,无法移动
            if (barTop < 0) {
                barTop = 0;
            }
            // 大于盒子的高度 - 滚动条的高度也无法移动
            if (barTop > box.offsetHeight - bar.offsetHeight) {
                barTop = box.offsetHeight - bar.offsetHeight
            }
            bar.style.top = barTop + "px";
            //禁止选择文字
            window.getSelection() ? window.getSelection().removeAllRanges() : document.selection.empty();
            // 内容盒子移动的距离 =(内容的高度 - 盒子的高度)/ (盒子的高度 - 滚动条的高度)*  滚动条移动的距离
            var cy = (content.offsetHeight - box.offsetHeight)  / (box.offsetHeight - bar.offsetHeight) * barTop;
            content.style.top = - cy + "px";
        }
        // 鼠标弹起清除移动事件
        document.onmouseup = function () {
            this.onmousemove = null;
        }
    }
</script>

两个算法:

  • 滚动条初始状态的长度 = 盒子高度 / 内容高度 * 盒子高度
  • 内容盒子移动的距离 =(内容的高度 - 盒子的高度)/ (盒子的高度 - 滚动条的高度)* 滚动条移动的距离
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容