JS缓速动画

28 篇文章 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];

						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">&lt;</span>
				<span id="right">&gt;</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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值