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

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

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

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

HTML

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

CSS

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

Q&A

解決済

2回答

833閲覧

JavascriptでHTMLの複数ある同一クラス名の中にある要素数を取得したい。

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

HTML

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

CSS

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

0グッド

0クリップ

投稿2020/05/20 03:54

編集2020/05/21 14:47

修正中

質問の仕方に指摘がありましたので、適切な文章、コードに書き直しています。

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

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

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

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

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

kei344

2020/05/20 04:00

クラス名が item2 item8 などなっていますが、何のために変えているのでしょうか。また、「このクラスを追加するというコード」はどの要素に対して何のクラスをつけるのでしょうか。
退会済みユーザー

退会済みユーザー

2020/05/20 04:03

申し訳ありません。CSSで画像の表示について記述しており、そのためです。 CSSをこちらに追加し忘れていたので、ただいま追加しました。よろしくお願いいたします。
kei344

2020/05/20 04:06

「このクラスを追加するというコード」はどの要素に対して何のクラスをつけるのでしょうか。
退会済みユーザー

退会済みユーザー

2020/05/20 04:14

各子要素(divタグで分けているもの)につけているitem1などは最終的に外して、javascriptで条件に合えばCSSの.item1を適用させるために、class item1を追加しようとしています。 今かけているjavascriptの場合だと、moreというクラスを、grid-contaner内の画像の数が6枚以上の時にitem5 moreのようにitem5クラスにmoreを追加しようとしています。 分かりにく申し訳ありません。よろしくお願いいたします。
thyda.eiqau

2020/05/20 04:26

え? <div class="grid-contaner"> の中の画像の数に応じて、 <div class="grid-contaner なんらかのクラス"> にするってことじゃないんですか? <div class="grid-contaner>ちょっかの<div>に対してクラスを与えるの??
kei344

2020/05/20 04:26

その具体的な条件も質問文に書かれたほうがよいです。(この「質問への追記・修正の依頼」の部分はデフォルトで表示されませんので、質問本文に追記することをお勧めします) 既についている回答はその「具体的な条件」がわからないから「適当な条件」をサンプルに処理の仕方を書かれています。
退会済みユーザー

退会済みユーザー

2020/05/20 04:30

thyda.eiqauさん <div class="grid-contaner>の下にある各画像要素に対してクラスをつけたいです。
退会済みユーザー

退会済みユーザー

2020/05/20 04:31

kei344さん ありがどうございます。修正します。
guest

回答2

0

querySelectorAllでforEachしてそれぞれについてquerySelectorAllして
必要なdomを掴んでください

投稿2020/05/20 05:12

yambejp

総合スコア116724

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

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

yambejp

2020/05/20 05:14

document.querySelectorAll('.hoge').forEach(x=>{ console.log(x.querySelectorAll('.fuga').length); }); まとめて値をとりたいなら配列化してmapすることになります。 具体的な要望がわかりづらいのでもういちど精査してみてください
退会済みユーザー

退会済みユーザー

2020/05/20 07:30 編集

丁寧に教えてくださりありがとうございました。 もっと分かりやすく記載すべきですね、申し訳ありません。
guest

0

ベストアンサー

js

1const classNamesForImgQty = [ 2 null, 3 'alpha', 4 'bravo', 5 'charlie', 6 'delta', 7 'echo', 8 'foxtrot', 9 'golf', 10]; 11querySelectorAll('.grid-contaner').forEach(container => { 12 console.log('container', container); 13 const imgQty = container.querySelectorAll('img').length; 14 console.log('> image qty', imgQty); 15 if(imgQty === 0) return; 16 const className = classNamesForImgQty[imgQty]; 17 console.log('> adding class name', className); 18 container.classList.add(className); 19});

追記

正直、クラスで指定するのが簡単か(やりやすいか・わかりやすいか)というと微妙な気がしますが……

js

1// .grid-contaner の要素を取得し、forEachで回す 2// 本筋とは関係ないですが、grid-conta"i"nerでは? 3document.querySelectorAll('.grid-contaner').forEach(container => { 4 // 画像の数は querySelectorAll('img').length で取得してもよいが、 5 // 将来的にimg以外の要素が入ってくる可能性を考慮して、直下のdivの数で取得する 6 const children = container.querySelectorAll(':scope > div'); 7 if(children.length === 0) return; 8 9 container 直下の <div> を取得し、forEachで回す 10 container.querySelectorAll(':scope > div').forEach((gridItem, idx) => { 11 switch(idx) { 12 case 0: 13 // 1つ目は基本的にはitem1 14 gridItem.className = 'item1'; 15 16 // 画像の数が1つのときはitem10, 2つのときはitem9 17 if(children.length <= 2) { 18 gridItem.className = `item${11-children.length}`; 19 } 20 break; 21 case 1: 22 // 2つ目は基本的にはitem2 23 gridItem.className = 'item2'; 24 25 // 画像の数が2つのときはitem8 26 if(children.length === 2) gridItem.className = `item8`; 27 break; 28 case 2: 29 case 3: 30 case 4: 31 // 3つ目から5つ目は基本的にはitem${idx+1} 32 gridItem.className = `item${idx+1}`; 33 34 // 画像の数が4つのときはitem${idx+4} 35 if(children.length === 4) gridItem.className = `item${idx+4}`; 36 37 // 画像の数が3つのときの3つ目はitem8 38 if(children.length === 3 && idx === 2) gridItem.className = 'item8'; 39 break; 40 default: 41 // 画像が6つ目以降のとき (idxが0から4ではないとき) はここで指定 42 gridItem.className = 'more'; 43 } 44 }); 45});

全体の幅と高さを固定しておいて、grid-templateを2等分なり3等分なりに変えたほうがいいような気がします。幅を3つに分けるところは5列ずつでいいとしても2つに分けるところが7列・8列になっていて気持ち悪いし……

さらに追記

別解です。gridの子供に指定するのではなく、親のgrid-templateを変えてしまえばよいという考え方です。

css

1.grid-container { 2 display: grid; 3 width: 100px; 4 height: 100px; 5} 6.grid-container[data-children-qty="1"] { 7 grid-template: "a" 1fr / 1fr; 8} 9.grid-container[data-children-qty="2"] { 10 grid-template: 11 "a" 1fr 12 "b" 1fr / 1fr; 13} 14.grid-container[data-children-qty="3"] { 15 grid-template: 16 "a a" 1fr 17 "b c" 1fr / 1fr 1fr; 18} 19.grid-container[data-children-qty="4"] { 20 grid-template: 21 "a b" 1fr 22 "c d" 1fr / 1fr 1fr; 23} 24.grid-container[data-children-qty="5+"] { 25 grid-template: 26 "a a a b b b" 1fr 27 "c c d d e e" 1fr / 1fr 1fr 1fr 1fr 1fr 1fr; 28} 29.grid-container > div { 30 border: 1px solid #222; 31} 32 33/* more */ 34.grid-container > div:nth-child(n+6) { 35 background-color: gray; 36} 37.grid-container > div:nth-child(n+6) p { 38 font-size: 2.5rem; 39 display: block; 40 position: relative; 41 left: 70px; 42 top: -170px; 43 color: white; 44} 45.grid-container > div:nth-child(n+6) img { 46 opacity: 0.6; 47 display: block; 48} 49.grid-container > div:nth-child(n+6) a { 50 color: white; 51 text-decoration: none; 52}

js

1document.querySelectorAll('.grid-container').forEach(container => { 2 const children = container.querySelectorAll(':scope > div'); 3 if(children.length === 0) return; 4 5 container.dataset.childrenQty = children.length >= 5? '5+' : children.length; 6 children.forEach((div, idx) => div.style.gridArea = 'abcde'.split('')[idx]); 7});

投稿2020/05/20 04:20

編集2020/05/20 08:06
thyda.eiqau

総合スコア2982

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

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

thyda.eiqau

2020/05/20 04:34

要件と違いましたのでのちほど追記します
退会済みユーザー

退会済みユーザー

2020/05/20 07:28

試してみたところ、思った通りに表示されました。 次からは自分で書けるように、努力しようと思います。 私のような初心者の分かりにくい質問に対して、お時間をくださったこと感謝します。 ご丁寧に教えてくださりありがとうございました。
退会済みユーザー

退会済みユーザー

2020/05/20 10:32

追記ありがとうございます! 知らないCSSの記載方法もあったので、じっくり見て理解しようと思います。 今、はじめにお答えいただいたJavascriptを読み解いているのですが、 このJavascriptに、要素が6枚以上になった時、5枚目の要素に特定のCSSを記載すると記述する場合はどのように書けば良いでしょうか? default:に書くと、6枚目にCSSが適応されてしまい、どうしたら良いか悩んでいます。
退会済みユーザー

退会済みユーザー

2020/05/20 10:53

何度もすみません。自分で解決できました! この度はありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問