<!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>Document</title>
<style>
* {
margin: 0;
padding: 0;
list-style: none;
}
.box {
position: relative;
width: 100vw;
height: 100vh;
overflow: hidden;
}
.fullpage {
position: absolute;
top: 0;
left: 0;
}
section {
width: 100vw;
height: 100vh;
font-size: 80px;
display: flex;
justify-content: center;
align-items: center;
color: #fff;
}
.section_1 {
background-color: aqua;
}
.section_2 {
background-color: skyblue;
}
.section_3 {
background-color: darksalmon;
}
.section_4 {
background-color: red;
}
.section_5 {
background-color: forestgreen;
}
ul {
position: absolute;
right: 20px;
top: 50%;
transform: translateY(-50%);
width: 18px;
/* height: 100px; */
border-radius: 5px;
background-color: rgba(255, 255, 255, .7);
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
}
ul li {
width: 10px;
height: 10px;
border-radius: 50%;
background-color: skyblue;
}
ul .active {
background-color: red;
}
</style>
</head>
<body>
<div class="box">
<div class="fullpage">
<section class="section_1">
有在好好生活
</section>
<section class="section_2">
过程用心 结果随缘
</section>
<section class="section_3">
家人闲坐 灯火可亲
</section>
<section class="section_4">
我将归来 万马千军
</section>
<section class="section_5">
放弃一定不难 但坚持很酷
</section>
</div>
<!-- 小圆点 -->
<ul>
<!-- <li class="active"></li>
<li></li>
<li></li>
<li></li>
<li></li> -->
</ul>
</div>
<script src="../tools.js"></script>
<script>
// 获取元素
const wrap = document.querySelector(‘.fullpage‘);
const sections = document.querySelectorAll(‘section‘);
const ul = document.querySelector(‘ul‘)
// 动态设置小圆点
for (let i = 0; i < sections.length; i++) {
var li = document.createElement(‘li‘)
if (i == 0) {
li.classList.add(‘active‘);
}
ul.appendChild(li)
}
// 动态设置小圆点父盒子的宽 ul
ul.style.height = li.offsetHeight * ul.children.length * 2 + ‘px‘
// 给wrap设置一个动态高度
wrap.style.height = sections.length * wrap.firstElementChild.offsetHeight + ‘px‘
// 获取滚动条的高度 让鼠标滚动一视口的高
// 视口高的索引
var index = 0
// 获取浏览器的视口高
var wh = window.innerHeight
// 为了防止动画未完成 点击过快造成的抖动 而加锁
var flag = true
// 添加一个鼠标滚轮事件
window.onmousewheel = function (e) {
if (!flag) {
return
}
flag = false
// var e = window.event || e
if (e.deltaY > 0) {
index++
// deltaY 大于0是 向下
if (index > sections.length - 1) {
index = sections.length - 1
}
move(wrap, {
top: -index * wh
}, function () {
// 动画完成后在执行小圆点跟随
// 让小圆点随着屏的变动而变动
for (let i = 0; i < ul.children.length; i++) {
ul.children[i].classList.remove(‘active‘);
}
ul.children[index].classList.add(‘active‘)
flag = true
})
} else {
index--;
if (index < 0) {
index = 0
}
move(wrap, {
top: -index * wh
}, function () {
// 动画完成后在执行小圆点跟随
// 让小圆点随着屏的变动而变动
for (let i = 0; i < ul.children.length; i++) {
ul.children[i].classList.remove(‘active‘);
}
ul.children[index].classList.add(‘active‘)
flag = true
})
}
}
// 点击小圆点
for (let i = 0; i < ul.children.length; i++) {
ul.children.onclick = function () {
if (!flag) {
return
}
flag = false
index = i;
move(wrap, {
top: -index * wh
}, function () {
// 动画完成后在执行小圆点跟随
// 让小圆点随着屏的变动而变动
for (let i = 0; i < ul.children.length; i++) {
ul.children[i].classList.remove(‘active‘);
}
ul.children[index].classList.add(‘active‘)
flag = true
})
}
}
/*
封装获取样式的函数
@ ele 元素
@ attr 属性
*/
function getStyle(ele,attr) {
if (window.getComputedStyle) {
return parseInt(window.getComputedStyle(ele)[attr])
} else {
// 因为attr是个变量不是一个字符串 所以不能直接 .键 要用[]
return parseInt(ele.currentStyle[attr])
}
}
/*
运动封装方法
@ele 运动的元素
@aObj 对象 key是运动的属性 value是运动的目标值(终点)
@cb是一个回调函数
*/
function move(ele, aObj, cb) {
var obj = {}
for (let attr in aObj) {
obj[attr] = setInterval(() => {
// 要获取动态的当前位置
let oldStyle = getStyle(ele, attr)
let step = (aObj[attr] - oldStyle) / 10;
// 判断step为正负?
step > 0 ? step = Math.ceil(step) : step = Math.floor(step)
// 判断是否走到目标位置
if (oldStyle === aObj[attr]) {
clearInterval(obj[attr])
delete obj[attr];
if (isEmptyObj(obj)) {
// 对象为空 动画结束
cb() // 使用则个函数
}
} else {
// 没走到目标位置
ele.style[attr] = oldStyle + step + ‘px‘
}
}, 30);
}
}
// 3.通过ES6新增的一个Object.keys()方法
function isEmptyObj(obj) {
if (Object.keys(obj).length == 0) {
return true;
} else {
return false;
}
}
</script>
</body>
</html>