0

カウンター アクティブな css クラスを持つメニュー バーに取り組んでいます。メニューバーを中央に配置し、ドロップダウンを適切なリスト項目の下に配置する必要があります。どちらか一方を取得できますが、両方を同時に機能させることはできません。メニュー バーはサイズが変わるため、固定マージンを残しても機能しません。これは、メニュー バーがどのように見えるかですが、中央に配置されていません。 ここに画像の説明を入力

#mainmenu ul li{} から float: left を削除すると、次のようになります。これで中央揃えになりましたが、ユーザー名の下にあるアイテムはすべて左にシフトされています。

ここに画像の説明を入力

なぜこれが起こるのですか?どうすればそれを回避できますか?

html:

<div id="mainmenu">
    <?php
    if(Yii::app()->user->name)
    $display_name = Yii::app()->user->name;
    if(strlen($display_name) > 11){
        $display_name = substr($display_name,0,9);
        $display_name =$display_name.'...';
    }
    ?>
    <?php $this->widget('zii.widgets.CMenu',array(
        'items'=>array(
            array('label'=>'Home', 'url'=>array('/site/index')),
            array('label'=>'My Tickets', 'url'=>array('/ticket/mytickets'), 'visible'=>!Yii::app()->user->isGuest),
            array('label'=>'About', 'url'=>array('/site/page', 'view'=>'about')),
            array('label'=>'Contact', 'url'=>array('/site/contact')),
            array('label'=>'Schools', 'url'=>array('/school'), 'visible'=>Yii::app()->user->id == 'admin'),
            array('label'=>'Teams', 'url'=>array('/team'), 'visible'=>Yii::app()->user->id == 'admin'),
            array('label'=>'Login', 'url'=>array('/site/login'), 'visible'=>Yii::app()->user->isGuest),
            array('label'=>'Games', 'url'=>array('/game'), 'visible'=>Yii::app()->user->id == 'admin'),
            array('label'=>'Users', 'url'=>array('/user'), 'visible'=>Yii::app()->user->id == 'admin'),
            array('label'=>'Tickets', 'url'=>array('/ticket'), 'visible'=>Yii::app()->user->id == 'admin'),
            array('label'=>'Team Placement', 'url'=>array('/tournamentresults'), 'visible'=>Yii::app()->user->id == 'admin'),
            array('label'=>$display_name, 'url'=>array('#'), 'visible'=>!Yii::app()->user->isGuest,
                    'items' => array(
                array('label'=>'Edit User', 'url'=>array('/company/index')),
                array('label'=>'Log-out', 'url'=>array('/site/logout'))
    ),


            ),
        ),
    )); ?>
</div><!-- mainmenu -->

生成された HTML コード:

<div id="mainmenu">
   <ul id="yw0">
    <li class="active"><a href="/index.php/site/index">Home</a></li>
    <li><a href="/index.php/ticket/mytickets">My Tickets</a></li>
    <li><a href="/index.php/site/page?view=about">About</a></li>
    <li><a href="/index.php/site/contact">Contact</a></li>
    <li><a href="/index.php/site/#">SirRahal</a>
        <ul>
            <li><a href="/index.php/company/index">Edit User</a></li>
            <li><a href="/index.php/site/logout">Log-out</a></li>
        </ul>
    </li>
    </ul>    
</div>

CSS コード:

 #mainmenu
{
height:33px;
margin: auto;
text-align:center;
}

#mainmenu ul li
{
display: inline;
float: left;
margin: auto;
}

#mainmenu ul li a
{
color: #fbf3e1;
font-size:14px;
padding-top:5px;
padding-bottom:5px;
width:217px;
background: #33332c;
}

#mainmenu ul li ul {
display: none;
position: absolute;
margin-left: -20px;
}

#mainmenu ul li:hover > ul {
display: block;
}

#mainmenu ul li a:hover, #mainmenu ul li.active a
{
color: #f5921e;
border-bottom: solid 5px #f5921e;
text-decoration:none;
border-bottom-right-radius: 5px;
border-bottom-left-radius: 5px;
}
4

2 に答える 2

1

私の意見では、CSS ドロップダウン/フライアウト メニューを構築するための最大の鍵は、absolute positioned要素内でrelative positioned要素を使用し、それらをどこで使用するかです。さらに重要なことは、これら 2 つのポジショニング スキームが互いにどのように関連しているかを理解することです。作成したら、あらゆる種類のドロップダウン/フライアウト メニューを作成できます。

サブメニューが含まれているかどうかに関係なく、position: relativeすべてのメニューに設定する必要があります。CSS プロパティのli使用を開始しない限り、そのようにしても位置には影響しません。top, right, bottom, left

.menu li {
     position: relative;
}

ここで、メニュー内ulの の子であるすべての位置を に設定します。また、すぐに表示したくないので、 で非表示にします。liposition: absolutedisplay: none

.menu li > ul {
     display: none;
     position: absolute;
}

絶対配置要素の包含要素に対して相対的な位置を適用すると、絶対配置要素を含めるのに役立ちます。それだけでなく、絶対配置された要素は、相対配置された親要素に基づいて配置されます。これが私たちが望んでいることです。top: 0andleft: 0を設定するとul、 an の子である a が、li親要素の左上隅と同じ左上の位置から開始されます。

これまでに説明した 2 つのルールは、CSS のドロップダウン/フライアウト メニューの基本的な構成要素です。

この時点から、CSS に他に何を追加する必要があるかは、デザインの目標によって異なります。

私は (ほとんどの場合) ジェネリック コードを残りの部分で使用します。これは、自分自身や他のユーザーが基本原則に基づいて構築し、独自の特定の結果を得ることができるようにするためです。そうは言っても、残りのコードはあなたが提供したものに基づいています。ボーダーなどの表面的なスタイルは無視されますが、後で追加できます。

HTML

使用する HTML は次のとおりです。必要に応じてアンカー要素を追加します。

<ul class="menu">
    <li>One</li>
    <li>Two
        <ul>
            <li>Sub Two A</li>
            <li>Sub Two B</li>
        </ul>
    </li>
    <li>Three</li>
</ul>
  • トップレベルのメニューはインラインなので、それfloat: leftを行うために使用しましょう。
  • それらは固定幅でもあります。アンカー タグを使用してこれを行っていますが<a>、これは問題ありませliん。.
  • あなたのテキストは中央揃えです。
.menu li {
     float: left;
     position: relative;
     text-align: center;
     width: 100px;
}

**変数LIの回答については、以下の編集を参照してください**

固定幅のナビゲーション要素を使用しているため、ナビゲーションを中央揃えにすることができますmargin: 0 auto要素を中央に配置するために左と右のマージンを使用するには、幅を設定する必要があります! autoトップ レベルliの全幅を合計するだけで、ナビゲーションを中央に配置するために必要な幅が得られます。幅の計算には、パディング、マージン、ボーダーなどを含めることを忘れないでください。

私の例では幅3liを使用しています。100px

.menu {
    width: 300px; /* width of the 3 li */
    margin: 0 auto; /* centers ul when width is specified */
}

次に、サブメニューを配置しulます。

  • サブメニューを含むの高さtopまで押し下げる必要があるためです。25px が の高さであると仮定します。ullili
  • left含まれているものと同じ端から開始したい場合は、0liを使用します。
.menu li > ul {
     display: none;
     left: 0;
     position: absolute;
     top: 25px;
}

ul親がホバーされたときにサブメニューを表示しましょうli

.menu li:hover > ul {
    display: block;
}

CSS

最終的なCSS。

.menu {
    width: 300px; /* width of the 3 li */
    margin: 0 auto; /* centers ul when width is specified */
}
.menu li {
    float: left;
    line-height: 25px; /* assumed height of li */
    position: relative;
    text-align: center;
    width: 100px;
}
.menu li > ul {
    display: none;
    left: 0;
    position: absolute;
    top: 25px;
}
.menu li:hover > ul {
    display: block;
}

これは、すべてをラップするいくつかの基本的なスタイリングを備えたjsFiddleです。

ほら!CSS ドロップダウン/フライアウト メニューの入門書。いつものように、あなたのニーズには、私が提供したものにいくつかの変更または追加が必要になります. 基本を理解していれば、より詳細で堅牢なソリューションを開発するのに大いに役立ちます。

**編集**

liナビゲーションに変数の数があることに気付きました。必要に応じて変更を加えます。これは、相対位置とパーセンテージ位置の組み合わせです。

.menu {
    float: left;
    position: relative;
    left: 50%;
}
.menu li {
    float: left;
    line-height: 25px; /* assumed height of li */
    position: relative;
    right: 50%;
    text-align: center;
    width: 100px;
}
/* undo the right positioning for submenu li so it aligns properly */
.menu li > ul li {
    right: auto;
}

これは更新されたjsFiddleです。

于 2014-09-29T19:10:12.730 に答える
0

LI要素ではなく要素をスタイリングに使用して、CSS を次のように置き換えますA

body {
    width:100%;
}
#mainmenu {
    display: block;
    width:100%;
}
#mainmenu ul {
    width:100%;
}
#mainmenu ul li {
    display: inline-block;
    position:relative;
    margin: auto;
    width:19%;
    background: #33332c;
    padding-top:5px;
    padding-bottom:5px;
}
#mainmenu ul li a {
    color: #fbf3e1;
    font-size:14px;
}
#mainmenu ul li ul {
    display: none;
    position: absolute;
}
#mainmenu ul li:hover > ul {
    display: block;
    width:auto;
    position:absolute;
    top:30px;
    left:0;
    background: #33332c;
    padding:10px;
}
#mainmenu ul li:hover > ul li {
    display: block;
    width:150px;
    height:auto;
}
#mainmenu ul li a:hover, #mainmenu ul li.active a {
    color: #f5921e;
    border-bottom: solid 5px #f5921e;
    text-decoration:none;
    border-bottom-right-radius: 5px;
    border-bottom-left-radius: 5px;
}

追加の調整が必要になる場合がありますが、基本はここにあります

ここでフィドルを参照してください

于 2014-09-29T18:55:36.037 に答える