<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>原生js滚动条案例</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.w {
width: 1200px;
}
.herder {
height: 150px;
background: green;
margin: 0 auto;
text-align: center;
}
.banner {
position: relative;
height: 300px;
background: blue;
margin: 10px auto;
text-align: center;
}
.main {
height: 1000px;
background: pink;
margin: 10px auto;
text-align: center;
}
.footer {
height: 800px;
margin: 10px auto;
text-align: center;
background: hotpink;
}
.slider_bar {
position: absolute;
right: 300px;
top: 330px;
width: 50px;
height: 100px;
background: orange;
}
span {
display: none;
position: absolute;
bottom: 0;
cursor: pointer;
}
</style>
</head>
<body>
<div class="slider_bar">
<span class="goBack">返回顶部</span>
</div>
<div class="herder w">头部区域</div>
<div class="banner w">banner区域</div>
<div class="main w">main主题部分</div>
<div class="footer w">底部区域</div>
<script>
/* 1.需要用到页面滚动事件scroll 因为是页面滚动,所以事件源是document
2.滚动到某个位置,就是判断页面被卷进去的上部值
3.页面被卷进去的头部:可以通过window.pageYOffset获得 如果是被卷进去左侧window.pageXOffset
4.注意:元素被卷进去的头部是element.scrollTop,如果是页面被卷进去的头部则是window.pageYOffset */
//1.先获取元素
let slider_bar = document.querySelector(".slider_bar");
let banner = document.querySelector(".banner");
//banner.offsetTop就是被卷进去头部的大小 一定要写到滚动的外面
let bannerTop = banner.offsetTop;
//当我们侧边栏固定定位之后应该的数值
let slider_barTop = slider_bar.offsetTop - bannerTop;
let main = document.querySelector(".main");
let goBack = document.querySelector(".goBack");
let mainTop = main.offsetTop;
//2.页面滚动事件
document.addEventListener("scroll", () => {
//3.进行判断
if (window.pageYOffset >= bannerTop) {
slider_bar.style.position = "fixed";
slider_bar.style.top = slider_barTop + "px";
} else {
slider_bar.style.position = "absolute";
slider_bar.style.top = "330px";
}
//当我们页面滚动main模块返回顶部显示与隐藏
if (window.pageYOffset >= mainTop) {
goBack.style.display = "block";
} else {
goBack.style.display = "none";
}
});
//3.当我们点击了返回顶部模块,就让窗口滚动到最上方
goBack.addEventListener("click", function(){
animate(window, 0, callback)
});
function animate(obj, target, callback) {
window.clearInterval(obj.timer);
obj.timer = window.setInterval(function () {
var step = (target - window.pageYOffset) / 10;
step = step > 0 ? Math.ceil(step) : Math.floor(step);
if (window.pageYOffset == target) {
window.clearInterval(obj.timer);
if (callback) {
callback();
}
} else {
// obj.style.left = window.pageYOffset + step + "px";
window.scroll(0,window.pageYOffset + step);
}
}, 15);
}
</script>
</body>
</html>
原生js滚动条详细方法
于 2022-09-25 18:08:05 首次发布