次の機能を備えたメニューを実装しようとしています。
- 水平;
- 等幅のメニュー項目。
- メニュー項目はページ幅全体に広がっています (左側に群がっているだけではありません)。
- 動的 (css ルールは事前定義された項目数に依存すべきではありません);
- 項目が縦に並んだドロップダウン 2 番目のレベル。
- 純粋な CSS (JS なし!)。
これは、私が見ている完璧なメニューを表しているようです。
私は美しいテクニックを使ってそれを作ることにほとんど成功しましたdisplay: table-cell;
(簡単にするためにタグは省略されています):
<ul>
<li>Menu item</li>
<li>
Expandable ↓
<ul>
<li>Menu</li>
<li>Menu item</li>
<li>Menu item long</li>
</ul>
</li>
<li>Menu item</li>
<li>Menu item</li>
</ul>
ul {
display: table;
table-layout: fixed;
width: 100%;
}
li {
display: table-cell;
text-align: center;
}
li:nth-child(even){
background-color: lightblue;
}
li:nth-child(odd){
background-color: lightskyblue;
}
li ul { display: none; }
li:hover ul {
display: block;
position: absolute;
}
li:hover ul li {
display: block;
}
唯一の問題は、サブメニュー項目がページ幅いっぱいに表示され、部分的にブラウザ ウィンドウの外に出て、水平スクロールバーが強制的に表示されることです。
ガッ!StackOverflow で画像を投稿できません。JSFiddle で実際にテストしてみてください: http://jsfiddle.net/6PTpd/9/
float: left; clear: both;
に追加することでこれを克服できli:hover ul li
ます。しかし、そうすると、サブメニュー項目の幅が異なります:
フィドル: http://jsfiddle.net/6PTpd/10/
...または幅width: 15%;
: http://jsfiddle.net/6PTpd/12/
どちらの修正も見苦しく、等幅の問題も水平スクロールバーの問題も解決しません。
UPDこの投稿をブラッシュアップしているときに、スクロールバーの問題の解決策を見つけました。li:hover ul
幅を 0 に設定します。ただし、これにより、サブメニュー項目の幅を絶対値で指定する必要があります。:( http://jsfiddle.net/6PTpd/13/を参照
また、このソリューションは、最後のメニュー項目が展開されたときにうまくいかない場合があります。画面の幅によっては、ページがウィンドウよりも広く表示される場合があります: http://jsfiddle.net/6PTpd/15/
質問:
- 水平スクロールバーを有効にせずに、サブメニュー項目を親と同じ幅で表示するにはどうすればよいですか?
- 投稿の冒頭で説明したすべての前提条件を備えたメニューを作成できる別の CSS 手法はありますか?
多くの例を見つけましたが、それらのそれぞれは非伸縮性 (項目を左にフロートさせる) または非動的 (事前定義された数の項目から取得したサイズを使用します。たとえばwidth: 20%
、5 つの第 1 レベルの項目のそれぞれに対して、または、さらに悪いことに、絶対サイズを使用しています!)。