【问题标题】:How do I create a horizontal navigation menu with pure CSS & CSS table?如何使用纯 CSS 和 CSS 表格创建水平导航菜单?
【发布时间】:2016-05-13 13:11:56
【问题描述】:

我是新手,我正在尝试制作我提到的导航。我在这里有一个教程http://www.mattboldt.com/building-great-navbars-toolbars-display-table/。不幸的是,它使用了我不知道的 SCSS,而不是纯 CSS。

我的代码 - http://codepen.io/rsing4dev/pen/LNqvVN

<p>Please refer to my codepen for the code. 
I don't want to paste too much here & make the question big.

问题 - 当我将鼠标悬停在“服务”菜单上时,其子菜单或子菜单应显示为垂直列表,而不是水平列表。为什么这没有发生,我该如何解决?

谢谢!

PS - 我更喜欢不使用内联块和浮动来制作我的导航菜单。

【问题讨论】:

  • 我建议你不需要 display: table。 inline-block 是一种更简单的方法,不需要父子表/表单元格关系。
  • @haltersweb - 谢谢。你能告诉我为什么我的代码不能按预期工作吗?我对解决方案很灵活,但想检查它是否可能仅使用 css 表和纯 css。
  • 我为您发布了一个表格显示解决方案。两者都可以,只是内联块需要更少的 css,因为您不必担心父项和子项的显示样式。 (尽管您必须担心某些布局的内联块元素之间的讨厌空间,所以也许这是一个平局:-))
  • 另一种方法是使用弹性框,除非您必须支持旧版浏览器。一个有趣的 flexbox 视频可以在这里找到:youtube.com/watch?v=G7EIAgfkhmg

标签: html css


【解决方案1】:

(参见更新后的代码(如下),它仍然使用 css 表格显示。)

你遇到的问题是:

1) 您将顶部导航和子导航都分配为表格,并将它们的所有单元格分配为表格单元格。您只需要对 topnav 及其列表项使用它。

3) 您需要能够让您的子导航“逃脱”顶部导航容器的限制,否则容器将增长到包含子导航。

看看我下面的例子,看看我是如何使用表格显示和另外使用绝对位置(位置相对位置的父级 - 非常重要)来放置我的子导航的。

#nav {
    background-image: linear-gradient(to top, rgba(9, 9, 44, 0.9), rgba(82, 82, 115, 0.9));
    line-height: 2em;
    width: 100%;
}
#nav ul {
    list-style: none;
    padding: 0;
    margin: 0;
}
.main-nav-menu {
  display: table;
  width: 100%;
}
.main-nav-menu-item {
  display: table-cell;
  padding: 0;
  margin: 0;
  text-align: center;
  width: 20%;
  border-right: 1px solid #131332;
  position: relative;
}
.sub-nav-menu {
  background-color: gray;
  left: 0;
  position: absolute;
  width: 100%;
}

#nav a {
    text-decoration: none;
    color: #CFCFE0;
}

/*
CSS For the submenus of the main navigation menu.
*/
.sub-nav-menu {
    display: none;
}

.main-nav-menu:hover .sub-nav-menu {
    display: block;
}
<div id="nav">
  <ul class="main-nav-menu">
    <li class="main-nav-menu-item">
      <a href="#Services" class="nav-tab selected">Services</a>
      <ul class="sub-nav-menu">
        <li class="sub-nav-menu-item"><a href="#our-services">Our Services</a></li>
        <li class="sub-nav-menu-item"><a href="#client-list">Client List</a></li>
      </ul>
    </li>

    <li class="main-nav-menu-item">
      <a href="#Resources" class="nav-tab">Resources</a>
      <ul>
        <li></li>
        <li></li>
      </ul>
    </li>

    <li class="main-nav-menu-item">
      <a href="#Contact-Us" class="nav-tab">Contact Us</a>
      <ul>
        <li></li>
      </ul>
    </li>

    <li class="main-nav-menu-item">
      <a href="#Company" class="nav-tab">Company</a>
      <ul>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
      </ul>
    </li>

    <li class="main-nav-menu-item">
      <form class="searchbar" action="http://www.google.com/search" name="f" target="_blank" style="margin: 0px">
        <input type="hidden" name="any selected">
        <input size="10" name="q" value="" class="searchform" placeholder="Web Search">&nbsp;
        <input type="submit" value="Go!" name="btnG" class="searchbutton"><br>
      </form>
    </li>
  </ul>
</div>

【讨论】:

  • 并记住确保您没有将溢出:隐藏添加到任何导航的容器中。如果您在父级上使用溢出:隐藏,则子导航将在出现时被隐藏,因为它“溢出”。
  • 非常感谢!我删除了 nav 元素中不必要的类和 id,并将它们替换为特定的选择器,例如 A > B。
  • 关于 css 选择器的提示。现在的趋势是基于类而不是基于元素。这部分是为了速度效率,部分是为了特异性陷阱。我帮助编写的我们部门的网络标准需要使用单个类选择器,并且很少使用二级后代选择器。通过避开后代选择器,您将不必使用 !important。
【解决方案2】:

内联块通常是最简单的方法。

内联块和表格单元格之间的主要区别在于您调整浏览器的大小。如果您使用块调整浏览器的大小,那么它们将落在另一个之下——因为默认情况下表格单元格不会。

此处示例(调整输出窗口大小):

https://jsfiddle.net/dv7k720s/

您还可以查看haltersweb 提出的使用表格的解决方案。

否则我也会按照 w3schools 教程快速重做你的菜单,你可以看看并尝试理解。

https://jsfiddle.net/LmLbefts/1/

<ul>
<li  class="dropdown">
    <a href="#" class="dropbtn">Services</a>
    <div class="dropdown-content">
      <a href="#">Our Services</a>
      <a href="#">Client List</a>
    </div>
  </li>
  <li><a href="#resources">Resources</a></li>
  <li><a href="#contact">Contact Us</a></li>
  <li><a href="#company">Company</a></li>
  <li><a href="#">
  <form class="searchbar" action="http://www.google.com/search" name="f" target="_blank" style="margin: 0px">
       <input type="hidden" name="any selected">
       <input size="10" name="q" value="" class="searchform" placeholder="Web Search">&nbsp;
       <input type="submit" value="Go!" name="btnG" class="searchbutton"><br>
  </form>
  </a></li>
</ul>

ul {
    list-style-type: none;
    margin: 0;
    padding: 0;
    overflow: hidden;
    background-image: linear-gradient(to top, rgba(9, 9, 44, 0.9), rgba(82, 82, 115, 0.9));
    line-height: 2em;
    text-align: center;
    vertical-align: middle;
}

li {
display:inline;
margin-left:2%;
margin-right:2%;

}


li a, .dropbtn {
    display: inline-block;
    color: white;
    text-align: center;
    padding: 14px 16px;
    text-decoration: none;
}

li a:hover, .dropdown:hover .dropbtn {
/* To edit if you want a hover color   */
/*background-color: red;*/
}

li.dropdown {
    display: inline-block;
}

.dropdown-content {
    display: none;
    position: absolute;
    background-color: #f9f9f9;
    min-width: 160px;
    box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
}

.dropdown-content a {
    color: black;
    padding: 12px 16px;
    text-decoration: none;
    display: block;
    text-align: left;
}

.dropdown-content a:hover {background-image: linear-gradient(to top, rgba(9, 9, 44, 0.9), rgba(82, 82, 115, 0.9)); color:white;}

.dropdown:hover .dropdown-content {
    display: block;
}

W3School 有一个使用基本 CSS 的简单教程,解释了如何创建垂直或水平导航栏:

链接:http://www.w3schools.com/css/css_navbar.asp

这里还有一个关于下拉菜单如何工作的教程:

http://www.w3schools.com/css/css_dropdowns.asp

这是它的外观预览。

【讨论】:

  • 请告诉我为什么 inline 比 table 更好。
猜你喜欢
  • 2012-04-04
  • 2013-05-25
  • 2012-06-01
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多