html - CSS:应用于子菜单的第一个菜单层的类

标签 html css

我有一个导航菜单。但是菜单变得很疯狂。

子菜单类(如果您将鼠标悬停在第一个菜单上,则为下拉菜单)。 'firstmenu' 是网站的主要区域,因此位于列表的第一层。

问题:子菜单获取 Firstmenus 值。即使是小箭头 background: url(images/nav-arrow.png) no-repeat center bottom; in - BUT WHY?!

我们已经对此进行了研究,拆分了代码,删除了 typo3,所有 JavaScript,并最终得到了这个 css 代码:

#firstmenu {
 list-style: none; 
 margin: 0;
 padding: 0;
}

#firstmenu .firstLevel {
 float: left;
}

#firstmenu .firstLevel a { 
 display: block;
 font-size: 1.166em;
 font-weight: 600;
 line-height: normal;
 color: #333;
 padding: 41px 20px 26px;
 margin-bottom: 4px;
}

#firstmenu .firstLevel .current a,
#firstmenu .firstLevel a:hover,
#firstmenu .firstLevel a.selected {
 color: #fff;
 background: url(images/nav-arrow.png) no-repeat center bottom;
}

#firstmenu .firstLevel a:hover,
#firstmenu .firstLevel a.selected {
 background-color: #333;
}

/* Drop-Down Menus */

.submenu {
 list-style: none;
 margin: 0;
 padding: 0;
 position: absolute;
}

.submenu > ul {
 top: 4px !important;
}

.submenu .secoundLevel {
 width: 200px;
 background: #fca500;
}

.submenu .secoundLevel a {
 display: block;
 color: #fff;
 padding: 8px 15px;
 border-top: 1px solid rgba(255,255,255,0.2);
}

.submenu .secoundLevel a:hover {
 background-color: #333;
 border-color: #1a1a1a;
}

.submenu .secoundLevel:first-child a {
 border-top: none;
}

有人知道解决方法吗?

编辑,html:

<nav id="nav">
 <ul id="firstmenu" class="clearfix">
  <li class="firstLevel"><a href="index.php?id=99"  >Startseite</a></li>
  <li class="firstLevel current"><a href="index.php?id=91">Rootserver</a>
   <ul class="submenu">
    <li class="secoundLevel"><a href="index.php?id=96"  >Vergleich</a></li>
   </ul>
  </li>
  <li class="firstLevel"><a href="index.php?id=92">Voiceserver</a>
   <ul class="submenu">
    <li class="secoundLevel"><a href="index.php?id=97">Preisvergleich</a></li>
   </ul>
  </li>
 </ul>
</nav>

最佳答案

我认为问题出在对 CSS 选择器的理解上。这个选择器:

#firstmenu .firstLevel a.selected {
  color: #fff;
  background: url(images/nav-arrow.png) no-repeat center bottom;
}

声明如下:匹配ALL <a>父类名称为 firstLevel 的链接它有一个 ID 为 firstmenu 的父级

这意味着这个 HTML 位匹配:

<ul id="firstmenu" class="clearfix">
    // snip
    <li class="firstLevel current"><a href="index.php?id=91">Rootserver</a>
        <ul class="submenu">
            <li class="secoundLevel"><a href="#">Vergleich</a></li>
        </ul>
    </li>
    // snip

因为“secondLevel”菜单有一个 anchor 标记 (<a>),它是 .firstLevel 的子项(任何顺序,即子项、孙项、曾孙等)这是 #firstmenu 的 child (任何顺序) .

这正是 CSS 的预期工作方式,但有一些方法可以防止您看到这种情况。

第一个选项是使用 child selector (我有时将其称为“直系后代”选择器)>

.firstLevel > a:hover{ /* code */ }

此选择器明确指出:“您悬停的所有 anchor 标记都是 .firstLevel 的直接后代,但没有更深的。

也就是说,它匹配:

<li class="firstLevel"><a href="#">A</a></li>

但不是下面带有值“B”的链接

<li class="firstLevel"><a href="#">A</a>
    <ul>
        <li><a href="#">B</b></li>
    </ul>
</li>

因为第二个<a>标签不是 .firstLevel 的直接后代, 有一个 <ul><li>他们之间。

第二个选项是通过使用另一个具有更高 CSS specificity 的规则来“覆盖”以前的样式.

#firstmenu .firstLevel .submenu a.selected {
  background-image: none; /* remove the arrow from drop-down menus*/
}

做其中之一是有原因的。

当样式非常特定于该元素时,使用子选择器很好。您不希望任何样式延续到其他元素。

当您只想修改另一个元素的一种特定样式时,请使用“替换”技术(因为缺少更好的术语)。 IE。您想保留颜色、字体、字体粗细,但只想删除背景图像。

希望对您有所帮助!

这里有一些(坏的) fiddle 展示了基本情况:

http://jsfiddle.net/zTCbF/

带有子选择器

http://jsfiddle.net/zTCbF/1/

用替换技术

http://jsfiddle.net/zTCbF/2/

关于html - CSS:应用于子菜单的第一个菜单层的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16136975/

相关文章:

javascript - Angular JS,从 JSON 文件导入一些具体数据

html - 如何在类 "input-group"图标和文本框之间留出空间

html - 使用 HTML5、CSS3 创建幻灯片的好工具

javascript - 如何将 View 中的多个值导入到模板中的多个按钮中?

css - React 和 Rails - Bootstrap 样式已经投入生产

html - 创建 slider 但无法将图像置于绝对 div 的中心

php - Wordpress 索引页面上的特定 CSS

javascript - 将选项卡更改为 Accordion - 单击时 Accordion 菜单不会折叠

Javascript - 函数未定义(onChange 不起作用)

php - HTML 表单不工作 - HTML <表单>