跟随滚动条变化的进度条

299 阅读1分钟
 <!DOCTYPE html>
 <html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
    * {
        margin: 0;
        padding: 0;
    }
    .progressbar {
        height: 3px;
        background: skyblue;
        position: fixed;
        top: 0;
        left: 0;
        width: 30%;
    }
</style>
</head>
<body>
<div class="progressbar"></div>
<div style="height: 500px;"></div>
<div class="demo" style="height:100px;background:#000;top:0;width:100%"></div>
<div style="height:2000px">
</div>
<script>
 let demo = document.querySelector('.demo')
 let offsetTop = demo.offsetTop
    window.onscroll = () => {
        let scrollTop = Math.floor(document.documentElement.scrollTop)
        console.log(scrollTop,offsetTop);
        let maxScrollTop = document.body.offsetHeight - window.innerHeight
        let percent = (scrollTop * 100 / maxScrollTop) + '%'
        document.querySelector('.progressbar').style.width = percent

        if (scrollTop > offsetTop) {
            demo.style.position = 'fixed'
        } else {
            demo.style.position = 'static'
        }

    }
</script>
</body>
</html>

注意:let offsetTop = demo.offsetTop
要定义在滚动条滚动事件外,如果定义在里面,每次触发滚动条事件就会重新定义
let offsetTop = demo.offsetTop,而当scrollTop > offsetTop为true后,dome固定定位offsetTop===0;
这就会出现scrollTop ===0时dome才会为默认,即回到原位。定义在外面则不会有这个问题,
let offsetTop = demo.offsetTop===500,在滚动条事件内是不会变的。