質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

2回答

1901閲覧

CSSアニメーションが1回目しか効きません

nikuatsu

総合スコア177

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2021/12/12 21:22

前提・実現したいこと

CSSでぶるぶる震えるアニメーションを作っています。
「start」のクリックで、これを何度も発生するようにしたいです。

発生している問題・エラーメッセージ

アニメーションが1回目しか効きません

該当のソースコード

html

1<div class="box"></div> 2<button type="button" class="start">start</button>

jQuery

1$('.start').click(function(){ 2 $('.box').removeClass('shake'); 3 $('.box').addClass('shake'); 4});

css

1.box { 2 background: red; 3 width: 50px; 4 height: 50px; 5} 6 7.shake { 8 -webkit-animation-duration: .5s; 9 animation-duration: .5s; 10 -webkit-animation-fill-mode: both; 11 animation-fill-mode: both; 12 -webkit-animation-name: shake; 13 animation-name: shake; 14} 15 16@-webkit-keyframes shake { 17 from, 18 to { 19 -webkit-transform: translate3d(0, 0, 0); 20 transform: translate3d(0, 0, 0); 21 } 22 23 10%, 24 30%, 25 50%, 26 70%, 27 90% { 28 -webkit-transform: translate3d(-10px, 0, 0); 29 transform: translate3d(-10px, 0, 0); 30 } 31 32 20%, 33 40%, 34 60%, 35 80% { 36 -webkit-transform: translate3d(10px, 0, 0); 37 transform: translate3d(10px, 0, 0); 38 } 39} 40 41@keyframes shake { 42 from, 43 to { 44 -webkit-transform: translate3d(0, 0, 0); 45 transform: translate3d(0, 0, 0); 46 } 47 48 10%, 49 30%, 50 50%, 51 70%, 52 90% { 53 -webkit-transform: translate3d(-10px, 0, 0); 54 transform: translate3d(-10px, 0, 0); 55 } 56 57 20%, 58 40%, 59 60%, 60 80% { 61 -webkit-transform: translate3d(10px, 0, 0); 62 transform: translate3d(10px, 0, 0); 63 } 64} 65

試したこと

思いつきですが、クリックを分けて実行してみたらなぜか動作しました。
つまり以下「remove」と「add」に分けて、「remove」をクリックしてから、「add」をクリックすると動作するんです。
なぜこれで動作するのに、上記の「start」のクリックの一括指定では動作しないのかわかりません。

html

1<div class="box"></div> 2<button type="button" class="start">start</button> 3 4<button type="button" class="remove">remove</button> 5<button type="button" class="add">add</button>

jQuery

1$('.start').click(function(){ 2 $('.box').removeClass('shake'); 3 $('.box').addClass('shake'); 4}); 5 6$('.remove').click(function(){ 7 $('.box').removeClass('shake'); 8}); 9 10$('.add').click(function(){ 11 $('.box').addClass('shake'); 12}); 13

「start」のクリックだけで、何度も動作させるにはどのようにすべきでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

setTimeout で間隔を空けるというの方法も有効ですが、
アニメーション終了時に発生するイベント(animationend)がありますので、
そこでクラスを外すという方法もあります。

HTMLElement: animationend イベント - Web API | MDN

js

1$('.start').click(function(){ 2 $('.box').addClass('shake'); 3}); 4$('.box').on('animationend', function() { 5 $('.box').removeClass('shake'); 6});

アニメーションが終了する前にstartを再度クリックしたときの動作が、setTimeout とは微妙に異なるので、お好みで選択すればいいでしょう。
終了前にクリックしたときに、
setTimeout だと最初からアニメーションが始まる、
animationend だとそのまま終了まで続行する。

投稿2021/12/13 00:53

編集2021/12/13 01:10
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nikuatsu

2021/12/13 23:38

ありがとうございます。実現できました
guest

0

$('.start').click(function(){
$('.box').removeClass('shake');
$('.box').addClass('shake');
});

removeClassしたあとにすぐaddClassとすると動かないようなので
addClassをsetTimeoutで間隔開けて実行してみてください

投稿2021/12/12 22:02

ppppppp

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ppppppp

2021/12/13 01:03

hatena19氏の正攻法の利用をおすすめします
nikuatsu

2021/12/13 23:38

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問