【css3】js条件下多次触发同一个css3动画的解决方案

本文适用于非循环播放动画,而是条件下触发播放动画的解决方案


通常,我们会写一个css3的动画作为一个样式,在需要播放动画的时候把样式加到元素上播放一次


如果需要多次触发播放动画,如果是使用将样式先去掉再马上加上的办法,将无法多次播放动画


这里介绍一下解决方案


<html>
<head>
	<meta charset="utf8" />
	<meta name="viewport" content="initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" />
	<title>Animation Test</title>
	<style>
		html,body,div,p{
			margin: 0;
			padding: 0;
		}
		.icon-wrap{
			position: relative;
			display: flex;
			width: 80px;
			height: 40px;
			align-items: center;
			justify-content: center;
			background-color: #000;
		}
		.icon{
			width: 14px;
			height: 12px;
		}
		.animation-icon{
			position: absolute;
			width: 14px;
			height: 12px;
			position: absolute;
			top: 50%;
			left: 50%;
			margin-left: -7px;
			margin-top: -6px;
			opacity: 0;
		}
		
		@keyframes animation1 {
			0%   {transform: scale(1.4);opacity: 0;}
			50%  {transform: scale(2.8);opacity: 1;}
			100%  {transform: scale(1);opacity: 0;}
		}
		.animation1 {
			animation: animation1 400ms linear;
		}
		@keyframes animation2 {
			0%   {transform: scale(1.4);opacity: 0;}
			50%  {transform: scale(2.8);opacity: 1;}
			100%  {transform: scale(1);opacity: 0;}
		}
		.animation2 {
			animation: animation2 400ms linear;
		}
	</style>
</head>

<body>
	<a class="icon-wrap" id="J_animation_btn">
		<img class="animation-icon" id="J_animation_icon" src="icon-like-yellow.svg">
		<img class="icon" src="icon-like-white.svg">
    </a>
<script>
window.onload = function(){
	var btn = document.getElementById('J_animation_btn');
	var ani_icon = document.getElementById('J_animation_icon');
	var ani_status = 0;
	btn.addEventListener('click', function(){
		/*
		ani_icon.className = 'animation-icon';
		requestAnimationFrame(function(){
			ani_icon.className = 'animation-icon animation1';
		});
		*/
		if(ani_status == 1){
			ani_icon.className = 'animation-icon animation2';
			ani_status = 2;
		}else{
			ani_icon.className = 'animation-icon animation1';
			ani_status = 1;
		}
	});
}
</script>
</body>
</html>


这里的例子是一个框里有两个icon,一个显示(icon),一个是动画(animation-icon),


animation-icon,交替使用animation1和animation2来播放动画(注意animation1和animation2的keyframes和class样式都需要分开写(虽然是一抹一样的,但是要骗骗浏览器说这两个是不一样的动画,才能保证每次都触发))


可以看到代码中被注释掉的requestAnimationFrame这一段,思路是先把动画样式去掉,等渲染之后再把动画样式加上去,然而实践表明这个方法不可行(chrome上支持,但是ff上只能播放第一次的动画,所以还是用上面那个两个animation的办法吧)


想看效果的,这里传了压缩包可以下载查看:http://download.csdn.net/download/snow_finland/9984324

(压缩包里就多了两张图片,所以也可以随便找两个图片用上面的代码看效果)

posted @ 2017-09-18 17:16  snow_finland  阅读(368)  评论(0编辑  收藏  举报