Попытка добавить подменю в css

Я пытаюсь добавить подменю в css по адресу http://jsfiddle.net/hozey/9dGuc/, но, кажется, не могу разобраться. Может ли кто-нибудь помочь этому новичку? Вот хтмл. Я хочу сделать подменю для лошадей 1, 2 и 3.

<div class="menu">
<ul>
<!--begin to insert contents-->
<li class="item-first"><a href="http://www.lawsart.com" target="_top">Home</a></li>
<li><a class="current">Portfolio &#9660;</a>
<ul>
<li><a href="http://www.lawsart.com/Horses1.html" target="_top">Horses 1</a></li>
<li><a href="http://www.lawsart.com/Horses2.html" target="_top">Horses 2</a></li>
<li><a href="http://www.lawsart.com/Horses3.html" target="_top">Horses 3</a></li>
<li><a href="http://www.lawsart.com/Dogs.html" target="_top">Dogs</a></li>
<li><a href="http://www.lawsart.com/People.html" target="_top">People</a></li>
<li><a href="http://www.lawsart.com/Stills.html" target="_top">Stills</a></li>
</ul>
</li>
<li><a href="http://www.lawsart.com/Order.html" target="_top">Order</a></li>
<li><a href="http://www.lawsart.com/Contact.html" target="_top">Contact Me</a></li>
</ul>
</div> <!-- end menu -->

</div>

Вот css, который у меня есть:

body {
  margin: 0px;
}
#wrapper {
  border: px solid black;
  margin: 1em auto;
  font-family: Arial,Helvetica,sans-serif;
  width: 760px;
  text-align: left;
  background-color: #cccccc;
  overflow:hidden;
  height:150px;
}

.menu {font-family: arial, sans-serif;width:760px;position:relative;font-size:0.7em; margin:0px auto;}

.menu ul li a {display:block; 
               text-decoration:none; 
               width:97px; 
               height:25px; 
               text-align:center; 
               color:white; 
               padding-left:1x; 
               border:px solid; 
               border-width:0 0px 0px 0; 
               background:; 
               line-height:25px; 
               font-size:1.0em;}

.menu ul {padding:0;margin:0;list-style-type: none; }

.menu ul li {float:left;position:relative;}

.menu ul li ul {visibility:hidden;position:absolute;}

.menu ul li:hover a, .menu ul li a:hover {color:white;background:#3BA110;}

.menu ul li:hover ul, .menu ul li a:hover ul {visibility:visible;left:0;}

.menu ul li:hover ul li a, .menu ul li a:hover ul li a {display:block; 
                                                        background:#444444; 
                                                        color:white; 
                                                        width:97px; 
                                                        padding-left:1px;
                                                        border-right:none;}

.menu ul li:hover ul li a:hover, .menu ul li a:hover ul li a:hover {background:#3BA110;color:white;}

person user1887686    schedule 10.01.2013    source источник
comment
Если вы попытаетесь реализовать подменю CSS без дочернего комбинатора, тебе будет плохо.   -  person Zeta    schedule 10.01.2013
comment
Как вы хотите, чтобы появилось подменю? Справа от родительского элемента?   -  person jamesplease    schedule 10.01.2013


Ответы (1)


Это поможет вам начать работу, хотя и далеко не идеально. Как указали Зеты, без дочернего комбинатора, что создает глубоко вложенное меню. это не только сложно, но и приводит к плохому коду.

Вам нужно убедиться, что вы точно знаете, на что нацелен каждый из ваших селекторов. Вы хотите, чтобы ваш второй и третий уровень li вели себя по-разному, поэтому вы должны быть уверены, что ваш селектор для второго уровня не влияет также на третий.

Буквально все, что я сделал для решения вашей проблемы, — это применил дочерний комбинатор повсюду к коду, который у вас уже был, поскольку я знал, что вы пишете код для пунктов меню первого и второго уровня. После этого я применил простой селектор для таргетинга на элементы третьего уровня, и у меня появилось рабочее меню.

На вашем месте я бы просмотрел ваш код и убедился, что вы точно знаете, на что нацелены ваши селекторы, а затем переписал бы ваш CSS. Это не так сложно сделать, и это может привести к удивительно небольшому количеству кода для очень сложных вложенных меню.

html (только для пункта меню третьего уровня)

...
<!-- the rest of the menu -->
  <li>
    <a href="http://www.lawsart.com/Horses1.html" target="_top">Horses 1</a>
    <ul>
      <li>Submenu1</li>
      <li>Submenu2</li>
    </ul>
  </li>
<!-- the rest of the menu -->
...

css (только для третьего уровня)

.menu ul ul ul { visibility: hidden; position: absolute; top: 0; left: 97px; }
.menu ul ul li:hover ul { visibility: visible; background-color: #eee; }

И только несколько примеров того, как выбирать меню и элементы разных уровней:

css (для таргетинга на «элементы заголовка»)

.menu > ul > li { }

css (для таргетинга на первое раскрывающееся меню)

.menu > ul > li > ul { }

css (для таргетинга на первые выпадающие элементы)

.menu > ul > li > ul > li { }
.menu ul ul > li { } /* This will also target submenu items */
.menu > ul > ul > li { }

css (для таргетинга подменю на выпадающий элемент)

.menu > ul > li > ul > li > ul { }
.menu ul ul ul { }

css (для таргетинга на элемент подменю раскрывающегося списка)

.menu > ul > li > ul > li > ul > li { }
.menu ul ul ul li { }

Что мы можем сделать из приведенного выше кода, так это то, что вы не хотите прекращать использовать дочерний комбинатор, пока не окажетесь на последнем уровне своего меню. В общем, menu ul[n] li, где я использую псевдокод для представления n количества uls, будет нацелен на любой li глубже, чем n глубина в вашем меню. . Так что в вашем случае можно использовать .menu ul ul ul li, поскольку третий уровень является последним. Но вы не хотели бы использовать .menu ul ul li для написания стиля, предназначенного только для первого раскрывающегося списка, поскольку этот селектор также нацелен на третью, четвертую и так далее глубину.

Для полноты картины минимум, чтобы получить работающее глубоко вложенное меню, делается следующим образом:

Вы хотите, чтобы все после первого ul начиналось как скрытое. Итак, вы можете сделать:

.menu ul ul { visibility: hidden; }

Это скрывает любой ul, вложенный в другой ul. Таким образом, он попадает во все наши подменю. И это относится только к спискам в нашем меню.

Затем вы хотите, чтобы каждое подменю было видно, когда вы наводите курсор на родительскую ссылку. Я думаю, мы можем обрабатывать все наши подменю с помощью одного селектора:

.menu li:hover > ul { visibility: visible; }

Это должно быть достаточно общим, чтобы применяться к каждому уровню меню. Читая справа налево, мы делаем ul видимым, когда наводим курсор на li, который является его непосредственным родителем. И, как обычно, это относится только к элементу li, который находится в нашем меню.

Конечно, вы также можете использовать a, если хотите.

CSS-меню — отличное время, чтобы подумать и узнать о эффективность CSS. Если у вас есть рабочее меню, посмотрите, сможете ли вы его оптимизировать! Теги, которые я разместил здесь, возможно, не самые быстрые; Я просто подумал о них из головы. Я оставлю это вам, чтобы найти лучшие селекторы для использования.

И это действительно основы сложных вложенных меню CSS. Надеюсь, поможет.

person jamesplease    schedule 10.01.2013
comment
Спасибо jmeas. Я попробую. - person user1887686; 10.01.2013