1

フロートなしで CSS メニューを作成する方法を学んでいます。これまでのところ、部分的に「機能する」メニューを入手しました。ただし、メイン メニューの境界線は分離されています。また、サブメニューの境界線のサイズが半分になり、ホバーの背景色が機能しません。同時に、サブサブメニューが機能していません

また、.menu .submenu .sub-submenu クラスを使用して CSS コードを簡素化しようとしています。

jsFiddle: http://jsfiddle.net/vn64H/1/


HTML

<!DOCTYPE html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Title: Navigation menu</title>

    <link rel="stylesheet" type="text/css" href="menu.css">
</head>
<body>

<!-- START: menu -->
<ul id="nav">
    <li class="menu"><a href="#">Home</a></li>
    <li class="menu"><a href="#">Main Menu 2</a>
        <ul class="submenu">
            <li><a href="#">Sub Menu 2.1</a></li>
            <li><a href="#">Sub Menu 2.2</a></li>
            <li><a href="#">Sub Menu 2.3</a>
                <ul>
                <li><a href="#">Sub-Sub Menu 2.3.1</a></li>
                <li><a href="#">Sub Menu 2.3.2</a></li>
                <li><a href="#">Sub Menu 2.3.</a></li>
                </ul>
            </li>
            <li><a href="#">Sub Menu 2.4</a></li>
            <li><a href="#">Sub Menu 2.5</a></li>
            <li><a href="#">Sub Menu, Some Sample Text  2.6</a></li>
            <li><a href="#">Sub Menu, Sample Text  2.7</a></li>
        </ul>
    </li>
    <li class="menu"><a href="#">Main Menu 3</a>
        <ul class="submenu">
            <li><a href="#">Sub Menu 3.1</a></li>
            <li><a href="#">Sub Menu 3.2</a></li>
            <li><a href="#">Sub Menu 3.3</a></li>
            <li><a href="#">Sub Menu 3.5</a></li>
            <li><a href="#">Sub Menu 3.6</a></li>
            <li><a href="#">Sub Menu 3.7</a></li>
        </ul>
    </li>
    <li class="menu"><a href="#">Main Menu 4</a>
        <ul class="submenu">
            <li><a href="#">Sub Menu 4.1</a></li>
            <li><a href="#">Sub Menu 4.2</a></li>
            <li><a href="#">Sub Menu Sample Text 4.3</a></li>
            <li><a href="#">Sub Menu 4.4</a></li>
            <li><a href="#">Sub Menu 4.5</a></li>
            <li><a href="#">Sub Menu 4.6</a></li>
            <li><a href="#">Sub Menu 4.7</a></li>
            <li><a href="#">Sub Menu 4.8</a></li>
        </ul>       
    </li>
    <li class="menu"><a href="#">Menu 5</a></li>
    <li class="menu"><a href="#">Menu 6</a></li>
    <li class="menu"><a href="#">Contact</a></li>
</ul> <!-- /#menu -->
<!-- END: menu -->


</body>
</html>


CSS

@charset "utf-8";
#nav {
    background-color: #000;
    position: relative;

    font-family: Arial, Helvetica, sans-serif; 
    font-size: 0.975em;
    text-align: left;
    display: block;
    border: 1px dotted #cccccc;
    padding: 0;
    margin: 0;
}
#nav a {
    color: #fff;
    text-decoration: none;
}
#nav li {
    color: #fff;
    text-align: left;

    width: 110px;
    border: 1px solid #CCCCCC;
    list-style-type: none;
    padding: 0;
    margin: 0;
    display: inline-block;
}

/*Sub menu */
#nav li ul {
    color: navy;
    text-align: left;
    list-style-type: none;

    width: 200px;
    border: 1px solid #000;
    padding: 0;
    margin: 0;

    display: none;
    position: absolute;
    background-color: #990000;
}
#nav li ul a {
    display: inline-block;
}
#nav li:hover ul {
    visibility: visible;
    display: block;
    background-color: #E6B800;
}
#nav li:hover ul li {
    background-color: #E6B800;
}

/*Sub-sub menu */
#nav li ul li ul li a {
    display: none;
}
#nav li ul li ul li:hover {
    visibility: visible;
    display: block;
    background-color: #E6B800;
}
#nav li ul li ul li:hover ul li {
    background-color: #E6B800;
}
4

2 に答える 2

3

メインメニューの境界線は<li>、間に空白があるインラインブロックであるため、分離されています。インライン ブロックはテキスト ストリーム内の単語のように機能するため、改行など空白はテキスト スペース文字として解釈されます。それらをインラインブロックに保ちながらそれを回避する唯一の方法は<li>、間に空白を入れずにすべての 's を 1 行に配置することです。なぜフロートを避けたいのですか?それがあなたの最良の選択肢でしょう。

コンテナの幅が 200px であるため、サブメニュー項目は半分のスペースになっていますが、各項目は幅が指定されていないインライン ブロックです。それらをdisplay:block逆にすると、コンテナーの端まで拡張されます。

サブおよびサブサブメニュー クラスを適用してください。これにより、非常に多くのネストされたセレクターよりも見やすく、操作しやすくなります。

また、子セレクター構文を使用します。たとえばul#nav > li、関連するスタイルを子アイテムにのみ適用し、孫には適用しません。

更新
mcknz の質問に答えて、代わりfloat:leftに. これにより、次の 2 つの問題が解決されます。 #nav li display:inline-block

  • HTML の空白に関係なく、メニュー項目間の意図しないスペースが消えます。マージンを使用して間隔を正確に制御できるようになりました。
  • IE7 は、インライン ブロックを list-items に適用しません。または、ネイティブでインラインでない要素には適用しません (参照: http://fourwhitefeet.com/2009/02/css-display-inline-block-in-ie7/ ) 。
  • 重要な注意: フローティング要素のフローティングでない親は折りたたまれるため、#nav の高さを明示的に指定する必要があります (参照: フローティング要素のフローティングでない親が折りたたまれるのはなぜですか? )。

    ...また、text-align: left;に適用すると、後続の宣言を安全に削除できます。#navこのプロパティは、ネストされたすべての要素に継承されます。もちろん、テキストが左または中央に配置された介在レイヤーがある場合を除きます。継承するプロパティは次のとおりです: http://www.communitymx.com/content/article.cfm?cid=2795d

    于 2012-04-27T22:06:52.037 に答える
    1

    メニューの各リスト項目の後の改行は、スペースとして機能します。すべてを 1 行にまとめるように変更することも、マークアップで視覚的に分離したい場合はコメントを使用することもできます。

    <li class="menu"><a href="#">Home</a></li><!--
    --><li class="menu"><a href="#">Main Menu 2</a>
    
    于 2012-04-27T22:06:42.030 に答える