【问题标题】:Horizontal navbar menu submenu alignment水平导航栏菜单子菜单对齐
【发布时间】:2016-02-24 18:58:50
【问题描述】:

在下面的代码中,我正在创建一个导航栏。当您将鼠标悬停在导航栏中的某个项目上时,它会显示一个下拉菜单。下拉菜单上的某些项目在悬停时会显示子菜单。所有这些都有效,但是当子菜单显示时,我遇到了顶部属性的定位问题。我试过制作它的'父divposition:relative,调整它的top:位置,调整显示属性等,但似乎找不到问题所在。

#nav {
  width: 886px;
  height: 32px;
  margin: 1px auto 0 auto;
  border-top: 1px solid #B1B6B9;
  border-bottom: 1px solid #646E73;
  background-color: #A9AFB2;
  /* 50% gray */
  background: -moz-linear-gradient(top, #bbbfc1 0%, #7f878b 100%);
  /* FF3.6+ */
  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #bbbfc1), color-stop(100%, #7f878b));
  /* Chrome,Safari4+ */
  background: -webkit-linear-gradient(top, #bbbfc1 0%, #7f878b 100%);
  /* Chrome10+,Safari5.1+ */
  background: -o-linear-gradient(top, #bbbfc1 0%, #7f878b 100%);
  /* Opera 11.10+ */
  background: -ms-linear-gradient(top, #bbbfc1 0%, #7f878b 100%);
  /* IE10+ */
  background: linear-gradient(to bottom, #bbbfc1 0%, #7f878b 100%);
  /* W3C */
  filter: progid: DXImageTransform.Microsoft.Gradient (GradientType=0, StartColorStr='#ffBBBFC1', EndColorStr='#ff7F878B');
  padding: 0 40px;
}

.navone {
  position: relative;
  top: 0;
  left: 0;
  height: 32px;
  float: left;
  margin-bottom: -3px;
  z-index: 150;
  width: auto;
}

.navone a {
  text-decoration: none;
  float: left;
  height: 16px;
  color: #FFFFFF;
  font-family: Jabas, Arial, Helvetica, sans-serif;
  font-size: 19px;
  padding: 5px 14px 11px 14px;
  display: block;
  border-left: 1px solid #B1B6B9;
  border-right: 1px solid #737C81;
  text-shadow: -1px -1px 0px rgba(84, 95, 101, .35);
}

.navone a:hover {
  text-decoration: none;
  background-color: #567697;
  /* 75% dark blue */
  background: -moz-linear-gradient(top, #567697 0%, #1e4975 100%);
  /* FF3.6+ */
  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #567697), color-stop(100%, #1e4975));
  /* Chrome,Safari4+ */
  background: -webkit-linear-gradient(top, #567697 0%, #1e4975 100%);
  /* Chrome10+,Safari5.1+ */
  background: -o-linear-gradient(top, #567697 0%, #1e4975 100%);
  /* Opera 11.10+ */
  background: -ms-linear-gradient(top, #567697 0%, #1e4975 100%);
  /* IE10+ */
  background: linear-gradient(to bottom, #567697 0%, #1e4975 100%);
  /* W3C */
  filter: progid: DXImageTransform.Microsoft.Gradient (GradientType=0, StartColorStr='#ff567697', EndColorStr='#ff1E4975');
}

.navone a.active {
  background-color: #89A8C7;
  /* 55% blue */
  background: -moz-linear-gradient(top, #89a8c7 0%, #5480ad 100%);
  /* FF3.6+ */
  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #89a8c7), color-stop(100%, #5480ad));
  /* Chrome,Safari4+ */
  background: -webkit-linear-gradient(top, #89a8c7 0%, #5480ad 100%);
  /* Chrome10+,Safari5.1+ */
  background: -o-linear-gradient(top, #89a8c7 0%, #5480ad 100%);
  /* Opera 11.10+ */
  background: -ms-linear-gradient(top, #89a8c7 0%, #5480ad 100%);
  /* IE10+ */
  background: linear-gradient(to bottom, #89a8c7 0%, #5480ad 100%);
  /* W3C */
  filter: progid: DXImageTransform.Microsoft.Gradient (GradientType=0, StartColorStr='#ff89A8C7', EndColorStr='#ff5480AD');
}

.navone:hover .navtwo {
  display: block;
}

.navtwo {
  border-top: 1px solid #65809B;
  display: none;
  position: absolute;
  top: 32px;
  left: 0px;
  z-index: 200;
  width: 100%;
  -webkit-box-shadow: 4px 4px 3px rgba(84, 95, 101, .3);
  -moz-box-shadow: 4px 4px 3px rgba(84, 95, 101, .3);
  box-shadow: 4px 4px 3px rgba(84, 95, 101, .3);
}

.navtwo a {
  color: #3E6082;
  background-color: #D8E2EC;
  font-family: Arial, Helvetica, sans-serif;
  font-size: 13px;
  font-weight: normal;
  width: 90%;
  height: auto;
  display: block;
  padding: 4px 5%;
  border: 1px solid #B1C5DA;
  box-sizing: box-border;
  border-top: 1px solid #FFFFFF;
  text-shadow: none;
}

.navtwo a:hover {
  color: #FFFFFF;
  background-color: #3E6082;
  text-decoration: none;
}

.dropdown {
  position: relative;
}

.dropdown > a {
  background: #C1C5C7 !important;
  color: #32393D !important;
  font-weight: bold;
  border-top: 1px solid #E0E2E3;
  border-bottom: 1px solid #A2A8AB !important;
  z-index: 50;
}

.dropdown > a:after {
  float: right;
  content: "\25B6"
}

.dropdown:hover > a {
  background: #92999D !important;
}

.dropdown-content {
  display: none;
  z-index: 100;
}

.dropdown-content a {
  padding: 4px 8px;
  width: 150px;
}

.dropdown:hover .dropdown-content {
  display: block;
  position: absolute;
  top: 0;
  left: 100%;
}
<div id="nav">
  <!--begin of option-->
  <div class="navone">
    <a href="">Option</a>
    <div class="navtwo">
      <!--begin of dropdown menu-->
      <div class="dropdown">
        <a href="">Test 1</a>
        <!--begin of submenu-->
        <div class="dropdown-content">
          <a href="#">Test Submenu</a>
          <a href="#">Test Long Submenu</a>
          <a href="#">Test Longest Submenu</a>
        </div>
      </div>
      <!--begin of dropdown menu-->
      <div class="dropdown">
        <a href="">Test 2</a>
        <!--begin of submenu-->
        <div class="dropdown-content">
          <a href="#">Test</a>
          <a href="#">Long Test</a>
          <a href="#">The Longest Test</a>
        </div>
      </div>
      <a href="">Test 3</a>
    </div>
  </div>
  <!--end of option-->


  <div class="navone">
    <a href="#">Longer Option Name</a>
    <div class="navtwo">
      <div class="dropdown">
        <a href="">Test 1</a>
        <div class="dropdown-content">
          <a href="#">Test Submenu</a>
          <a href="#">Test Long Submenu</a>
          <a href="#">Test Longest Submenu</a>
        </div>
      </div>
      <a href="">Test 2</a>
      <a href="">Test 3</a>
    </div>
  </div>

</div>

JSFiddlehttps://jsfiddle.net/cshanno/1fsk6fm2/5/

 WANTED                                     MINE
 -----------                               -----------
| NavOption |                             | NavOption |
 -----------                               ----------- ---------
| Dropdown  |                             | Dropdown  | Submenu |
 ----------- ----------                    ----------- ---------
| Dropdown >| Submenu  |                  | Dropdown >|           < The submenu is shifting
 ----------- ----------                    -----------              to the top 

其中 > 显示包含子菜单选项的下拉项。

【问题讨论】:

  • sn-p 和 JSFiddle 似乎没问题。你能分享更多关于这个问题的信息吗?
  • 我添加了更多,我希望它有意义.. 现在我的是将子菜单项移动到下拉列表的顶部,而不是将两者对齐。在我的代码示例中,它发生在 Option > Test 2
  • 我现在就知道了,并提交了一个答案。您没有以正确的方式放置下拉容器。
  • @InacioSchweller 也与它们的显示方式有关

标签: html css


【解决方案1】:

我对@9​​87654322@ 选择器做了一个小改动,现在它可以工作了:

.dropdown {
  position: relative;
  float: left;
  clear: both;
  width: 100%; 
}

JSFiddle:https://jsfiddle.net/c71f6qzm/

希望对你有帮助!

【讨论】:

  • 太好了,谢谢。我对 clear 属性不太熟悉。我刚刚查了一下,但仍然不确定,你能快速解释一下为什么它在这种情况下会起作用吗?
  • 当然。 clear 属性有助于确定浮动(float:right 或 float:left)元素旁边的元素是否必须向下移动或可以站在他身边。
  • 在这种情况下,clear 只是帮助您防止布局中断,以防万一您将任何项目放在中间并且没有正确浮动
【解决方案2】:

问题与您的display 属性与您的.dropdowns 有关。 如果您在那些&lt;div&gt;s 上将显示属性设置为inline-block,它们应该会更正确地呈现。您可能需要将width: 100% 添加到您的.dropdown CSS 并通过将font-size: 0 添加到.navtwo css 来减少每个菜单项之间的空白,但它可以工作:

另外,Ignacio's float solution 也做同样的事情。

显示:阻止&lt;div&gt;s 是问题所在。浮动或显示为内联是您最好的解决方案

#nav {
  width: 886px;
  height: 32px;
  margin: 1px auto 0 auto;
  border-top: 1px solid #B1B6B9;
  border-bottom: 1px solid #646E73;
  background-color: #A9AFB2;
  /* 50% gray */
  background: -moz-linear-gradient(top, #bbbfc1 0%, #7f878b 100%);
  /* FF3.6+ */
  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #bbbfc1), color-stop(100%, #7f878b));
  /* Chrome,Safari4+ */
  background: -webkit-linear-gradient(top, #bbbfc1 0%, #7f878b 100%);
  /* Chrome10+,Safari5.1+ */
  background: -o-linear-gradient(top, #bbbfc1 0%, #7f878b 100%);
  /* Opera 11.10+ */
  background: -ms-linear-gradient(top, #bbbfc1 0%, #7f878b 100%);
  /* IE10+ */
  background: linear-gradient(to bottom, #bbbfc1 0%, #7f878b 100%);
  /* W3C */
  filter: progid: DXImageTransform.Microsoft.Gradient (GradientType=0, StartColorStr='#ffBBBFC1', EndColorStr='#ff7F878B');
  padding: 0 40px;
}

.navone {
  position: relative;
  top: 0;
  left: 0;
  height: 32px;
  float: left;
  margin-bottom: -3px;
  z-index: 150;
  width: auto;
}

.navone a {
  text-decoration: none;
  float: left;
  height: 16px;
  color: #FFFFFF;
  font-family: Jabas, Arial, Helvetica, sans-serif;
  font-size: 19px;
  padding: 5px 14px 11px 14px;
  display: block;
  border-left: 1px solid #B1B6B9;
  border-right: 1px solid #737C81;
  text-shadow: -1px -1px 0px rgba(84, 95, 101, .35);
}

.navone a:hover {
  text-decoration: none;
  background-color: #567697;
  /* 75% dark blue */
  background: -moz-linear-gradient(top, #567697 0%, #1e4975 100%);
  /* FF3.6+ */
  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #567697), color-stop(100%, #1e4975));
  /* Chrome,Safari4+ */
  background: -webkit-linear-gradient(top, #567697 0%, #1e4975 100%);
  /* Chrome10+,Safari5.1+ */
  background: -o-linear-gradient(top, #567697 0%, #1e4975 100%);
  /* Opera 11.10+ */
  background: -ms-linear-gradient(top, #567697 0%, #1e4975 100%);
  /* IE10+ */
  background: linear-gradient(to bottom, #567697 0%, #1e4975 100%);
  /* W3C */
  filter: progid: DXImageTransform.Microsoft.Gradient (GradientType=0, StartColorStr='#ff567697', EndColorStr='#ff1E4975');
}

.navone a.active {
  background-color: #89A8C7;
  /* 55% blue */
  background: -moz-linear-gradient(top, #89a8c7 0%, #5480ad 100%);
  /* FF3.6+ */
  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #89a8c7), color-stop(100%, #5480ad));
  /* Chrome,Safari4+ */
  background: -webkit-linear-gradient(top, #89a8c7 0%, #5480ad 100%);
  /* Chrome10+,Safari5.1+ */
  background: -o-linear-gradient(top, #89a8c7 0%, #5480ad 100%);
  /* Opera 11.10+ */
  background: -ms-linear-gradient(top, #89a8c7 0%, #5480ad 100%);
  /* IE10+ */
  background: linear-gradient(to bottom, #89a8c7 0%, #5480ad 100%);
  /* W3C */
  filter: progid: DXImageTransform.Microsoft.Gradient (GradientType=0, StartColorStr='#ff89A8C7', EndColorStr='#ff5480AD');
}

.navone:hover .navtwo {
  display: block;
}

.navtwo {
  border-top: 1px solid #65809B;
  display: none;
  position: absolute;
  top: 32px;
  left: 0px;
  z-index: 200;
  width: 100%;
  font-size: 0;
  -webkit-box-shadow: 4px 4px 3px rgba(84, 95, 101, .3);
  -moz-box-shadow: 4px 4px 3px rgba(84, 95, 101, .3);
  box-shadow: 4px 4px 3px rgba(84, 95, 101, .3);
}

.navtwo a {
  color: #3E6082;
  background-color: #D8E2EC;
  font-family: Arial, Helvetica, sans-serif;
  font-size: 13px;
  font-weight: normal;
  width: 90%;
  height: auto;
  display: block;
  padding: 4px 5%;
  border: 1px solid #B1C5DA;
  box-sizing: box-border;
  border-top: 1px solid #FFFFFF;
  text-shadow: none;
}

.navtwo a:hover {
  color: #FFFFFF;
  background-color: #3E6082;
  text-decoration: none;
}

.dropdown {
  position: relative;
  display: inline-block;
  width:100%;
}

.dropdown > a {
  background: #C1C5C7 !important;
  color: #32393D !important;
  font-weight: bold;
  border-top: 1px solid #E0E2E3;
  border-bottom: 1px solid #A2A8AB !important;
  z-index: 50;
}

.dropdown > a:after {
  float: right;
  content: "\25B6"
}

.dropdown:hover > a {
  background: #92999D !important;
}

.dropdown-content {
  display: none;
  z-index: 100;
}

.dropdown-content a {
  padding: 4px 8px;
  width: 150px;
}

.dropdown:hover .dropdown-content {
  display: block;
  position: absolute;
  top: 0;
  left: 100%;
}
<div id="nav">
  <!--begin of option-->
  <div class="navone">
    <a href="">Option</a>
    <div class="navtwo">
      <!--begin of dropdown menu-->
      <div class="dropdown">
        <a href="">Test 1</a>
        <!--begin of submenu-->
        <div class="dropdown-content">
          <a href="#">Test Submenu</a>
          <a href="#">Test Long Submenu</a>
          <a href="#">Test Longest Submenu</a>
        </div>
      </div>
      <!--begin of dropdown menu-->
      <div class="dropdown">
        <a href="">Test 2</a>
        <!--begin of submenu-->
        <div class="dropdown-content">
          <a href="#">Test</a>
          <a href="#">Long Test</a>
          <a href="#">The Longest Test</a>
        </div>
      </div>
      <a href="">Test 3</a>
    </div>
  </div>
  <!--end of option-->


  <div class="navone">
    <a href="#">Longer Option Name</a>
    <div class="navtwo">
      <div class="dropdown">
        <a href="">Test 1</a>
        <div class="dropdown-content">
          <a href="#">Test Submenu</a>
          <a href="#">Test Long Submenu</a>
          <a href="#">Test Longest Submenu</a>
        </div>
      </div>
      <a href="">Test 2</a>
      <a href="">Test 3</a>
    </div>
  </div>

</div>

JSfiddle

【讨论】:

    猜你喜欢
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    相关资源
    最近更新 更多