開発するアプリケーションのヘッダメニューのプルダウンリストをMacOSに近づける話 : サンプル構築(後編)

2024年3月16日

HTML テクノロジー

eyecatch 前回要件を定義した、ヘッダメニューをコーディングしてみます。

ソースコード

index.html

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <link rel="stylesheet" href="css/style.css" /> </head> <body> <header> <label> <input class="open" type="checkbox" /> <ul> <li> <p>AAA</p> <ul> <li> <p>List-A-1</p> <ul> <li><p>List-A-1-1</p></li> <li><p>List-A-1-1</p></li> <li><p>List-A-1-1</p></li> </ul> </li> <li> <p>List-A-2</p> <ul> <li><p>List-A-2-2</p></li> <li><p>List-A-2-2</p></li> <li><p>List-A-2-2</p></li> </ul> </li> <li> <p>List-A-3</p> <ul> <li><p>List-A-3-3</p></li> <li><p>List-A-3-3</p></li> <li><p>List-A-3-3</p></li> </ul> </li> </ul> </li> <li> <p>BBB</p> <ul> <li><p>List-B-1</p></li> <li><p>List-B-2</p></li> <li><p>List-B-3</p></li> </ul> </li> <li> <p>CCC</p> <ul> <li><p>List-C-1</p></li> <li><p>List-C-2</p></li> <li><p>List-C-3</p></li> </ul> </li> </ul> </label> </header> <main> </main> </body> </html>

style.css

@import "header.css"; html,body{ margin:0; padding:0; } body{ display:flex; flex-direction:column; } *, *:before, *:after { -webkit-box-sizing : border-box; -moz-box-sizing : border-box; -o-box-sizing : border-box; -ms-box-sizing : border-box; box-sizing : border-box; } main{ flex:1; background-color:#444; }

header.css

header{ height:40px; background-color:black; } header *{ color:white; font-size:10px; user-select : none; } header .open{ display:none; } header p{ display:flex; align-items:center; padding:0 10px; } header ul{ margin:0; padding:0; } header li{ margin:0; padding:0; list-style:none; position:relative; cursor:pointer; min-width:100px; height:40px; } header > label > ul{ display:flex; flex-direction:rows; } header > label > ul > li ul{ display:none; flex-direction:column; background-color:black; position:absolute; } header .open:checked ~ ul li:hover > ul{ display:flex; } header > label > ul > li > ul{ top:100%; left:0; } header > label > ul > li > ul ul{ top:0; left:100%; } header li:hover{ background-color:#444; } header > label > ul > li li:has(ul)::after{ content:">"; position:absolute; right:10px; top:50%; transform:translateY(-50%); color:white; }

デモ

ポイント解説

Javascriptを使わずに、input type="checkbox"のcheckedをCSSで判定する方法で書いてみました。 HTMLとCSSが得意なコーダーの人だったら、さほど難しくないと思いますが、プログラマーと言われる人たちにとっては、こういうCSSって難しいようですね・・・ AAAのリストのみ、1階層深いサブメニューを表示するようにセットしてみました。 ネストを深くすれば、どんどんドリルダウンできてしまいますが、画面外の判定をしていないので、注意ポイントですね。 ひとつ難点があり、メニュー内に、スライダーなどの機能を設置して、リンクじゃない場合は、クリックした後すぐにメニューが非表示になってしまいます。 もし操作系をメニュー内に設けたい場合は、クリックしてからポップアップウィンドウなどで対応するのがいいでしょう。 あ、あと、レスポンシブデザイン考えていなかった!!! 画面サイズでcss切り替える方式で問題ないかとは思いますが、スマホではメニュー概念を変えないといけないかもですね。

あとがき

この手のメニューは、自分でライブラリを作って作り置きして、コピペで使えるようにすると効率的に仕事で活用できます。 ちなみに、今回のメニューも既に3回ぐらい作っているので、まあまあ効率的なコードになっていると思います。 もし、コードで不明点などある人がいたら、問い合わせフォームにて質問してくださいませ。

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ