CSS-Animation onClick

Lesezeit: 5 Minuten

Benutzeravatar von tekknolagi
teknolagi

Wie kann ich eine CSS-Animation mit einem JavaScript-onClick zum Abspielen bringen? Ich habe derzeit:

.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);
  }
}

Wie kann ich einen onClick anwenden?

Benutzeravatar von Shisoft
Shisoft

Sind Sie sicher, dass Sie Ihre Seite nur im Webkit anzeigen? Hier ist der Code, der auf Safari weitergegeben wurde. Das Bild (id='img') dreht sich nach dem Klicken auf die Schaltfläche.

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" width="328" height="328" />

  • Denken Sie nur daran, dass Sie verwenden .className löscht alle Ihre anderen Klassen für das angegebene Element. Wenn dies unerwünscht ist, verwenden Sie document.getElementById('img').classList.add('classname');

    – Zeichnete Kennedy

    1. November 2016 um 21:05 Uhr

  • Dies wird nur beim ersten Klicken animiert. Nachfolgende Klicks bewirken nichts. Verwenden sad comrade Methode unten, um mehrere Klicks zu ermöglichen.

    –Max S.

    23. März 2022 um 22:55 Uhr


Sie verwenden einfach die :active Pseudo-Klasse. Dies wird gesetzt, wenn Sie auf ein beliebiges Element klicken.

.classname:active {
    /* animation css */
}

  • Ah, ich habe deine Frage falsch verstanden. ich denken Ravis Antwort wird in diesem Fall für Sie funktionieren.

    – Paul Fischer

    31. Januar 2011 um 7:10 Uhr

  • Das war sehr nützlich für mich. Die Animation wurde nur ausgeführt, während der Benutzer die Maustaste gedrückt hielt, was genau das war, was ich brauchte.

    – Erw

    10. August 2016 um 5:25 Uhr

  • Das habe ich auch gebraucht.

    – b_d_m_p

    25. Dezember 2019 um 5:10 Uhr

  • Vielen Dank für diese Antwort, das war genau das, wonach ich suchte.

    – Asela Priyadarshana

    18. August 2021 um 4:59 Uhr

Lösung gefunden auf CSS-Tricks

const element = document.getElementById('img')

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

  • Das Auslösen des Reflows auf der Mittellinie ist ein raffinierter Trick. genau das, was ich brauchte

    – he77kat_

    18. April 2020 um 14:25 Uhr

  • Wie funktioniert das Auslösen des Reflows?

    – Wanja

    29. Juli 2022 um 12:24 Uhr

  • @he77kat_ Ich weiß nicht einmal, was Reflow bedeutet, und ich kann auch keine gute Erklärung finden. Möchten Sie sich verpflichten?

    – ptrca

    2. Januar um 1:19

  • @ptrcao reflow ist der Name des Webbrowser-Prozesses zur Neuberechnung der Positionen und Geometrien der Elemente im HTML-Dokument, um einen Teil oder das gesamte Dokument neu zu rendern. Bestimmte Browser-APIs oder Dokumenteigenschaften führen dazu, dass dieser Prozess neu gestartet wird, und elem.offsetWidth Ist einer von ihnen

    – he77kat_

    2. Januar um 18:08 Uhr


Sie können dies erreichen, indem Sie einen Onclick-Listener binden und dann die animierte Klasse wie folgt hinzufügen:

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

NUR CSS-Lösung, die bei jedem Klick funktioniert und die Animation bis zum Ende abspielt:

Alles, was Sie tun müssen, ist, die Animation zum hinzuzufügen :focus Pseudo-Klasse und setzen Sie sie auf none in :active Pseudo-Klasse.

Wenn Ihr Element nicht fokussierbar ist, fügen Sie es hinzu tabindex="0" Attribut zum HTML-Element:

@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>

  • Das einzige Problem, das ich dabei sehe: Wenn ich auf eines der Demo-Steuerelemente klicke, dann die Registerkarten wechsle und dann zurückschalte, wird die Animation abgespielt, ohne darauf zu klicken.

    – Will

    9. November 2021 um 22:14 Uhr

Benutzeravatar von RK Roy
RK Roy

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>

  • Das einzige Problem, das ich dabei sehe: Wenn ich auf eines der Demo-Steuerelemente klicke, dann die Registerkarten wechsle und dann zurückschalte, wird die Animation abgespielt, ohne darauf zu klicken.

    – Will

    9. November 2021 um 22:14 Uhr

Benutzeravatar von Marin Atanasov
Marin Atanasov

Füge hinzu ein

-webkit-animation-play-state: paused;

zu Ihrer CSS-Datei hinzufügen, können Sie mit dieser JS-Zeile steuern, ob die Animation ausgeführt wird oder nicht:

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

wenn Sie möchten, dass die Animation bei jedem Klick einmal ausgeführt wird. Denken Sie daran, einzustellen

-webkit-animation-iteration-count: 1;

1438340cookie-checkCSS-Animation onClick

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy