现在对于前端的要求变大了很多,随着时代进步,人们的审美越来越挑剔,对于用户交互的体验成为了公司竞争的一大助力。而动画效果,可以说是最有效的提高用户体验的方式了。但是对于前端来说,实现动画的方法也有很多种,今天博主就来和各位一起探讨一下,实现动画的几种方式。

JS直接实现

最为简单暴力无脑的一种操作,通过js修改div(盒子模型)的属性以及运用 setTimeOut() 方法实现动画。

  • 实现:
<!DOCTYPE html>
<html lang="en">

	<head>
		<meta charset="UTF-8">
		<style type="text/css">
			#rect {
				width: 200px;
				height: 200px;
				background: #ccc;
			}
		</style>
	</head>
	
	<body>
		<div id="rect"></div>
		<script>
			//获取rect元素
			var elem = document.getElementById('rect');
			var left = 0;
			//定时器实现移动效果
			var timer = setInterval(function() {
				if(left < window.innerWidth - 200) {
					elem.style.marginLeft = left + 'px';
					left++;
				} else {
					clearInterval(timer);
				}
			}, 16);
		</script>
	</body>
</html>
  • 效果图:以上代码可以直接运行,复制到编译器即可。
  • 补充:jquery有自己封装一些常见的动画效果。
  • 代码解析:
    1.通过JS获取元素。
    2.通过setInterval()定时器实现marginLeft样式的修改从而实现动画效果。

SVG

SVG 是使用 XML 来描述二维图形和绘图程序的语言。-

  • 实现:
<!DOCTYPE html>
<html lang="en">

	<head>
		<meta charset="UTF-8">
		<title>Document</title>
		<style>
			* {
				margin: 0;
				padding: 0;
			}
		</style>
	</head>

	<body>
		<svg id="box" width="800" height="400" xmlns="http://www.w3.org/2000/svg" version="1.1">
			<rect x="" y="" width="100" height="100" fill="rgb(255,0,0);" stroke="" stroke-width="">
				<set attributeName="x" attributeType="XML" to="100" begin="4s" />
				<animate attributeName="x" attributeType="XML" begin="0s" dur="4s" from="0" to="300" />
				<animate attributeName="y" attributeType="XML" begin="0s" dur="4s" from="0" to="300" />
				<animateTransform attributeName="transform" begin="0s" dur="4s" type="scale" from="1" to="2" repeatCount="1" />
				<animateMotion path="M10,80 q100,120 120,20 q140,-50 160,0" begin="0s" dur="4s" repeatCount="1" />
			</rect>
		</svg>

	</body>

</html>
  • 效果图:以上代码可以直接运行,各位自行编译即可。
  • 代码解析
    1.包含animate标签的为相互覆盖的关系,各位可以通过注释其他行看到该行实现的动画效果。
    2.如果想要详细了解请找度娘。

CSS3 transition

transition是过渡动画,具体效果请看演示。

  • 实现
<!DOCTYPE html>
<!DOCTYPE html>
<html lang="en">

	<head>
		<meta charset="UTF-8">
		<style type="text/css">
			#rect {
				width: 200px;
				height: 200px;
				transform: width 2s;
				background: #ccc;
				-moz-transition: width 2s;
				/* Firefox 4 */
				-webkit-transition: width 2s;
				/* Safari and Chrome */
				-o-transition: width 2s;
				/* Opera */
			}
			
			#rect:hover {
				width: 500px;
			}
		</style>
	</head>
	
	<body>
		<div>请将鼠标移入方块</div>
		<div id="rect"></div>
	</body>

</html>
  • 效果图:以上代码可以直接运行,各位自行编译即可。
  • 注意:
    在移动端开发中,直接使用transition动画会让页面变慢甚至卡顿。所以我们通常添加**transform:translate3D(0,0,0)transform:translateZ(0)**来开启移动端动画的GPU加速,让动画过程更加流畅。

CSS3 animation

更加直白简单好用的属性。

  • 示例:
<!DOCTYPE html>
<html lang="en">

	<head>
		<meta charset="UTF-8">
		<style >
			div {
				width: 100px;
				height: 100px;
				background: red;
				position: relative;
				animation: mymove 5s infinite;
				-webkit-animation: mymove 5s infinite;
				/*Safari and Chrome*/
			}
			
			@keyframes mymove {
				from {
					left: 0px;
				}
				to {
					left: 200px;
				}
			}
			
			@-webkit-keyframes mymove
			/*Safari and Chrome*/
			
			{
				from {
					left: 0px;
				}
				to {
					left: 200px;
				}
			}
		</style>
	</head>

	<body>

		<p><strong>注释:</strong>Internet Explorer 9 以及更早的版本不支持 animation 属性。</p>

		<div></div>

	</body>

</html>
  • 效果图:以上代码可以直接运行,各位自行编译即可。

requestAnimationFrame

requestAnimationFrame是另一种Web API,原理与setTimeout和setInterval类似,都是通过javascript持续循环的方法调用来触发动画动作。
但它与setTimeOut()不同的是,他是根据浏览器的刷新同步进行动画。而定时器是按照自己的思路走的。(我不要你觉得,我要我觉得的那种)

  • 示例:
<!DOCTYPE html>
<html>

	<head>
		<title></title>
		<style type="text/css">
			* {
				margin: 0;
				padding: 0;
			}
			
			div {
				width: 200px;
				height: 200px;
				background-color: #ccc;
			}
		</style>
	</head>

	<body>
		<div id="rect"></div>
		<script type="text/javascript">
			window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame ||
				window.msRequestAnimationFrame;

			var elem = document.getElementById("rect");
			var left = 0;
			//自动执行持续性回调
			requestAnimationFrame(step);
			//持续该改变元素位置
			function step() {
				if(left < window.innerWidth - 200) {
					left += 1;
					elem.style.marginLeft = left + "px";
					requestAnimationFrame(step);
				}
			}
		</script>
	</body>

</html>
  • 效果图:以上代码可以直接运行,各位自行编译即可。

Canvas动画

canvas作为H5新增元素,是借助Web API来实现动画的。

  • 示例:
<!DOCTYPE html>
<html lang="en">

	<head>
		<meta charset="UTF-8">
		<title>Document</title>
		<style>
			* {
				margin: 0;
				padding: 0;
			}
		</style>
	</head>

	<body>
		<canvas id="canvas" width="700" height="550"></canvas>
		<script type="text/javascript">
			var canvas = document.getElementById("canvas");
			var ctx = canvas.getContext("2d");
			var left = 0;
			var timer = setInterval(function() {
				ctx.clearRect(0, 0, 700, 550);
				ctx.beginPath();
				ctx.fillStyle = "#ccc";
				ctx.fillRect(left, 0, 100, 100);
				ctx.stroke();
				if(left > 700) {
					clearInterval(timer);
				}
				left += 1;
			}, 16);
		</script>
	</body>

</html>
  • 效果图:以上代码可以直接运行,各位自行编译即可。