1.缓动动画原理
缓动动画让元素运动速度有所变化,最常见的是让速度慢慢停下来
思路:
1.让盒子每次移动的距离慢慢变小,速度就会慢慢减下来
2:(目标位置 - 当前位置) / 10 作为每次移动的距离步长
3:停止条件 让盒子当前位置等于目标位置 就停止定时器
4:步长值需要取整
案例
<!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>
div{
position: absolute;
left: 0;
width: 100px;
height: 100px;
background-color: aqua;
}
</style>
</head>
<body>
<button>点击</button>
<div></div>
<script>
// Math.ceil 向上取整 Math.floor 向下取整
//obj 目标对象 target 目标位置
var oDiv = document.querySelector('div');
var oBtn =document.querySelector('button');
function animate(obj,target){
clearInterval(obj.timer);
obj.timer = setInterval(function(){
// 求步长 步长要写到定时器里面
// 步长向上取整 变为1 到最后(目标位置 - 当前位置)小于10时 步长变为1px 1px的移动
var step = Math.ceil((target - obj.offsetLeft) /10);
// console.log(step,1)
if(obj.offsetLeft == target){
clearInterval(obj.timer)
}
// 缓动动画 把每次加1这个步长值改为一个慢慢变小的值
// 步长公式:(目标位置 - 当前位置) / 10
obj.style.left = obj.offsetLeft + step + 'px';
},15)
}
oBtn.addEventListener('click',function(){
animate(oDiv,500)
})
// 匀速动画 盒子当前位置 + 固定的值 1px
// 缓动动画 盒子当前位置 + 变化的值 (目标位置-当前位置)/ 10
</script>
</body>
</html>
2.多个目标值之间移动
让动画从100移动到800,再移动到1000,再移动到500
100--------500 目标值 > 当前位置 步长正值
800---------300 目标值 < 当前位置 步长负值
案例
<!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>
div{
position: absolute;
left: 0;
top: 50px;
width: 100px;
height: 100px;
background-color: aqua;
}
</style>
</head>
<body>
<button class="btn1">100</button>
<button class="btn2">500</button>
<div></div>
<script>
// Math.ceil 向上取整 Math.floor 向下取整
//obj 目标对象 target 目标位置
var oDiv = document.querySelector('div');
var oBtn1 =document.querySelector('.btn1');
var oBtn2 =document.querySelector('.btn2');
function animate(obj,target){
clearInterval(obj.timer);
obj.timer = setInterval(function(){
// 求步长 步长要写到定时器里面
// 步长向上取整 变为1 到最后(目标位置 - 当前位置)小于10时 步长变为1px 1px的移动
var step = (target - obj.offsetLeft) /10;
step = step > 0 ? Math.ceil(step) : Math.floor(step)
// console.log(step,1)
if(obj.offsetLeft == target){
clearInterval(obj.timer)
}
// 缓动动画 把每次加1这个步长值改为一个慢慢变小的值
// 步长公式:(目标位置 - 当前位置) / 10
obj.style.left = obj.offsetLeft + step + 'px';
},15)
}
oBtn1.addEventListener('click',function(){
animate(oDiv,100)
})
oBtn2.addEventListener('click',function(){
animate(oDiv,500)
})
// 匀速动画 盒子当前位置 + 固定的值 1px
// 缓动动画 盒子当前位置 + 变化的值 (目标位置-当前位置)/ 10
</script>
</body>
</html>
3.回调函数
函数作为一个参数,将这个函数作为参数传到另一个函数里面,当那个函数执行完后,再执行传进去的这个函数,这个过程叫回调
<!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>
</head>
<body>
<script>
// b传的是一个函数 就相当于形参的变量值是一个函数
function fn(a,b){
var c = a + 10;
console.log(c)
b()
}
fn(20,function(){
alert(123)
})
</script>
</body>
</html>
<!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>
div{
position: absolute;
left: 0;
top: 50px;
width: 100px;
height: 100px;
background-color: aqua;
}
</style>
</head>
<body>
<button class="btn1">100</button>
<button class="btn2">500</button>
<div></div>
<script>
// Math.ceil 向上取整 Math.floor 向下取整
//obj 目标对象 target 目标位置
var oDiv = document.querySelector('div');
var oBtn1 =document.querySelector('.btn1');
var oBtn2 =document.querySelector('.btn2');
function animate(obj,target,callback){
clearInterval(obj.timer);
obj.timer = setInterval(function(){
// 求步长 步长要写到定时器里面
// 步长向上取整 变为1 到最后(目标位置 - 当前位置)小于10时 步长变为1px 1px的移动
var step = (target - obj.offsetLeft) /10;
step = step > 0 ? Math.ceil(step) : Math.floor(step)
// console.log(step,1)
if(obj.offsetLeft == target){
// 清除定时器------最后执行的代码
clearInterval(obj.timer)
// alert('我到终点了')
// 回调函数写在定时器结束里面
callback && callback()
}
// 缓动动画 把每次加1这个步长值改为一个慢慢变小的值
// 步长公式:(目标位置 - 当前位置) / 10
obj.style.left = obj.offsetLeft + step + 'px';
},15)
}
oBtn1.addEventListener('click',function(){
animate(oDiv,100)
})
oBtn2.addEventListener('click',function(){
animate(oDiv,500,function(){
alert('动画结束了')
})
})
// 匀速动画 盒子当前位置 + 固定的值 1px
// 缓动动画 盒子当前位置 + 变化的值 (目标位置-当前位置)/ 10
</script>
</body>
</html>
4.返回顶部
<!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>
.main{
width: 1000px;
margin: 30px auto;
}
.box1{
height: 300px;
background-color: red;
}
.box2{
height: 500px;
background-color: yellow;
}
.box3{
height: 900px;
background-color: blueviolet;
}
.back{
position: absolute;
left: 80%;
top: 400px;
display: none;
width: 50px;
height: 50px;
background-color: blue;
}
</style>
</head>
<body>
<div class="box1 main"></div>
<div class="box2 main"></div>
<div class="box3 main"></div>
<div class="back"></div>
<script>
// 1 获取元素
var oBack = document.querySelector('.back');
var oBox2 = document.querySelector('.box2');
var oBox2Top = oBox2.offsetTop
document.addEventListener('scroll',function(){
// 我们页面被卷走的头部距离大于等于 黄色盒子 距页面顶部的距离 把back 设置为固定定位
if(window.pageYOffset >= oBox2Top){
oBack.style.position = 'fixed';
oBack.style.display = 'block';
}else{
oBack.style.position = 'absolute';
oBack.style.display = 'none';
}
})
/*
window.scroll (x,y) 想要置于左上角的像素点的横纵坐标
浮动窗口至文档中指定的位置
*/
</script>
</body>
5.轮播图
1.鼠标经过轮播图模块,左右按钮显示,离开左右按钮隐藏;
2.点击右侧按钮一次,图片往左播放一张,以此类推,左侧按钮一样的道理
3.图片播放的同时,小圆点跟着一起播放;
4.点击小圆点还可以播放相应的图片;
5.鼠标不经过轮播图,轮播图会自动播放;
6.鼠标经过轮播图,轮播图自动播放停止;