缓速动画的封装
function slowMOVE(ele, attrs, callback) {
//开启新的定时器之前先清除定时器
clearInterval(ele.timeID);
//3.开启定时器
ele.timeID = setInterval(function() {
/*
开关思想:
1.提出假设
2.验证假设
3.根据变量的结果做出操作
*/
//提出假设
var isAll = true;
//验证假设
//遍历传入的所有属性
for (var key in attrs) {
var attr = key;
var target = attrs[key];
if (attr == "zIndex"||attr=="backgroundColor") {
ele.style[attr] = target;
} else if (attr == "opacity") {
//3.1.获取元素位置
//offsetLeft 获取属性值:获取到的只是数字类型的
//透明度是小数 不适合进行运算 所以扩大100倍
//透明度是小数,所以使用parseFloat
var currentLeft = (parseFloat(getEleStyle(ele, attr)))*100;
//3.2.开始移动(在原本的位置上缓速移动)
var speed = (target*100 - currentLeft) / 10;
//消除误差
// if(speed>0){
// speed=Math.ceil(speed);
// }else{
// speed=Math.floor(speed);
// }
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
currentLeft += speed;
//3.3将移动到的当前位置赋值给 box.style.left
ele.style[attr] = currentLeft/100;
//4.终点检测
if (currentLeft != target) {
isAll = false;
}
}else {
//3.1.获取元素位置
//offsetLeft 获取属性值:获取到的只是数字类型的
//而window.getComputedStyle方法获取到的是带单位的字符串
var currentLeft = parseInt(getEleStyle(ele, attr));
//3.2.开始移动(在原本的位置上缓速移动)
var speed = (target - currentLeft) / 10;
//消除误差
// if(speed>0){
// speed=Math.ceil(speed);
// }else{
// speed=Math.floor(speed);
// }
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
currentLeft += speed;
//3.3将移动到的当前位置赋值给 box.style.left
ele.style[attr] = currentLeft + "px";
//4.终点检测
if (currentLeft != target) {
isAll = false;
}
}
}
//根据变量的值,给出结果
if (isAll) {
//停止运动:清除定时器
clearInterval(ele.timeID);
callback();
}
}, 50)
}
//IE8兼容
function getEleStyle(ele, attr) {
//做浏览器能力检测
if (window.getComputedStyle) {
var style = window.getComputedStyle(ele, null);
return style[attr];
} else {
return ele.currentStyle[attr];
}
}
</script>
</html>
案例一:360开机动画
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<style type="text/css">
#father{
position:fixed;
bottom: 0;
right: 0;
}
#box1 {
width: 322px;
height: 244px;
background-image: url(img/t.jpg);
cursor: pointer;
}
#box2 {
width: 322px;
height: 101px;
background-image: url(img/b.jpg);
}
</style>
</head>
<body>
<div id="father">
<div id="box1"></div>
<div id="box2"></div>
</div>
</body>
<script type="text/javascript">
//获取元素
var box1 = document.getElementById("box1");
var box2 = document.getElementById("box2");
var father=document.getElementById("father")
box1.onclick = function() {
slowMOVE(box2, {
height: 0
},function() {
slowMOVE(father, {
width: 0
})
});
}
//封装
function slowMOVE(ele, attrs, callback) {
//开启新的定时器之前先清除定时器
clearInterval(ele.timeID);
//3.开启定时器
ele.timeID = setInterval(function() {
/*
开关思想:
1.提出假设
2.验证假设
3.根据变量的结果做出操作
*/
//提出假设
var isAll = true;
//验证假设
//遍历传入的所有属性
for (var key in attrs) {
var attr = key;
var target = attrs[key];
//3.1.获取元素位置
//offsetLeft 获取属性值:获取到的只是数字类型的
//而window.getComputedStyle方法获取到的是带单位的字符串
var currentLeft = parseInt(getEleStyle(ele, attr));
//3.2.开始移动(在原本的位置上缓速移动)
var speed = (target - currentLeft) / 10;
// if(speed>0){
// speed=Math.ceil(speed);
// }else{
// speed=Math.floor(speed);
// }
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
currentLeft += speed;
//3.3将移动到的当前位置赋值给 box.style.left
ele.style[attr] = currentLeft + "px";
//4.终点检测
if (currentLeft != target) {
isAll = false;
}
}
//根据变量的值,给出结果
if (isAll) {
//停止运动:清除定时器
clearInterval(ele.timeID);
callback();
}
}, 50)
}
//IE8兼容
function getEleStyle(ele, attr) {
//做浏览器能力检测
if (window.getComputedStyle) {
var style = window.getComputedStyle(ele, null);
return style[attr];
} else {
return ele.currentStyle[attr];
}
}
</script>
</html>
案例二:旋转木马轮播图
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
* {
padding: 0;
margin: 0;
list-style: none;
border: 0;
}
.all {
width:1100px;
height: 400px;
margin:10px auto;
border: 1px solid #ccc;
background-color: pink;
}
.screen{
height:500px;
position: relative;
}
.screen li{
position: absolute;
left:200px;
top:0;
}
#arr span {
width: 40px;
height: 40px;
position: absolute;
left: 450px;
top: 40%;
margin-top: -20px;
background: #000;
cursor: pointer;
line-height: 40px;
text-align: center;
font-weight: bold;
font-size: 30px;
color: #FFFFFF;
opacity: 0.3;
border: 1px solid #FFFFFF;
}
#arr #right {
right: 450px;
left: auto;
}
</style>
</head>
<body>
<div class="all" id="box">
<div class="screen">
<ul>
<li><img src="img/5dd3a06335399.jpg" width="500" height="200"></li>
<li><img src="img/5dd3a0650feea.jpg" width="500" height="200"></li>
<li><img src="img/5dd3a066a1691.jpg" width="500" height="200"></li>
<li><img src="img/5dd641960a309.png" width="500" height="200"></li>
<li><img src="img/5dd7864394ae5.jpg" width="500" height="200"></li>
</ul>
</div>
<div id="arr">
<span id="left"><</span>
<span id="right">></span>
</div>
</div>
</body>
<script type="text/javascript">
var arr =[
{//1
width: 600,
top: 70,
left: 0,
opacity: 0.2,
zIndex: 2
},
{//2
width: 600,
top: 70,
left: 50,
opacity: 0.5,
zIndex: 3
},
{//3
width: 800,
top: 20,
left: 280,
opacity: 1,
zIndex: 4
},
{//4
width: 600,
top: 70,
left: 550,
opacity: 0.5,
zIndex: 3
},
{//5
width: 600,
top: 70,
left: 600,
opacity: 0.2,
zIndex: 2
}
]
var box = document.getElementById("box"); //最外层的大盒子
var screen = document.getElementsByClassName("screen")[0];
var ul = screen.children[0]; //获取装着图片的ul
var liArr=ul.children;
var Arr = document.getElementById("arr");
var left = document.getElementById("left");
var right = document.getElementById("right");
//鼠标移入时左右按钮显示,离开隐藏
box.onmouseover = function() {
Arr.style.display = "block";
//鼠标移入box盒子 停止自动轮播
clearInterval(timeID);
}
box.onmouseout = function() {
Arr.style.display = "none";
//鼠标移出box盒子 自动轮播
timeID = setInterval(function() {
arr.push(arr.shift());
assign();
}, 2000);
}
//创建一个isAll变量,开闭原则,为了再点击按钮完成所有样式之后才可以继续点击
var isAll = true;
//页面加载样式
for(var i=0;i<liArr.length;i++){
//遍历 把图片样式赋给图片
slowMOVE(liArr[i],{
width:arr[i].width,
top:arr[i].top,
left:arr[i].left,
opacity:arr[i].opacity,
zIndex:arr[i].zIndex
});
}
//点击上一页下一页 图片轮播
left.onclick=function(){
//点击之后将isAll设置为false,这样在这个样式完全显示之前点击按钮没有变化
isAll = false;
arr.push(arr.shift());
assign();
}
right.onclick=function(){
//点击之后将isAll设置为false,这样在这个样式完全显示之前点击按钮没有变化
isAll = false;
arr.unshift(arr.pop());
assign();
}
//之后再次给图片设置样式
function assign() {
for(var i=0;i<liArr.length;i++){
slowMOVE(liArr[i],arr[i],function(){
isAll= true;
});
}
};
//自动切换
var timeID=setInterval(function () {
arr.push(arr.shift());
assign();
}, 2000);
//封装
function slowMOVE(ele, attrs, callback) {
//开启新的定时器之前先清除定时器
clearInterval(ele.timeID);
//3.开启定时器
ele.timeID = setInterval(function() {
/*
开关思想:
1.提出假设
2.验证假设
3.根据变量的结果做出操作
*/
//提出假设
var isAll = true;
//验证假设
//遍历传入的所有属性
for (var key in attrs) {
var attr = key;
var target = attrs[key];
if (attr == "zIndex" || attr == "backgroundColor") {
ele.style[attr] = target;
} else if (attr == "opacity") {
//3.1.获取元素位置
//offsetLeft 获取属性值:获取到的只是数字类型的
//透明度是小数 不适合进行运算 所以扩大100倍
//透明度是小数,所以使用parseFloat
var currentLeft = (parseFloat(getEleStyle(ele, attr))) * 100;
//3.2.开始移动(在原本的位置上缓速移动)
var speed = (target * 100 - currentLeft) / 10;
//消除误差
// if(speed>0){
// speed=Math.ceil(speed);
// }else{
// speed=Math.floor(speed);
// }
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
currentLeft += speed;
//3.3将移动到的当前位置赋值给 box.style.left
ele.style[attr] = currentLeft / 100;
//4.终点检测
if (currentLeft != target) {
isAll = false;
}
} else {
//3.1.获取元素位置
//offsetLeft 获取属性值:获取到的只是数字类型的
//而window.getComputedStyle方法获取到的是带单位的字符串
var currentLeft = parseInt(getEleStyle(ele, attr));
//3.2.开始移动(在原本的位置上缓速移动)
var speed = (target - currentLeft) / 10;
//消除误差
// if(speed>0){
// speed=Math.ceil(speed);
// }else{
// speed=Math.floor(speed);
// }
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
currentLeft += speed;
//3.3将移动到的当前位置赋值给 box.style.left
ele.style[attr] = currentLeft + "px";
//4.终点检测
if (currentLeft != target) {
isAll = false;
}
}
}
//根据变量的值,给出结果
if (isAll) {
//停止运动:清除定时器
clearInterval(ele.timeID);
callback();
}
}, 50)
}
//IE8兼容
function getEleStyle(ele, attr) {
//做浏览器能力检测
if (window.getComputedStyle) {
var style = window.getComputedStyle(ele, null);
return style[attr];
} else {
return ele.currentStyle[attr];
}
}
</script>
</html>