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

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

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

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

CSS

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

Q&A

解決済

1回答

1712閲覧

CSSでのハンバーガーボタン(ハンバーガーメニュー)実装

nano_creator

総合スコア3

HTML

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

CSS

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

0グッド

0クリップ

投稿2021/07/28 04:21

前提・実現したいこと

書籍を使ってCSSの勉強をする過程で
理解できない箇所があり、教えていただきたいです。

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

ハンバーガーボタンのクリックでナビゲーションの表示を行うコードがあるのですが、
CSSの下記の部分で".nav"を削るとナビゲーションが表示されなくなります。
これはなぜなのでしょうか?

<nav>タグについては"display: none"などの非表示の指定はしていないので、 ハンバーガーボタンがクリックされたタイミングで再度表示する指定をする必要はないと思いました。

CSS

1.nav-toggle:checked ~ .nav .nav-list{ 2 display: block; 3}

該当のソースコード

HTML

1<header class="header"> 2<!-- (ヘッダーを記述する) --> 3 <!-- ロゴ画像 --> 4 <h1 class="logo"> 5 <a href="./index.html"><img src="img/logo.svg" alt="Aqua"></a> 6 </h1> 7 <!-- ハンバーガーボタン --> 8 <input type="checkbox" name="navToggle" id="navToggle" class="nav-toggle"> 9 <label for="navToggle" class="btn-burger"></label> 10 <!-- ナビゲーション --> 11 <nav class="nav"> 12 <ul class="nav-list"> 13 <li>ホーム</li> 14 <li><a href="guide/index.html">営業案内</a></li> 15 <li><a href="contact/index.html">お問い合わせ</a></li> 16 </ul> 17 </nav> 18</header>

CSS

1/* ハンバーガーボタン */ 2.nav-toggle{ 3 display: none; 4} 5 6.btn-burger{ 7 display: block; 8 position: absolute; /* .heightが基準 */ 9 top: 5px; 10 right: 10px; 11 height: 44px; 12 width: 44px; 13 z-index: 2; 14 background: url(../img/burger.svg) center center / 35px 20px no-repeat; 15 cursor: pointer; 16} 17 18.nav-toggle:checked ~ .btn-burger{ 19 background: url(../img/close.svg) center center / 26px 26px no-repeat; 20} 21 22.nav-toggle:checked ~ .nav .nav-list{ 23 display: block; 24} 25 26/* ナビゲーション */ 27.nav{ 28 background: url("../img/nav_bg.png") center center / cover no-repeat; 29 padding-top: 10px; 30} 31 32.nav-list{ 33 display: none; 34 margin: 0; 35 padding-bottom: 10px; 36} 37 38.nav li{ 39 padding: 10px; 40} 41 42.nav a{ 43 color: #fff; 44}

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

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

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

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

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

guest

回答1

0

ベストアンサー

~は一般兄弟結合子と呼ばれ、兄弟関係であることを示します。
一般兄弟結合子 - CSS: カスケーディングスタイルシート | MDN

.nav-toggle:checked ~ .nav .nav-listは「.nav-toggle:checked の兄弟である .nav の子孫である .nav-list」という意味です。
.nav-toggle:checked ~ .nav-listは「.nav-toggle:checked の兄弟である .nav-list」という意味です。.nav-list は .nav-toggle の兄弟ではないので、そのような要素は存在しません。

つまり、.navを削ると意味が変わることが原因です。

投稿2021/07/28 05:01

Lhankor_Mhy

総合スコア36960

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

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

nano_creator

2021/07/28 07:33

回答ありがとうございます! 一般兄弟結合子という名称すら知らなかったので、大変勉強になりました。 ほかに、子孫結合子、子結合子、隣接兄弟結合子というものもあるのですね。 今回の例だと、一般兄弟結合子と子孫結合子を組み合わせたものということですね。 子孫結合子は名称は知りませんでしたが、使い方は知っていたので、すんなり理解できました。 調べるにしてもどのワードで検索するべきかすらわからなかったので、本当にありがとうございました!
Lhankor_Mhy

2021/07/28 07:42

お役に立てたようで何よりです。 「結合子」は、CSS2の時代は「セレクタ」と呼ばれていたので、「一般兄弟結合子」よりも「兄弟セレクタ」や「間接セレクタ」の方が通りがいいかもしれません。
nano_creator

2021/07/28 09:17

助かりました。ありがとうございます。 確かに書籍には、「子孫セレクタ」「関節セレクタ」と記載されていました。 追加で疑問に思ったのですが、 「.nav-toggle ~ .nav .nav-list:checked 」もNGな理由をご存じでしたら教えていただきたいです。 「.footer-nav-list li:first-child」は正しく適応されているのですが、 上記がNGなのは、一般兄弟結合子が含まれているからなのでしょうか? 関節セレクタの場合は、先頭のタグ記述後に疑似クラスの指定が必要で、 子孫セレクタであれば終端のタグ記述後に疑似クラスを指定するとのことでしょうか? もしご存じであれば教えていただきたいです。
Lhankor_Mhy

2021/07/28 13:00

:checked は疑似クラスの一つで、チェックボックスやラジオボタンで「チェックされているもの」を表します。疑似クラスは通常のクラスセレクタと同様に、要素に対してかかります。 ですので、 「.nav-toggle ~ .nav .nav-list:checked」は、.nav-toggle の兄弟である .nav の子孫である .nav-list でチェックされているもの、という意味になります。 .nav-list はチェックボックスやラジオボタンではないので、チェックされているものではありえないので有効にはならないです。
nano_creator

2021/07/29 00:10

お答えいただきありがとうございます! なるほどです。 意味を考えるとすごく納得できました。 疑似クラスをどこに記述するかではなく、どの要素に対して疑似クラスがかかっているかを考える必要があるのですね。 追加質問にも親切にありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問