css3动画播放后如何停止在最后的状态

发布网友 发布时间:2022-04-22 08:14

我来回答

7个回答

懂视网 时间:2022-04-06 15:27

使用纯 CSS 的方法,暂停或播放 CSS 动画。是不是看起来应该是不可能的实现的;或者就算可以实现,也是一个很麻烦的实现方法,需要用大量的css样式才可以实现。其实不然,在 CSS3 animation 中,就有这样一个属性可以做到暂停、播放动画。本章就给大家介绍如何用纯CSS方式实现CSS动画的暂停与播放效果?animation-play-state属性介绍(详解)。有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

animation-play-state属性

 animation-play-state: paused | running;

animation-play-state: 属性定义一个动画是否运行或者暂停。可以通过查询它来确定动画是否正在运行。另外,它的值可以被设置为暂停和恢复的动画的重放。

如果借助 Javascript,我们可以实现控制 CSS 动画的运行和播放,下面列出部分关键代码:

html代码:

<div class="btn">stop</div> 
<div class="animation"></div>

css代码:

.animation {
 width: 100px;
 height: 100px;
 margin: 50px auto;
 background: deeppink;
 animation: move 2s linear infinite alternate;
}

@keyframes move {
 0% {
 transform: translate(-100px, 0);
 }
 100% {
 transform: translate(100px, 0);
 }
}

.btn {
 width: 50px;
 margin: 10px auto;
 text-align: center;
 border:1px solid #ddd;
 padding: 10px;
 border-radius: 5px;
 cursor:pointer;
 
 &:hover {
 background: #ddd;
 color: #333;
 }
 
 &:active {
 background: #aaa;
 }
}

js代码:

document.querySelector('.btn').addEventListener('click', function() {
 let btn = document.querySelector('.btn');
 let elem = document.querySelector('.animation');
 let state = elem.style['animationPlayState'];
 
 if(state === 'paused') {
 elem.style['animationPlayState'] = 'running';
 btn.innerText = 'stop';
 } else {
 elem.style['animationPlayState'] = 'paused';
 btn.innerText = 'play';
 }
 
});

效果图(播放时和停止播放后):

1.jpg2.jpg

纯 CSS 实现

下面我们探讨下,使用纯 CSS 的方式能否实现。

hover 伪类实现

使用 hover 伪类,在鼠标悬停在按钮上面时,控制动画样式的暂停。

关键代码如下:

html代码:

<div class="btn stop">stop</div> 
<div class="animation"></div>

css代码:

.animation {
 width: 100px;
 height: 100px;
 margin: 50px auto;
 background: deeppink;
 animation: move 2s linear infinite alternate;
}

input {
 display: none;
}

@keyframes move {
 0% {
 transform: translate(-100px, 0);
 }
 100% {
 transform: translate(100px, 0);
 }
}

.btn {
 width: 50px;
 margin: 10px auto;
 text-align: center;
 border:1px solid #ddd;
 padding: 10px;
 border-radius: 5px;
 cursor:pointer;
 
 &:hover {
 background: #ddd;
 color: #333;
 }
 
 &:active {
 background: #aaa;
 }
}

.stop:hover ~ .animation {
 animation-play-state: paused;
}

效果图:

1.jpg2.jpg

当然,这个方法不够智能,如果释放鼠标的自由,点击一下暂停、再点击一下播放就好了。还有其他方法吗?

checked 伪类实现

之前的文章《有趣的 CSS 题目(8):纯CSS的导航栏Tab切换方案》也谈过,使用 radio 标签的 checked 伪类,加上 实现纯 CSS 捕获点击事情。

并且利用被点击的元素可以控制一些 CSS 样式。实现如下:

html代码:

<input id="stop" type="radio" name="playAnimation"/>
<input id="play" type="radio" name="playAnimation"/>

<div class="box">
 <label for="stop">
 <div class="btn">stop</div>
 </label>
 <label for="play">
 <div class="btn">play</div>
 </label>
</div>

<div class="animation"></div>

css代码:

.animation {
 width: 100px;
 height: 100px;
 margin: 50px auto;
 background: deeppink;
 animation: move 2s linear infinite alternate;
}

input {
 display: none;
}

@keyframes move {
 0% {
 transform: translate(-100px, 0);
 }
 100% {
 transform: translate(100px, 0);
 }
}

.btn {
 width: 50px;
 margin: 10px auto;
 text-align: center;
 border:1px solid #ddd;
 padding: 10px;
 border-radius: 5px;
 cursor:pointer;
 
 &:hover {
 background: #ddd;
 color: #333;
 }
 
 &:active {
 background: #aaa;
 }
}

#stop:checked ~ .animation {
 animation-play-state: paused;
}

#play:checked ~ .animation {
 animation-play-state: running;
}

我们希望当 #stop 和 #play 两个 radio 被点击时,给 .animation 元素分别赋予 animation-play-state: paused 或是 animation-play-state: running 。而且二者只能生效其一,所以需要给两个 radio 标签赋予相同的 name 属性。

效果图:

1.jpg2.jpg

上面的示例中,实现了纯 CSS 方式实现 CSS 动画的暂停与播放。

当然,还有一些其他方法,例如 radio 替换成 checkbox ,或者使用 :target 伪类选择器也能实现上面同样的效果,感兴趣的可以尝试一下。

热心网友 时间:2022-04-06 12:35

新建keyframes元素,命名为myFirst。设置百分比,编写Animation属性对属性值的引用。为了开考虑兼容性问题,可以多写几个备选,详细步骤:

1、首先,准备好HTML前期工作以及对DIV的一个简单设置。

2、然后,新建keyframes元素,命名为myFirst。

3、然后,可以在设置百分比,不仅仅只能设置4个,大家可以根据需求设置。

4、这时候,可以为他写上各种百分比的颜色。

5、此时,就能编写Animation属性对属性值的引用。

6、为了开考虑兼容性问题,可以多写几个备选。

热心网友 时间:2022-04-06 13:53

CSS3 里面 animation下有个animation-fill-mode 设定动画完成后的状态,默认是none 设为forwards 就可以在动画完成后定格在动画最后一帧

热心网友 时间:2022-04-06 15:27

这个可以婉转的实现,比如默认就让它在left:200,而且默认是隐藏看不见的,然后
0%-5%{ left:200},
5%-10%{left:0,并显示出来(opacity=1)}
100%{left:200}

热心网友 时间:2022-04-06 17:19

/*动画写成
@keyframes name
{
0%{left:0px;}
100%{left:200px;}
}
动画定义为只播放1遍,然后动画样式后面定义好left:200px就可以了,因为样式是从前往后执行的。亲测成功,希望可以帮到你。

来个例子吧,省得诸位看不懂再给差评:比如1个class叫box的div,照楼主的要求就是:
@keyframes move
{
0%{left:0px;}
100%{left:200px;}
}
.box{animation: move 2s linear 0 1; left: 200px;}
这样就可以把box的left定在200px。*/

上面是注释,也是另外的方法。

好吧,是我无知,回答这问题时我还没看animation-fill-mode属性,确实,使用animation-fill-mode:forwards就可以实现我上面说的效果。所以以上方法请忽略。
误解了大伙,不好意思了。

热心网友 时间:2022-04-06 19:27

animation-fill-mode: forwards;

热心网友 时间:2022-04-06 21:51

动画自动调回是调用了一个默认样式:animation-direction;仔细研究下css3的animation属性,设置只播放一次,并且播放结束后不可逆。应该就能达到你要的效果了。
http://www.w3school.com.cn/cssref/pr_animation.asp
希望对你有帮助!

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com