🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

jQuery

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

CSS

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

Q&A

解決済

1回答

724閲覧

nth-of-type()が入れ子のときにごっちゃになる

mononoke

総合スコア5

JavaScript

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

jQuery

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

CSS

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

0グッド

0クリップ

投稿2019/12/07 17:52

###実現したいこと

下記ソースコードで、.box1 から順番にフェードアウトさせたいです。

1 → 2 → 3 → 4 → 5 → 6 → 7

###発生している問題
ですが、次のようにフェードアウトが実行されてしまいます。

2,5→ 1,3,6 → 4,7

###該当のソースコード
下記がソースコードです。

html

1<button type="button">fadeOut</button> 2 3<div class="wrapper"> 4 5 <div class="box0"> 6 <p>.box0</p> 7 </div> 8 9 <div class="box1 target"> 10 <p>.box1</p> 11 </div> 12 13 <nav> 14 <ul> 15 <li class="box2 target"> 16 <p>.box2</p> 17 </li> 18 <li class="box3 target"> 19 <p>.box3</p> 20 </li> 21 <li class="box4 target"> 22 <p>.box4</p> 23 </li> 24 </ul> 25 </nav> 26 27 <div> 28 <div class="box5 target"> 29 <p>.box5</p> 30 </div> 31 <div class="box6 target"> 32 <p>.box6</p> 33 </div> 34 </div> 35 36 <div class="box7 target"> 37 <p>.box7</p> 38 </div> 39 40</div>

css

1/* 順番に */ 2.wrapper .target:nth-of-type(1) { 3 animation-delay: 0s; 4} 5.wrapper .target:nth-of-type(2) { 6 animation-delay: 1s; 7} 8.wrapper .target:nth-of-type(3) { 9 animation-delay: 2s; 10} 11.wrapper .target:nth-of-type(4) { 12 animation-delay: 3s; 13} 14.wrapper .target:nth-of-type(5) { 15 animation-delay: 4s; 16} 17.wrapper .target:nth-of-type(6) { 18 animation-delay: 5s; 19} 20.wrapper .target:nth-of-type(7) { 21 animation-delay: 6s; 22} 23.wrapper .target:nth-of-type(8) { 24 animation-delay: 7s; 25} 26.wrapper .target:nth-of-type(9) { 27 animation-delay: 8s; 28} 29 30/* フェードアウト */ 31@-webkit-keyframes fadeOut { 32 from { 33 opacity: 1; 34 } 35 to { 36 opacity: 0; 37 } 38} 39@keyframes fadeOut { 40 from { 41 opacity: 1; 42 } 43 to { 44 opacity: 0; 45 } 46} 47.fadeOut { 48 animation-duration: 1s; 49 -webkit-animation-name: fadeOut; 50 animation-name: fadeOut; 51} 52

js

1$( 'button' ).click( function(){ 2 $( '.wrapper .target' ).addClass( 'fadeOut' ); 3});

###試したこと
現状はCSSのdelayで順番を適用させていますが、それを止めてjQueryのsetTimeOut()を使ってクラス付与をすればできたので、たぶん原因はdelayが実行される順番を指定しているnth-of-type()にあるのではと考えています。

ではsetTimeout() でいいじゃないかと言われてしまいそうですが、なんとなく「nth-of-type()を正しく使えばCSSだけで実現できるのではないか?」と思い、質問を投稿させて頂きました。

可能でしたらCSSで実現したいです。

ご協力どうぞ宜しくお願い申し上げます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

:nth-of-type()は同一型の兄弟要素の順番で指定するものなので、提示のように「HTML上で出てきた順番」には動きません。

【:nth-of-type() - CSS: カスケーディングスタイルシート | MDN】
https://developer.mozilla.org/ja/docs/Web/CSS/:nth-of-type

CSS の :nth-of-type() 疑似クラスは、兄弟要素のグループの中で指定された型の要素を、位置に基づいて選択します。


個別に番号を振りましょう。

js

1$( '.wrapper .target' ).each( function( i ){ /* たしかDOMツリー上の出現順になったような(未確認) */ 2 $( this ).addClass( 'target' + i ); 3}); 4$( 'button' ).click( function(){ 5 $( '.wrapper .target' ).addClass( 'fadeOut' ); 6});

【.each() | jQuery API Documentation】
https://api.jquery.com/each/

投稿2019/12/07 18:01

kei344

総合スコア69596

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

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

mononoke

2019/12/07 18:16

ありがとうございます!CSSはたしかに無理だと納得できたうえ、最適なJSだと感じました!
mononoke

2019/12/07 18:42

夜分遅くに失礼致します。 こちら、もしですけれど、逆さに $( this ).addClass( 'target' + i ); する方法などございませんか? 「DOMツリー上の出現順」ではなく「DOMツリー下の出現順」でのクラス付与、ということです。
kei344

2019/12/07 18:48

日本語として「ツリー下」ではないですね。 var cnt = $( '.wrapper .target' ).length; $( '.wrapper .target' ).each( function( i ){ $( this ).addClass( 'target' + ( cnt - i ) ); });
mononoke

2019/12/07 18:51

たしかにツリー下ってどこでしょうか笑 なるほど、初めに数えて引くんですね。迅速なご対応感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問