CSS 动画 onClick

Posted

技术标签:

【中文标题】CSS 动画 onClick【英文标题】:CSS Animation onClick 【发布时间】:2011-06-18 09:26:27 【问题描述】:

如何让 CSS 动画与 javascript onClick 一起播放?我目前有:

.classname 
  -webkit-animation-name: cssAnimation;
  -webkit-animation-duration:3s;
  -webkit-animation-iteration-count: 1;
  -webkit-animation-timing-function: ease;
  -webkit-animation-fill-mode: forwards;

@-webkit-keyframes cssAnimation 
  from 
    -webkit-transform: rotate(0deg) scale(1) skew(0deg) translate(100px);
  
  to 
    -webkit-transform: rotate(0deg) scale(2) skew(0deg) translate(100px);
  

如何应用 onClick?

【问题讨论】:

【参考方案1】:

您可以通过绑定 onclick 侦听器然后添加 animate 类来实现这一点,如下所示:

$('#button').onClick(function()
    $('#target_element').addClass('animate_class_name');
);

【讨论】:

基本上,您要告诉 jQuery 执行以下操作: 第一行:jQuery 以具有按钮 ID 的元素为目标,并在用户单击该元素时创建一个函数。第二行:这是将受到点击影响的元素。它以 id 为 target_element 的元素为目标,并将类 animate_class_name 添加到该元素。相信我,这个解决方案很有效,我过去用过。【参考方案2】:

您只需使用:active pseudo-class。这是在您单击任何元素时设置的。

.classname:active 
    /* animation css */

【讨论】:

啊,我误解了你的问题。我认为在这种情况下,Ravi 的回答对你有用。 这对我很有用。它仅在用户按住鼠标按钮时才运行动画,这正是我所需要的。 这也是我需要的。 感谢您的回答,这正是我想要的。【参考方案3】:

您确定只在 webkit 上显示您的页面吗?这是在 safari 上传递的代码。 点击按钮后图片(id='img')会旋转。

function ani() 
  document.getElementById('img').className = 'classname';
.classname 
  -webkit-animation-name: cssAnimation;
  -webkit-animation-duration: 3s;
  -webkit-animation-iteration-count: 1;
  -webkit-animation-timing-function: ease;
  -webkit-animation-fill-mode: forwards;


@-webkit-keyframes cssAnimation 
  from 
    -webkit-transform: rotate(0deg) scale(1) skew(0deg) translate(100px);
  
  to 
    -webkit-transform: rotate(0deg) scale(2) skew(0deg) translate(100px);
  
<input name="" type="button" onclick="ani()" value="Click">
<img id="img" src="https://i.stack.imgur.com/vghKS.png"   />

【讨论】:

请注意,使用.className 会清除给定元素上的所有其他类。如果不希望这样做,请使用document.getElementById('img').classList.add('classname');【参考方案4】:

试试这个:

<div>
 <p onclick="startAnimation()">Start</p><!--O botão para iniciar (start)-->
 <div id="animation">Hello!</div> <!--O elemento que você quer animar-->
</div>

<style>
@keyframes animationName 
from margin-left:-30%;

</style>

<script>
function startAnimation() 
    document.getElementById("animation").style.animation = "animationName 2s linear 1";

</script>

【讨论】:

【参考方案5】:

添加一个

-webkit-animation-play-state: paused;

到你的 CSS 文件,然后你可以使用这个 JS 行来控制动画是否正在运行:

document.getElementById("myDIV").style.WebkitAnimationPlayState = "running";

如果您希望动画在每次单击时运行一次。记得设置

-webkit-animation-iteration-count: 1;

【讨论】:

【参考方案6】:

您可以使用以下代码来做到这一点

$('#button_id').on('click', function()
$('#element_want_to_target').addClass('.animation_class'););

【讨论】:

【参考方案7】:

var  abox = document.getElementsByClassName("box")[0];
function allmove()
        abox.classList.remove("move-ltr");
        abox.classList.remove("move-ttb");
       abox.classList.toggle("move");

function ltr()
        abox.classList.remove("move");
        abox.classList.remove("move-ttb");
       abox.classList.toggle("move-ltr");

function ttb()
       abox.classList.remove("move-ltr");
       abox.classList.remove("move");
       abox.classList.toggle("move-ttb");
.box 
  width: 100px;
  height: 100px;
  background: red;
  position: relative;

.move
  -webkit-animation: moveall 5s;
  animation: moveall 5s;

.move-ltr
   -webkit-animation: moveltr 5s;
  animation: moveltr 5s;

.move-ttb
    -webkit-animation: movettb 5s;
  animation: movettb 5s;

@keyframes moveall 
  0%   left: 0px; top: 0px;
  25%  left: 200px; top: 0px;
  50%  left: 200px; top: 200px;
  75%  left: 0px; top: 200px;
  100% left: 0px; top: 0px;

@keyframes moveltr 
  0%    left: 0px; top: 0px;
  50%  left: 200px; top: 0px;
  100% left: 0px; top: 0px;

@keyframes movettb 
  0%   left: 0px; top: 0px;
  50%  top: 200px;left: 0px;
  100% left: 0px; top: 0px;
<div class="box"></div>
<button onclick="allmove()">click</button>
<button onclick="ltr()">click</button>
<button onclick="ttb()">click</button>

【讨论】:

【参考方案8】:

在css-tricks找到解决方案

const element = document.getElementById('img')

element.classList.remove('classname'); // reset animation
void element.offsetWidth; // trigger reflow
element.classList.add('classname'); // start animation

【讨论】:

在中间线触发回流是一个绝妙的技巧。正是我需要的【参考方案9】:

CSS ONLY 解决方案适用于每次点击并将动画播放到最后:

您所要做的就是将动画添加到:focus 伪类中,并在:active 伪类中将其设置为none。

如果您的元素不可聚焦,请将 tabindex="0" 属性添加到 html 元素:

@keyframes beat 
  0% 
    -webkit-transform: scale(1, 1);
            transform: scale(1, 1);
  
  100% 
    -webkit-transform: scale(0.8,0.8);
            transform: scale(0.8, 0.8);
  

.className 
  background-color:#07d;  
  color: #fff;
  font-family: sans-serif;
  font-size: 20px;
  padding: 20px;
  margin:5px;
  -webkit-transform: scale(1, 1);
          transform: scale(1, 1);

.className:focus 
  -webkit-animation: beat 1s ease-in-out backwards;
          animation: beat 1s ease-in-out backwards;

.className:active 
  -webkit-animation: none;
          animation: none;

body 
  text-align: center;
 
<h3>Any element with tabindex="0", like a div:</h3>
<div tabindex="0" class="className"> Click me many times!</div>
<h3>Any focusable element like a button:</h3>
<button class="className"> Click me many times!</button>

【讨论】:

我看到的一个问题:如果我单击任一演示控件,然后切换选项卡,然后切换回来,动画就会播放而无需单击它。

以上是关于CSS 动画 onClick的主要内容,如果未能解决你的问题,请参考以下文章

如何触发css3过渡动画

css3动画使用

点击播放 css3 动画

如何使用js捕获css3动画

css动画集锦

CSS如何实现动画?