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

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

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

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

CSS

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

Q&A

2回答

531閲覧

HTMLとCSSでアコーディオンメニューを作りたい

mei666

総合スコア15

HTML

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

CSS

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

0グッド

0クリップ

投稿2019/02/15 01:28

編集2019/02/15 02:28

HTMLとCSSでアコーディオンメニューを作りました。
メニューをクリックすると表示し、再度クリックすると非表示になります。

修正したいところ、
特定のメニューをクリックすると開いていたメニューが自動的に閉じる。
クリックしたときの動きを滑らかにしたい。
この2点がどうしてもうまくいきません。
どのあたりを修正したらよいか、アドバイスをいただけると助かります。
また、できればクリックして表示ではなく、マウスオーバーして表示非表示の操作にしたいのですが、今の記述で可能でしょうか。

html

1<div class="menu"> 2<label for="menu_bar07" class="label1"><a href="#top">TOP</a></label> 3 4<label for="menu_bar01" class="label1">工事</label> 5 <input type="checkbox" id="menu_bar01" class="accordion" /> 6 <ul id="links01"> 7 <li><a href="#kozi1">工事1</a></li> 8 <li><a href="#kozi2">工事2</a></li> 9 </ul> 10 <label for="menu_bar02" class="label1">機器修理</label> 11 <input type="checkbox" id="menu_bar02" class="accordion" /> 12 <ul id="links02"> 13 <li><a href="#shuri">修理</a></li> 14 <li><a href="#shiyou">使用方法</a></li> 15 </ul> 16 <label for="menu_bar03" class="label1">未分類</label> 17 <input type="checkbox" id="menu_bar03" class="accordion" /> 18 <ul id="links03"> 19 <li><a href="#kiki">機器</a></li> 20 <li><a href="#mibunrui">未分類</a></li> 21 </ul> 22</div></div>

css

1.menu li { 2 max-height: 0; 3 overflow-y: hidden; 4} 5 6#menu_bar01:checked ~ #links01 li, 7#menu_bar02:checked ~ #links02 li, 8#menu_bar03:checked ~ #links03 li, 9#menu_bar04:checked ~ #links04 li, 10#menu_bar05:checked ~ #links05 li, 11#menu_bar06:checked ~ #links06 li { 12 max-height: 46px; 13 opacity: 1; 14} 15 16.menu { 17 max-width: 400px; 18 margin: 0 auto; 19 padding: 0; 20} 21 22.menu a { 23 display: block; 24 padding: 10px; 25 text-decoration: none; 26 color: #000; 27 line-height: 1; 28} 29 30.label1 { 31 display: block; 32 margin: 0 0 2px 0; 33 padding :12px; 34 line-height: 1; 35 color :#fff; 36 background :#007bbb; 37 cursor :pointer; 38} 39 40input { 41 display: none; 42} 43 44.menu ul { 45 margin: 0; 46 padding: 0; 47 background :#f4f4f4; 48 list-style: none; 49} 50 51.menu li { 52 max-height: 0; 53 overflow: hidden; 54 -webkit-transition: height 0.3s; 55 -moz-transition: height 0.3s; 56 -ms-transition: height 0.3s; 57 -o-transition: height 0.3s; 58 transition: height 0.3s; 59} 60 61#menu_bar01:checked ~ #links01 li, 62#menu_bar02:checked ~ #links02 li { 63 max-height: 46px; 64 opacity: 1; 65}

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

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

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

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

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

azuapricot

2019/02/15 01:32

javascriptは使いたくないんですか?
mei666

2019/02/15 01:35

あまり、慣れていないもので・・・
azuapricot

2019/02/15 01:37

javascriptを使えば簡単だけどCSSだけでやろうとすると逆に難しくなってしまうものもあるので時間があるなら挑戦してみてもいいのでは・・・?
mei666

2019/02/15 01:39

難しくなってしまうのですね・・・。本日中に仕上げなくてはならないので、考え直しはちょっと難しいですが・・・調べてみます。
Lhankor_Mhy

2019/02/15 01:40

.menu が存在しないようですが、これは無視してよろしいですか?
mei666

2019/02/15 01:48

すみません。追加しました。
guest

回答2

0

hoverでやるなら、inputはいらないですね。
Lhankor_Mhyさんがおっしゃる通り、マウスアウトすると閉じてしまいますが。

html

1<div class="menu"> 2<div> 3<label for="menu_bar07" class="label1"><a href="#top">TOP</a></label> 4</div> 5 6<div> 7<label for="menu_bar01" class="label1">工事</label> 8<ul id="links01"> 9 <li><a href="#kozi1">工事1</a></li> 10 <li><a href="#kozi2">工事2</a></li> 11</ul> 12</div> 13 14<div> 15<label for="menu_bar02" class="label1">機器修理</label> 16<ul id="links02"> 17 <li><a href="#shuri">修理</a></li> 18 <li><a href="#shiyou">使用方法</a></li> 19</ul> 20</div> 21 22<div> 23<label for="menu_bar03" class="label1">未分類</label> 24<ul id="links03"> 25 <li><a href="#kiki">機器</a></li> 26 <li><a href="#mibunrui">未分類</a></li> 27</ul> 28</div> 29</div>

そして、+セレクタ使った方が、idセレクタとか抜きですっきりするかと

css

1.menu { 2 max-width: 400px; 3 margin: 0 auto; 4 padding: 0; 5} 6 7.menu a { 8 display: block; 9 padding: 10px; 10 text-decoration: none; 11 color: #000; 12 line-height: 1; 13} 14 15.menu li { 16 height: 0; 17 max-height: 0; 18 overflow-y: hidden; 19 -webkit-transition: height 0.3s; 20 -moz-transition: height 0.3s; 21 -ms-transition: height 0.3s; 22 -o-transition: height 0.3s; 23 transition: height 0.3s; 24} 25 26.menu > div:hover ul > li { 27 height: auto; 28 max-height: 46px; 29 opacity: 1; 30} 31 32.label1 { 33 display: block; 34 margin: 0 0 2px 0; 35 padding :12px; 36 line-height: 1; 37 color :#fff; 38 background :#007bbb; 39 cursor :pointer; 40} 41 42/* 43input { 44 display: none; 45} 46*/ 47 48.menu ul { 49 margin: 0; 50 padding: 0; 51 background :#f4f4f4; 52 list-style: none; 53}

投稿2019/02/15 03:43

編集2019/02/15 04:53
miyabi_takatsuk

総合スコア9528

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

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

0

まず、兄弟セレクタの使い方を間違っているため、動作しません。

~~同じ親要素の子同士であって、1つ目の要素の後にある2つ目の要素を選択します

一般兄弟結合子 - CSS: カスケーディングスタイルシート | MDN~~

css

1#menu_bar01:checked ~ #links01 li

liの親要素はulですから、このセレクタに当てはまる要素はありません。同様の誤りが複数見られます。
解決方法は、ulにスタイルを当ててください。

そして、transition: heightですが、

トランジション効果を適用する CSS プロパティを指定します

transition-property - CSS: カスケーディングスタイルシート | MDN

とあるように、指定したheightプロパティだけに有効になります。
解決方法ですが、transition: allとするのが無難です。

最後に、「特定のメニューをクリックすると開いていたメニューが自動的に閉じる」ですが、「特定のメニュー」を#closeとすると#close:checked ~ ulのようなセレクタで記述できると思いますが、その状態を保持してしまうので、メニューを再度開く際には「特定のメニュー」をもう一度クリックする必要があります。

質問が追加されていたので追記

「マウスオーバーして表示非表示の操作にしたい」ですが、labelidなどを持たせて:hover擬似クラスを使えばいいかと思います。
ただ、その場合マウスアウトすると非表示に戻ります。

回答に誤りがあったため一部削除しました

コメントを受けて追記

HTML

1<input type="checkbox" id="menu_bar01" class="accordion" />

HTML

1<input type="radio" name="menu_bar" id="menu_bar01" class="accordion" />

のように変更すると、一つのアコーディオンニューだけが開いている状態になります。
ただし、一度開くと、(他のセレクタでコントロールしない限り)必ず一つは開いている状態になってしまいます。

投稿2019/02/15 02:13

編集2019/02/15 03:50
Lhankor_Mhy

総合スコア36074

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

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

mei666

2019/02/15 02:49

現時点で、クリック操作で開いたり閉じたりはできるんです。li要素をulにすると動かなくなってしまうのですが・・・修正箇所が違うのでしょうか・・
Lhankor_Mhy

2019/02/15 03:32

大変失礼しました。その部分は私の間違いでした。
mei666

2019/02/15 03:38

いえいえすみません。 ほかのメニューをクリックすると開いているメニューを自動的に閉じたいと思うのですが、調べて当てはめてもなかなかうまくいきません。 この作り方自体がよくないのかもしれませんね。
Lhankor_Mhy

2019/02/15 03:42

「ほかのメニューをクリックすると開いているメニューを自動的に閉じたい」とのことですが、ご質問では「特定のメニューをクリックすると開いていたメニューが自動的に閉じる」だったので、てっきり「全部閉じるボタン」のような特定のメニューがあるのかと思っていました。 そういうことではないのですね。 それでしたら type="radio" を使うのがいいかと思います。後ほど追記します。
mei666

2019/02/15 03:51

すみません。書き方がよくなかったですね。 特定のメニューをクリックし、開く⇒別のメニューをクリックすると、前のメニューが自動的に閉じる、という仕組みを作りたいのです。
Lhankor_Mhy

2019/02/15 04:01

miyabi_takatsukさんのご回答が、お求めのコードにかなり近いと思います。 そちらをお試しになってみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問