<!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,在滚动条事件内是不会变的。