一.动画函数的封装
- 一定要给移动的盒子定位
div {
position: absolute;
left: 0;
width: 100px;
height: 100px;
background-color: pink;
}
- 封装函数
<script>
function move(obj, target){ // obj是元素对象,target是移动像素边界
clearInterval(obj.timeout); // 防止多次点击,使定时器累加,使速度越来越快
obj.timeout = setInterval(function() {
if(obj.offsetLeft >= target) { // 不用带像素单位
clearInterval(obj.timeout);
}
// 启动动画
obj.style.left = obj.offsetLeft + 5 + 'px'; // 注意style的left是小写,offsetLeft是大写
}, 30)
}
var div = document.querySelector("div");
move(div, 400)
</script>
二.函数的封装
- 我们在左边新建一个js文件
- 在HTML头上添加一句
<script src="函数文件名.js"></script>
- 然后就可以在代码中引用了
JS文件中(带缓冲的移动)
function move(obj, target, callback){ // obj是元素对象,target是移动像素边界
clearInterval(obj.timeout); // 防止多次点击,使定时器累加,使速度越来越快
obj.timeout = setInterval(function() {
var step = (target - obj.offsetLeft) / 10;
step = step > 0 ? Math.ceil(step) : Math.floor(step); // 向上取整,向下取整
if(obj.offsetLeft == target) { // 不用带像素单位
clearInterval(obj.timeout);
if(callback){
callback();
}
}
// 启动动画
obj.style.left = obj.offsetLeft + step + 'px'; // 注意style的left是小写,offsetLeft是大写
}, 30)
}
实例 1
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title> 人物表格 </title>
<link rel="stylesheet" href="style.css">
<script src="move.js"></script>
</head>
<body>
<div class="stay">
<div>👉</div>
<span class="go"></span>
</div>
<script>
var btn = document.querySelector(".stay");
var span = document.querySelector(".go");
// 经过触发
btn.addEventListener("mouseenter", function() {
move(span, 100, function() {
btn.children[0].innerHTML = "👈";
});
})
btn.addEventListener("mouseleave", function() { // 使用mouseleave 别用mouseout
move(span, -300, function() {
btn.children[0].innerHTML = "👉";
})
})
</script>
</body>
</html>
CSS
* {
padding: 0px;
margin: 0px;
}
.go {
position: absolute;
left: -300px;
width: 300px;
height: 100px;
background-color: purple;
}
div {
float: left;
text-align: center;
line-height: 100px;
width: 100px;
height: 100px;
background-color: pink;
}
JS
function move(obj, target, callback){ // obj是元素对象,target是移动像素边界
clearInterval(obj.timeout); // 防止多次点击,使定时器累加,使速度越来越快
obj.timeout = setInterval(function() {
var step = (target - obj.offsetLeft) / 10;
step = step > 0 ? Math.ceil(step) : Math.floor(step); // 向上取整,向下取整
if(obj.offsetLeft == target) { // 不用带像素单位
clearInterval(obj.timeout);
if(callback){
callback();
}
}
// 启动动画
obj.style.left = obj.offsetLeft + step + 'px'; // 注意style的left是小写,offsetLeft是大写
}, 30)
}
实例 2:返回顶部
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title> 人物表格 </title>
<link rel="stylesheet" href="style.css">
<script src="move.js"></script>
</head>
<body>
<div class="father">
<div class="one"></div>
<div class="two"></div>
<div class="three"></div>
<div class="four"></div>
<div class="top">👆</div>
</div>
<script>
var top = document.querySelector("top");
top.addEventListener("click", function() {
move(window, 0);
})
</script>
</body>
</html>
CSS
* {
padding: 0px;
margin: 0px;
}
.one {
height: 400px;
margin: 50px;
background-color: pink;
}
.two {
height: 400px;
margin: 50px;
background-color:blue;
}
.three {
height: 400px;
margin: 50px;
background-color: purple;
}
.four {
height: 400px;
margin: 50px;
background-color: orange;
}
.top {
position: fixed;
top: 60%;
left: 95%;
text-align: center;
line-height: 100px;
width: 50px;
height: 100px;
background-color: red;
cursor: pointer;
z-index: 2;
}
JS
function move(obj, target, callback){ // obj是元素对象,target是移动像素边界
clearInterval(obj.timeout); // 防止多次点击,使定时器累加,使速度越来越快
obj.timeout = setInterval(function() {
var step = (target - window.pageYOffset) / 10;
step = step > 0 ? Math.ceil(step) : Math.floor(step); // 向上取整,向下取整
if(window.pageYOffset == target) { // 不用带像素单位
clearInterval(obj.timeout);
if(callback){
callback();
}
}
// 启动动画
window.scroll(0, window.pageYOffset + step); // 使用 scroll 函数进行页面跳转
}, 15)
}