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

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

新規登録して質問してみよう
ただいま回答率
85.47%
ドロップダウンメニュー

GUIを操作するユーザーインターフェイスで、リストボックスに似ており、ユーザーがリストから値を選べるようにするものです。ドロップダウンのリストが非アクティブの場合は、単体の値を表示します。アクティブ化されると、ユーザーが選択可能な値のリスト一覧を表示(ドロップダウン)します。

HTML

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

CSS

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

Q&A

解決済

1回答

1456閲覧

メガメニューが全幅になってくれない

mupo

総合スコア37

ドロップダウンメニュー

GUIを操作するユーザーインターフェイスで、リストボックスに似ており、ユーザーがリストから値を選べるようにするものです。ドロップダウンのリストが非アクティブの場合は、単体の値を表示します。アクティブ化されると、ユーザーが選択可能な値のリスト一覧を表示(ドロップダウン)します。

HTML

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

CSS

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

0グッド

0クリップ

投稿2022/10/03 05:32

編集2022/10/03 06:22

実現したいこと

cssでメガメニューを実装したいと思っています。

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

「CSSだけ!メガメニューを作る簡単テクニック(レスポンシブ対応)」
上記サイトを参考に作成しましたが、flexでロゴなどと一緒に並べるとメガメニューが全幅になってくれないことに気づきました。

該当のソースコード

JSFiddle https://jsfiddle.net/pf3m5sad/

HTML

1<header> 2<div id="header"><h1>ロゴ画像</h1></div> 3<div id="header-right"> 4<div class="right-nav"> 5<ul><li>メニュー</li><li>メニュー</li><li>メニュー</li></ul></div></div> 6<div class="right-menu"> 7 <input id="hanburger" type="checkbox"> 8 <label for="hanburger" class="menu_button"></label> 9 <nav class="global_menu"> 10 <ul> 11 <li class="menu"> 12 <a href="#">★</a> 13 <ul class="child_menu"> 14 <li><a href="#">Child Menu</a></li> 15 <li><a href="#">Child Menu</a></li> 16 <li><a href="#">Child Menu</a></li> 17 <li><a href="#">Child Menu</a></li> 18 </ul> 19 </li> 20 <li class="menu"> 21 <a href="#">☆</a> 22 <ul class="child_menu"> 23 <li><a href="#">Child Menu</a></li> 24 <li><a href="#">Child Menu</a></li> 25 <li><a href="#">Child Menu</a></li> 26 <li><a href="#">Child Menu</a></li> 27 </ul> 28 </li> 29 </ul> 30 </nav> 31</div> 32</header>

css

1body { 2 overflow-x: hidden; 3} 4 5ul { 6 padding-left: 0; 7} 8 9header { 10 position: relative; 11 max-width: 1500px; 12 width: 100%; 13 margin: 0 auto; 14 display: flex; 15 align-items: start; 16} 17 18#header-right { 19 margin-left: auto; 20 text-align: right; 21 min-width: 768px; 22} 23 24div.right-nav { 25 position: relative; 26 margin-left: auto; 27} 28 29div.right-nav ul li { 30 display: inline-block; 31 margin-left: 2.5%; 32 margin-right: 2.5%; 33 text-align: center; 34} 35 36/* スマホ閲覧時のハンバーガーメニュー */ 37 38#hanburger { 39 display: none; 40 /* チェックボックスを非表示 */ 41} 42 43.menu_button { 44 /* ボタンのスタイル */ 45 width: 50px; 46 /* 幅 */ 47 height: 50px; 48 /* 高さ */ 49 position: fixed; 50 top: 20px; 51 right: 20px; 52 background: #db7093; 53 /* 背景色 */ 54 z-index: 10; 55} 56 57.menu_button::before { 58 /* アイコンのスタイル */ 59 font-family: "Font Awesome 5 Free"; 60 content: "\f0c9"; 61 /* アイコン「3本線」 */ 62 font-weight: 900; 63 position: absolute; 64 color: #fff; 65 top: 50%; 66 left: 50%; 67 transform: translate(-50%, -50%); 68} 69 70#hanburger:checked+.menu_button::before { 71 /* アイコンのスタイル(チェック済み) */ 72 content: "\f00d"; 73 /* アイコン「×印」 */ 74} 75 76.global_menu { 77 /* メニュー全体のスタイル */ 78 visibility: hidden; 79 /* メニューを非表示 */ 80 width: 100%; 81 height: 100%; 82 position: fixed; 83 top: 0; 84 left: 0; 85 padding: 30px; 86 color: #333; 87 /* 文字色 */ 88 background: #ffc0cb; 89 /* 背景色 */ 90 overflow-y: scroll; 91 text-align: center; 92} 93 94#hanburger:checked~.global_menu { 95 /* メニュー全体のスタイル(チェック済) */ 96 visibility: visible; 97 /* メニューを表示 */ 98} 99 100.global_menu a { 101 /* 各項目のスタイル */ 102 display: block; 103 width: 100%; 104} 105 106.global_menu a:hover { 107 /* 各項目のスタイル(ホバー時) */ 108 background: #ffb6c1; 109} 110 111.menu:not(:last-child) { 112 margin-bottom: 20px; 113} 114 115.menu>a { 116 /* 親項目のスタイル */ 117 font-weight: bold; 118 padding: 10px 20px; 119} 120 121.child_menu>li>a { 122 padding: 10px 30px; 123 font-size: 0.8em; 124} 125 126@media screen and (min-width: 481px) { 127 128 /* PC閲覧時のメガメニュー */ 129 130 .menu_button { 131 display: none; 132 /* ハンバーガーメニューのボタンを非表示 */ 133 } 134 135 .global_menu { 136 /* メニュー全体のスタイル */ 137 position: relative; 138 width: 100%; 139 max-width: 1785px; 140 margin: 0 auto; 141 padding: 0; 142 color: #fff; 143 /* 文字色 */ 144 background: #e6a3ad; 145 /* 背景色 */ 146 visibility: visible; 147 overflow-y: visible; 148 z-index: 9999; 149 text-align: right; 150 } 151 152 .menu, 153 .child_menu>li { 154 display: inline-block; 155 text-align: center; 156 } 157 158 .menu:not(:last-child) { 159 margin-bottom: 0; 160 } 161 162 .menu>a { 163 /* 親項目のスタイル */ 164 font-weight: normal; 165 padding: 0; 166 } 167 168 .menu:hover>a { 169 background: #ffb6c1; 170 } 171 172 .child_menu { 173 /* 下層メニューのスタイル */ 174 width: 100%; 175 position: absolute; 176 top: 100%; 177 left: 0; 178 color: #333; 179 /* 文字色 */ 180 background: #ffb6c1; 181 /* 背景色 */ 182 visibility: hidden; 183 /* 下層メニューを非表示 */ 184 opacity: 0; 185 /* 不透明度を最小に */ 186 transition: 1s opacity; 187 /* アニメーション設定 */ 188 } 189 190 .menu:hover .child_menu { 191 /* 下層メニューのスタイル(親項目ホバー時) */ 192 visibility: visible; 193 /* 下層メニューを表示 */ 194 opacity: 1; 195 /* 不透明度を最大に */ 196 } 197 198 .child_menu>li>a { 199 padding: 10px 0; 200 } 201 202 .child_menu>li>a:hover { 203 background: unset; 204 color: #fff; 205 } 206

試したこと

「.global_menu」のposition:relativeを削除し、「header」に追加する。
→このやり方で解決した話を見かけたので試しましたが、ピンクのエリアの表示がおかしくなりました。
visibilityの記述にも変更が必要なのかと思い、移動したりしてみましたがメガメニュー自体が消えてしまったりして解決しません。
どなたかご教授いただければ幸いです。

イメージ画像を追加しました↓
イメージ説明

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

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

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

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

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

Cocode

2022/10/03 06:09

完成形が分からないので、もしよければ、手書きでいいので見た目(レイアウト)を描いたものを写真に撮って、質問に添付していただくことは可能でしょうか? どれをどう横に並べ、どう展開したいのかが想像できなくて>< お手数をおかけします。
mupo

2022/10/03 06:23

質問ありがとうございます! わかりづらくて申し訳ありません。画像を追加しました。 希望系のところは加工なので、ちょっと右上のあたりがおかしくて申し訳ないのですが、よろしければご確認をお願いします。
Cocode

2022/10/03 07:23

わかりやすいイメージありがとうございましたー!
guest

回答1

0

ベストアンサー

とりあえず無理やりだいたいご希望の見た目にはできましたが、HTMLの構造とCSSの書き方に無理があるので、全体的に最初からやり直すことをおすすめします。
ご希望であればアドバイスも可能です。

見本ではメガメニューが全幅にちゃんとなっている理由は、親要素のwidthが画面に対して100%だからです。
質問者様のメガメニューの親要素は⭐️の幅しかありませんので、狭くなっちゃってるのです。

変更箇所抜粋

css

1@media screen and (min-width: 481px) { 2 /* PC閲覧時のメガメニュー */ 3 4 header { 5 position: fixed; /* 固定ヘッダーにする */ 6 height: 100px; /* ヘッダー全体の高さ固定 */ 7 background-color: #ccc; 8 } 9 10 #header-right { 11 margin-right: 50px; /* ⭐️ボタンを避けるための余白 */ 12 } 13 14 .right-menu { 15 position: fixed; /* 位置を画面に固定 */ 16 top: 0; 17 right: 0; 18 height: 100px; /* ヘッダーの高さにする */ 19 } 20 21 ... 22 23 .global_menu { 24 /* メニュー全体のスタイル */ 25 position: relative; 26 top: -16px; /* なぜかずれていたので無理やり位置調整 */ 27 right: 0; 28 height: 100px; /* ヘッダーの高さにする */ 29 max-width: 1785px; 30 margin: 0 auto; 31 padding: 0; 32 color: #fff; 33 /* 文字色 */ 34 background: #e6a3ad; 35 /* 背景色 */ 36 visibility: visible; 37 overflow-y: visible; 38 z-index: 9999; 39 text-align: right; 40 } 41 42 ... 43 44 .menu>a { 45 /* 親項目のスタイル */ 46 font-weight: normal; 47 padding: 38px 4px; /* ⭐️の位置を無理やり調整 */ 48 } 49 50 ... 51 52 .child_menu { 53 /* 下層メニューのスタイル */ 54 width: 100%; 55 position: fixed; /* スクリーンに固定 */ 56 top: 100px; /* ヘッダーの高さ */ 57 left: 0; 58 color: #333; 59 /* 文字色 */ 60 background: #ffb6c1; 61 /* 背景色 */ 62 visibility: hidden; 63 /* 下層メニューを非表示 */ 64 opacity: 0; 65 /* 不透明度を最小に */ 66 transition: 1s opacity; 67 /* アニメーション設定 */ 68 } 69 70 ... 71 72}

あと疑問としては、スマホの見た目にした時に、スマホメニューの中身が⭐️2つ分しかなくて、「メニュー、メニュー、メニュー」はないですけど大丈夫ですか?
「メニュー、メニュー、メニュー」もリンクになるのかなぁと思ったのですが…


見本のサイトのHTMLとCSSをほぼそのまま使いたければ

      Logo menu menu menu ⭐️ ⭐️ ----------------------------------- megamenu megamenu megamenu -----------------------------------

↑こんな感じのレイアウトにすれば楽だと思います。

もちろんご希望のロゴと横並びにするレイアウトも可能ですが、現在書かれているコードとは違うHTML構造と、CSSにしないといけないと思います。


CSSの命名規則について

コメント欄にてご質問いただいた、クラス名の「-」と「__」の違いについて回答です。

クラス名の付け方って迷うと思うんですけど、なのでいろんな人がルールをつくってくれていて(CSSの命名規則と呼ばれるようです)、BEMとかSMACSSとかが有名です。
で、私がお送りしたサンプルコードはBEMっぽいルールです。

「__」について

BEMは.block__element--modifierというルールです。

  • .block: 要素の塊、大きなくくり
  • __element: 塊の中の一要素
  • --modifier: 修飾語。パターン違い

例)

html

1<h1>好きなフルーツランキング</h1> 2<ol class="ranking"> 3 <li class="ranking__item">パパイヤ</li> 4 <li class="ranking__item">マンゴー</li> 5 <li class="ranking__item">キウイ</li> 6 <li class="ranking__item">パイナップル</li> 7</ol> 8 9<!-- 見た目ほぼ一緒で色違いの場合 --> 10<button class="btn btn--red">赤色ボタン</button> 11<button class="btn btn--green">緑色ボタン</button>
「-」について

ハイフンは単語を繋げたい時に使います!
例えば、「apple juice」という一つのクラス名をつけたい場合、

  • <p class="apple juice">と書くと、.apple .juice別のクラスになってしまいます。
  • <p class="applejuice">は読みにくい。
  • <p class="apple-juice">読みやすいし、1つのクラスになる。

SMACSSやFLOCSS等はもっと細かくルールが決められているようです。
より詳しい情報はお調べくださいませ。
私の命名法は自己流がかなり入っていると思うので正しくないです。

投稿2022/10/03 07:19

編集2022/10/04 08:09
Cocode

総合スコア2314

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

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

mupo

2022/10/03 08:15

大変丁寧に教えていただきありがとうございます! たしかに希望通りの見た目にはできました。 コードがごちゃついている自覚はあるのですが、参考サイトのレイアウトから横並びの形に修正するのが精いっぱいで、具体的にどのように書けばスマートになるのかがわからず……よろしければアドバイスいただけると嬉しいです。 >あと疑問としては、スマホの見た目にした時に、スマホメニューの中身が⭐️2つ分しかなくて、 >「メニュー、メニュー、メニュー」はないですけど大丈夫ですか? >「メニュー、メニュー、メニュー」もリンクになるのかなぁと思ったのですが… 大丈夫です。「メニュー、メニュー、メニュー」はスマホ表示不要で、★印のメニューはPC&スマホ表示しなくてはならない……というデザイン的な縛りがあります; 教えていただいたレイアウトにしたいのは山々なのですが、縛りがあるので見本サイトのものをそのまま使用することができない感じです。 どうしても横並びのレイアウトにする必要がある感じで、申し訳ないです。
Cocode

2022/10/03 08:20

いえいえ、すごく頑張られてるのは感じられるので、ただのお節介アドバイスでした>< ちょっとおすすめのコード考えてみますー!
mupo

2022/10/03 08:43

ありがとうございます!お手数をおかけします;_;今後の参考になるので大変ありがたいです。 ゆっくりお待ちしています!
Cocode

2022/10/03 09:24 編集

ざっと組んでみました!こんな感じでいかがでしょう? https://jsfiddle.net/9f2rokc8/ スマホの見た目はつけていないので、PC幅でみてくださいー! スマホで不要な「メニュー、メニュー、メニュー」は、スマホ幅では非表示になるようにはしました。
mupo

2022/10/04 00:54

ありがとうございます!すごくコンパクトなcssになっていて驚きました…! 当初のものと並べてみると、divタグばっかり使いすぎていたのかなと実感しますx_x 恐縮ながら一点質問させていただきたいのですが、クラス名の区切り方に「-」と「__」があるのにはなにか理由付けのようなものがありますか?
Cocode

2022/10/04 08:10

クラス名のハイフンなどについての回答を更新しましたー!
mupo

2022/10/04 08:33

うわーありがとうございます!ご指導いただき感謝申し上げます! BEMやSMACSSといった用語自体初めて知りましたので、教えていただいたことを参考にこれから検索をかけて理解に努めたいと思います。 メインの質問外のことにも関わらず、本当に丁寧にご回答いただきありがとうございました^-^*今後はもう少しマシなコードが書ける気がします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問