質問するログイン新規登録

Q&A

解決済

3回答

251閲覧

JavaScriptでクラス名がオン・オフされるタイミングについて

mosamosadon88

総合スコア2

JavaScript

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

HTML

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

CSS

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

0グッド

0クリップ

投稿2025/11/14 01:11

編集2025/11/14 01:39

0

0

質問内容

JavaScriptで、1つのタグにクラス名がオン・オフする方法として
今回試した方法より、よい方法がないか

追記
今回質問した「よい方法」というのは、「よりシンプルな方法」がないかというところです。
#hoge2を追加したりdelayをかけるなど、クラス名を付けはずしするだけなのに
余分な動作を追加してしまっていると感じています。その点に関して
何か他にシンプルな方法はないのかと思って質問しました。

前提

スライドショーのインジケーターを作成。
クラス名の付け外しで動くようにCSSを作成。
JavaScriptで、1つのタグにクラス名がオン・オフするように作成。
単純にオン・オフしてもうまくいかず、いくつかパターンを作成。

該当のソースコード

html

1 2 <div id="slide_box"> 3 <div class="img_01 test" data-box="1"> 4 <img src="01.jpg" alt=""> 5 </div> 6 <div class="img_02" data-box="2"> 7 <img src="02.jpg" alt=""> 8 </div> 9 <div class="img_03" data-box="3"> 10 <img src="03.jpg" alt=""> 11 </div> 12 </div> 13 14 <div class="bar_div"> 15 <div id="hoge" class="bp"></div> 16 <!-- <div id="hoge2" class=""></div> --> 17 </div> 18 19<style> 20.bar_div { 21 margin: auto; 22 width:200px; 23 aspect-ratio: 10 / 1; 24 background-color:#ececec; 25 position:relative; 26 border-radius:10px; 27 overflow: hidden; 28} 29.bp { 30 position:absolute; 31 height:100%; 32 background-color:#FFCA28; 33 animation: prog 2s normal; 34 35} 36@keyframes prog { 37 0% { 38 width: 0 39 } 40 100% { 41 width: 100% 42 } 43} 44</style> 45

javascript

1 2 let auto_anime = function() { 3 auto_set = setInterval(() => { 4 if ( v < slide_max_count ) { 5 $(".img_0" + v ).removeClass("test"); 6 $(".img_0" + ( v + 1 )).addClass("test"); 7 // $('#hoge').removeClass('bp'); パターン1うまく動かず 8 // $('#hoge').addClass('bp'); 9 // $('#hoge').removeClass('bp'); パターン2 if分岐は省略 10 // $('#hoge2').addClass('bp'); 11 $('#hoge').removeClass('bp').delay(100).queue(function(){ 12 $(this).addClass('bp').dequeue(); 13 }); //パターン3 14 v++; 15 }else { 16 $(".img_01").addClass("test"); 17 $(".img_0" + slide_max_count ).removeClass("test"); 18 $('#hoge').removeClass('bp').delay(100).queue(function(){ 19 $(this).addClass('bp').dequeue(); 20 }); 21 v = 1; 22 } 23 }, 2000); 24 }; 25

試したこと

パターン1
シンプルに#hogeにクラス名を付け外しを行うも、CSSのアニメーションが動かず

パターン2
#hogeと#hoge2を作って、クラス名を交互に付ける → 動く

パターン3
#hogeにクラス名を付ける時にdelayをかけてクラス名を付ける → 動く

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

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

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

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

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

maisumakun

2025/11/14 01:22

パターン2を実行したコードはありますか?あと、 > 今回試した方法より、よい方法がないか どのような基準での「よい方法」でしょうか?
mosamosadon88

2025/11/14 01:32

コメントありがとうございます。 なるほど、そうですね「よい方法」の定義があいまいですね。 パターン2もコードも含め、質問を修正いたします。
guest

回答3

0

ベストアンサー

maisumakun さんのご回答の通りだと私も思うのですが、一応jQueryの範囲で解決するなら以下のように強制リフローを起こすのはいかがでしょうか。
かなりバッドノウハウ気味ですが。

js

1$('#hoge').removeClass('bp').height() 2$('#hoge').addClass('bp');

投稿2025/11/14 03:25

編集2025/11/14 03:25
Lhankor_Mhy

総合スコア37658

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

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

mosamosadon88

2025/11/14 04:59

ご回答ありがとうございます。 なるほど、こんな方法もあるのですね。自分ではまったく思いつきませんでした。 推奨される方法ではないかもしれませんが、ひとつの方法として知識になりました。
guest

0

JavaScriptから決まるタイミングにワンショットでアニメーションを実行するのであれば、CSSアニメーションよりjQueryの.animate()を使うほうが楽かと思います。

投稿2025/11/14 01:45

maisumakun

総合スコア146916

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

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

mosamosadon88

2025/11/14 04:55

ご回答ありがとうございます。 そうですよね、クラス名でうまくいかない場合は、.animate()での解決するのがシンプルですよね。
guest

0

ポイントが良くわからないのですが、特定の範囲内でクラスを定期的にローテーションするんですよね?
クラスの付替えのタイミングをずらしたいのか、ついたあとの挙動のタイミングをずらしたいのか、希望がどこなのかがよくわかりません。キーフレームアニメーションの場合例えば0%から30%まで要素の値をキープすればdelayできませんか?

的はずれな回答でしたら申し訳ないですが一応サンプル

html

1<style> 2.fuga{ 3width:100px; 4height:50px; 5margin:10px; 6 background-Color:yellow; 7} 8.piyo{ 9 animation: prog 1s normal; 10 background-Color:lime; 11} 12@keyframes prog { 13 0% { width: 100px } 14 30% { width: 100px } 15 100% { width: 300px} 16} 17</style> 18<script> 19window.addEventListener('DOMContentLoaded', ()=>{ 20 setInterval((function loop(){ 21 const cnt=document.querySelectorAll(`.fuga`).length; 22 let idx=[...document.querySelectorAll(`.fuga`)].indexOf(document.querySelector(`.piyo`))+2; 23 if(idx>cnt) idx=1; 24 console.log(idx); 25 if(document.querySelector(`.piyo`)) document.querySelector(`.piyo`).classList.remove('piyo'); 26 document.querySelector(`:nth-child(${idx} of .fuga)`).classList.add('piyo'); 27 return loop; 28 })(),1000); 29}); 30</script> 31<div id="hoge"> 32<div class="fuga">1</div> 33<div class="fuga">2</div> 34<div class="fuga">3</div> 35</div>

投稿2025/11/14 04:23

編集2025/11/14 04:49
yambejp

総合スコア118193

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

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

mosamosadon88

2025/11/14 05:03

ご回答ありがとうございます。 今回の場合、CSSでアニメーションを発火させるのにクラス名のオン・オフで出来ないかやっていました。 単純にクラス名をオン・オフしただけだと、CSSアニメーションがうまく動かないといった状況でした。 それで、CSSアニメーションが動くようにクラス名を付けるのにdelayをかけたりとか、色々していた所でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問