この質問は非常に長いように思えますが、すべてを明確に説明したかったのです。
望ましい結果
サブメニュー付きの水平メニューバーがあります。ゼロから作成したため、既存のフレームワークは使用していません。セマンティック マークアップには、ボタン、アンカー、およびスパンの組み合わせを使用します。
- 新しいページに移動するアイテムのアンカー
- どこにも移動しないがサブメニューがある項目のボタン
- 無効なアイテムのスパン
注: このサイトは限られた特定のユーザー向けであるため、アクセシビリティの欠如については心配していません。
サブメニューは、含まれる最も幅の広いメニュー項目と同じ幅にする必要があります。また、カーソルとフォーカスの輪郭が必要に応じて表示されるように、各メニュー項目はサブメニューの幅を埋める必要があります。
問題
Firefox では、次のシナリオでは、サブメニューが最も幅の広い項目の幅まで拡張されません。
- サブメニューは絶対配置
- サブメニューは、静的以外の位置を持つブロック内に含まれています
- 最長のメニュー項目はボタンです
Chrome、IE 8、Firefox 12、および Firefox 20 でテストしました。Chrome と IE では期待どおりに表示されますが、どちらのバージョンの Firefox でも表示されません。
JavaScript、画像、無効化された項目、および多くのメニュー項目が削除された縮小版を作成しました。コードは以下とjsFiddleにあります。これは Firefox 20 のスクリーンショットです。
Section Titles項目が押しつぶされていること
に注意してください。サブメニューは、ページ タイトルアイテムと同じ幅です(パディングあり)。また、最上位のサブメニューではこれが問題にならないことに注意してください。このメニューは [ PDF タイトルのカスタマイズ] の幅まで拡張されています。
Section Titlesアイテムはボタンです。アンカーに変更すると、サブメニューが必要に応じて展開されます。ボタン CSS を remove に変更するwidth: 100%
と、サブメニューが必要に応じて展開されます。しかし、その後、サブメニューよりも狭いメニュー項目は幅を埋めなくなりました (追加してもdisplay: block
)。
これは、上記の修正によってメニューの他の部分がどのように壊れるかのスクリーンショットです。
テキストの外側にカーソルを置いたとき、カーソルがポインターではないことに注意してください。はい、 のカーソルを変更することで修正できますli
が、もう 1 つの問題はフォーカス アウトラインです。テキストだけでなく、メニュー項目全体の周りにフォーカス アウトラインを配置したい (これが での動作width: 100%
です)。
私も で遊んでみまし-moz-box-sizing
たが、それでも喜びはありません。
簡単な回避策として、この特定のケースでは、ページ タイトルを長くするためにページ タイトルにいくつか追加しました。ただし、メニューが動的に作成される場合、そのソリューションは機能しません。
HTML コード ( jsFiddle )
<ul id="navAdminMenu">
<li><a href="#">Companies</a></li
><li class="hasSubmenu"><button type="button">Books</button>
<ul>
<li><a href="#">Manage Books</a></li
><li><a href="#">PDF Profiles</a></li
><li class="hasSubmenu"><button type="button">Customize PDF Titles</button>
<ul>
<li><a href="#">Page Titles</a></li
><li class="hasSubmenu"><button type="button">Section Titles</button>
<ul>
<li><a href="#">Profile Section</a></li
><li><a href="#">Index Section</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li
><li class="hasSubmenu"><button type="button">Lists</button>
<ul>
<li class="hasSubmenu"><button type="button">Categories</button>
<ul>
<li><a href="#">Manage</a></li
><li><a href="#">Reports</a></li>
</ul>
</li
><li><a href="#">Key Contact Positions</a></li>
</ul>
</li>
</ul>
CSSコード
#navAdminMenu {
font-family: Arial, Helvetica, sans-serif;
font-size: 1em;
list-style: none;
margin: 0;
padding: 0;
background-color: #efefef;
}
#navAdminMenu button {
margin: 0;
padding: 0;
vertical-align: baseline;
border: none;
background-color: transparent;
cursor: pointer;
font-family: Arial, Helvetica, sans-serif;
font-size: 1em;
}
#navAdminMenu button::-moz-focus-inner {
padding: 0;
border: none;
}
#navAdminMenu a {
text-decoration: none;
}
#navAdminMenu li {
display: inline-block;
margin: 0;
border-right: 1px solid #ccc;
}
#navAdminMenu li:hover {
background-color: #4b545f;
}
#navAdminMenu > li > button, #navAdminMenu > li > a {
display: inline-block;
height: 2.3em;
line-height: 2.6;
padding: 0 10px;
}
#navAdminMenu > li > button, #navAdminMenu > li > a {
color: #06c;
}
#navAdminMenu > li > button:focus, #navAdminMenu > li > a:focus {
outline: 0; /* Firefox displays outline outside the menu box-shadow */
box-shadow: 0 0 0 3px #06c;
}
#navAdminMenu > li:hover > button, #navAdminMenu > li:hover > a {
color: #fff;
}
#navAdminMenu > li.hasSubmenu > button:after {
content: "v";
display: inline-block;
width: 13px;
margin-left: 5px;
}
#navAdminMenu ul {
display: none;
position: absolute;
padding: 0;
background-color: #5f6975;
}
#navAdminMenu li:hover > ul {
display: block;
}
#navAdminMenu ul > li {
display: block;
position: relative;
border-top: 1px solid #999;
border-bottom: 1px solid #000;
}
#navAdminMenu ul > li > button, #navAdminMenu ul > li > a {
height: 2em;
line-height: 2;
padding: 0 30px 0 10px;
white-space: nowrap;
}
#navAdminMenu ul > li > button {
width: 100%; /* full width of submenu */
text-align: left;
}
#navAdminMenu ul > li > a {
display: block; /* full width of submenu */
}
#navAdminMenu ul > li > button, #navAdminMenu ul > li > a {
color: #fff;
}
#navAdminMenu ul > li > button:focus, #navAdminMenu ul > li > a:focus {
outline: #fdcb01 solid 3px;
}
#navAdminMenu ul > li.hasSubmenu > button:after {
content: ">";
width: 16px;
position: absolute;
right: 0;
}
#navAdminMenu ul ul {
left: 100%;
top: 0;
}
質問
私が見逃している簡単なものはありますか?または、これをバグとして Mozilla に報告する必要がありますか?
注:ボタンをアンカーに変更したくありません。