第一种:通过索引值实现
<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;
}
body {
background-color: #f2f2f2;
}
ul,
li {
list-style: none;
}
.container {
width: 1230px;
margin: 0 auto;
}
.navbar {
background-color: #666;
position: fixed;
top: 400px;
left: 50%;
margin-left: -655px;
text-align: center;
font-size: 12px;
color: #fff;
}
.navbar li {
width: 30px;
padding: 3px;
border-bottom: 1px solid #fff;
}
.navbar .navtab,
.navbar .totop {
padding: 10px 3px;
}
.navbar .navtab {
border-bottom: 1px solid #fff;
background-color: #ff0036;
}
.navbar .totop {
background-color: #999;
}
.content {
height: 800px;
margin-bottom: 20px;
}
.content:nth-child(1) {
background-color: orange;
}
.content:nth-child(2) {
background-color: pink;
}
.content:nth-child(3) {
background-color: skyblue;
}
.content:nth-child(4) {
background-color: yellowgreen;
}
.content:nth-child(5) {
background-color: purple;
}
.content:nth-child(6) {
background-color: teal;
}
.content:nth-child(7) {
background-color: green;
}
.content:nth-child(8) {
background-color: gray;
}
.box {
height: 1000px;
}
.active {
background-color: red;
}
</style>
</head>
<body>
<div class="box"></div>
<div class="container">
<div class="content">天猫超市</div>
<div class="content">天猫国际</div>
<div class="content">打造爱巢</div>
<div class="content">居家生活</div>
<div class="content">户外出行</div>
<div class="content">美丽人生</div>
<div class="content">潮店酷玩</div>
<div class="content">猜你喜欢</div>
</div>
<div class="navbar">
<div class="navtab">导航</div>
<ul class="list">
<li>天猫超市</li>
<li>天猫国际</li>
<li>打造爱巢</li>
<li>居家生活</li>
<li>户外出行</li>
<li>美丽人生</li>
<li>潮店酷玩</li>
<li>猜你喜欢</li>
</ul>
<div class="totop">顶部</div>
</div>
<div class="box"></div>
<script>
let cont = document.querySelectorAll('.content')
let nav = document.querySelectorAll('.list li')
let arrOffsetTop = []
cont.forEach(item => {
arrOffsetTop.push(item.offsetTop)
})
console.log(arrOffsetTop);
let currentIndex = 0;
window.onscroll = function() {
let sctop = document.documentElement.scrollTop || document.body.scrollTop || window.pageYOffset
arrOffsetTop.forEach((item, index) => {
if (item - sctop <= 200 && item >= sctop) {
currentIndex = index;
nav.forEach(item => {
item.classList.remove('active')
})
nav[index].classList.add('active')
}
})
}
nav.forEach((item, index) => {
item.onclick = function() {
nav.forEach(item => {
item.classList.remove('active')
})
this.classList.add('active')
let oftop = cont[index].offsetTop;
let sctop = document.documentElement.scrollTop || document.body.scrollTop || window.pageYOffset
let timer = setInterval(() => {
if (index > currentIndex) {
sctop += 90;
} else if (index < currentIndex) {
sctop -= 90;
} else {
clearInterval(timer)
sctop = oftop
}
document.documentElement.scrollTop = sctop
document.body.scrollTop = sctop;
window.pageYOffset = sctop;
}, 16.7)
}
})
</script>
</body>
</html>
第二种 :通过比较页面滚动的值与内容的值实现
<!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;
}
body {
background-color: #f2f2f2;
}
ul,
li {
list-style: none;
}
.container {
width: 1230px;
margin: 0 auto;
}
.navbar {
background-color: #666;
position: fixed;
top: 400px;
left: 50%;
margin-left: -655px;
text-align: center;
font-size: 12px;
color: #fff;
}
.navbar li {
width: 30px;
padding: 3px;
border-bottom: 1px solid #fff;
}
.navbar .navtab,
.navbar .totop {
padding: 10px 3px;
}
.navbar .navtab {
border-bottom: 1px solid #fff;
background-color: #ff0036;
}
.navbar .totop {
background-color: #999;
}
.content {
height: 800px;
margin-bottom: 20px;
}
.content:nth-child(1) {
background-color: orange;
}
.content:nth-child(2) {
background-color: pink;
}
.content:nth-child(3) {
background-color: skyblue;
}
.content:nth-child(4) {
background-color: yellowgreen;
}
.content:nth-child(5) {
background-color: purple;
}
.content:nth-child(6) {
background-color: teal;
}
.content:nth-child(7) {
background-color: green;
}
.content:nth-child(8) {
background-color: gray;
}
.box {
height: 1000px;
}
.active {
background-color: red;
}
</style>
</head>
<body>
<div class="box"></div>
<div class="container">
<div class="content">天猫超市</div>
<div class="content">天猫国际</div>
<div class="content">打造爱巢</div>
<div class="content">居家生活</div>
<div class="content">户外出行</div>
<div class="content">美丽人生</div>
<div class="content">潮店酷玩</div>
<div class="content">猜你喜欢</div>
</div>
<div class="navbar">
<div class="navtab">导航</div>
<ul class="list">
<li>天猫超市</li>
<li>天猫国际</li>
<li>打造爱巢</li>
<li>居家生活</li>
<li>户外出行</li>
<li>美丽人生</li>
<li>潮店酷玩</li>
<li>猜你喜欢</li>
</ul>
<div class="totop">顶部</div>
</div>
<div class="box"></div>
<script>
let cont = document.querySelectorAll('.content')
let nav = document.querySelectorAll('.list li')
let arrOffsetTop = []
cont.forEach(item => {
arrOffsetTop.push(item.offsetTop)
})
console.log(arrOffsetTop);
let currentIndex = 0;
let timer = null;
window.onscroll = function() {
let sctop = document.documentElement.scrollTop || document.body.scrollTop || window.pageYOffset
arrOffsetTop.forEach((item, index) => {
if (item - sctop <= 200 && item >= sctop) {
currentIndex = index;
nav.forEach(item => {
item.classList.remove('active')
})
nav[index].classList.add('active')
}
})
}
nav.forEach((item, index) => {
item.onclick = function() {
nav.forEach(item => {
item.classList.remove('active')
})
this.classList.add('active')
let oftop = cont[index].offsetTop;
let sctop = document.documentElement.scrollTop || document.body.scrollTop || window.pageYOffset
timer = setInterval(() => {
if (oftop > sctop) {
sctop += 90;
if (sctop > oftop) {
clearInterval(timer)
sctop = oftop;
}
} else if (oftop < sctop) {
sctop -= 90;
if (sctop < oftop) {
clearInterval(timer)
sctop = oftop;
}
} else {
sctop = oftop;
clearInterval(timer)
}
document.documentElement.scrollTop = sctop
document.body.scrollTop = sctop;
window.pageYOffset = sctop;
}, 16.7)
}
})
</script>
</body>
</html>
第三种:通过jqurey实现
<!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;
}
body {
background-color: #f2f2f2;
}
ul,
li {
list-style: none;
}
.container {
width: 1230px;
margin: 0 auto;
}
.navbar {
width: 0px;
height: 0px;
overflow: hidden;
background-color: #666;
position: fixed;
bottom: 200px;
left: 50%;
margin-left: -655px;
text-align: center;
font-size: 12px;
color: #fff;
transition: all .2s;
}
.navbar li {
width: 30px;
padding: 3px;
border-bottom: 1px solid #fff;
}
.navbar .navtab,
.navbar .totop {
padding: 10px 3px;
}
.navbar .navtab {
border-bottom: 1px solid #fff;
background-color: #ff0036;
}
.navbar .totop {
background-color: #999;
}
.content {
height: 800px;
margin-bottom: 20px;
}
.content:nth-child(1) {
background-color: orange;
}
.content:nth-child(2) {
background-color: pink;
}
.content:nth-child(3) {
background-color: skyblue;
}
.content:nth-child(4) {
background-color: yellowgreen;
}
.content:nth-child(5) {
background-color: purple;
}
.content:nth-child(6) {
background-color: teal;
}
.content:nth-child(7) {
background-color: green;
}
.content:nth-child(8) {
background-color: gray;
}
.box {
height: 1000px;
}
.active {
background-color: red;
}
.header{
width: 100%;
height: 80px;
background-color: red;
position: fixed;
top:-90px;
left:0;
transition: all .5s;
}
</style>
</head>
<body>
<div class="box"></div>
<div class="header"></div>
<div class="container">
<div class="content">天猫超市</div>
<div class="content">天猫国际</div>
<div class="content">打造爱巢</div>
<div class="content">居家生活</div>
<div class="content">户外出行</div>
<div class="content">美丽人生</div>
<div class="content">潮店酷玩</div>
<div class="content">猜你喜欢</div>
</div>
<div class="navbar">
<div class="navtab">导航</div>
<ul class="list">
<li>天猫超市</li>
<li>天猫国际</li>
<li>打造爱巢</li>
<li>居家生活</li>
<li>户外出行</li>
<li>美丽人生</li>
<li>潮店酷玩</li>
<li>猜你喜欢</li>
</ul>
<div class="totop">顶部</div>
</div>
<div class="box"></div>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
<script>
let arr = [];
$('.content').each(function (index, item) {
arr.push($(item).offset().top)
})
console.log(arr);
$(window).on('scroll', function () {
let sctop = $(window).scrollTop();
console.log(sctop);
if(sctop >= 600){
$('.header').css({top: 0})
$('.navbar').css({width: 36, height: 385})
}else{
$('.header').css({top: -90})
$('.navbar').css({width: 0, height: 0})
}
arr.forEach((item, index) => {
if (item - sctop <= 200 && item >= sctop) {
$('.list li').eq(index).addClass('active').siblings().removeClass('active')
}
})
})
$('.list li').on('click', function(){
let oftop = $('.content').eq($(this).index()).offset().top;
$('html, body').animate({scrollTop: oftop - 100}, 300)
})
</script>
</body>
</html>