【发布时间】:2012-08-05 10:24:51
【问题描述】:
我一直听说,当您使用绝对定位时,您想要充当其父元素的元素需要具有 position 或 relative。
我正在尝试构建一个 CSS 下拉菜单,当我希望它的父元素设置为 relative 时,我正在努力让下拉菜单项超出主菜单项的宽度;下拉菜单项中的文本只会换行。
所以我查看了其他示例菜单,看看他们是如何做到的,我发现其中一个甚至没有使用任何带有 position 或 relative 的父元素,即使他们像我一样使用绝对定位。
这个例子在这里:http://purecssmenu.com/
所以我尝试删除我的relative 定位和宾果游戏 - 我的问题消失了。但是现在我使用绝对定位,它的父母都没有使用relative 定位,它们都设置为static。
所以我想知道这有什么意义 - 如果没有 relative 父母,它不会退回到浏览器窗口吗?
如果需要,这是我的 HTML:
<div class="navWrapper">
<div class="left"></div>
<div class="nav">
<ul>
<li class="home"><a href="/">Home</a></li>
<li class="spacer"></li>
<li class="about"><a href="about_us/">About Us</a></li>
<li class="spacer"></li>
<li class="trademark"><a href="freetrademarksearch/">Free Trademark Search</a></li>
<li class="spacer"></li>
<li class="services">
<a href="services/">Services</a>
<ul class="sub">
<li><a href="">Trademark Search</a></li>
<li><a href="">Prepare & File Trademark</a></li>
<li><a href="">Trademark Infringement</a></li>
</ul>
</li>
<li class="spacer"></li>
<li class="testimonials"><a href="testimonials/">Testimonials</a></li>
<li class="spacer"></li>
<li class="more"><a href="javascript:void(0);">More Information</a></li>
<li class="spacer"></li>
<li class="contact"><a href="contact-us/">Contact Us</a></li>
</ul>
<div class="contentClear"></div>
</div>
<!-- Nav Ends -->
<div class="right"></div>
</div>
<!-- Nav Wrapper Ends -->
CSS:
#header .navWrapper {
width: 1004px;
}
#header .navWrapper .left {
float: left;
width: 4px;
min-width: 4px;
height: 47px;
min-height: 47px;
background: url('../images/nav-left-bg.png') left top no-repeat;
}
#header .navWrapper .nav {
float: left;
width: 994px;
border-top: 1px solid #e0d0b4;
border-left: 1px solid #e0d0b4;
border-right: 1px solid #e0d0b4;
border-bottom: 1px solid #e8dcc8;
background: url('../images/nav-button-bg.png') left top repeat-x;
}
#header .navWrapper .nav ul {
margin: 0 1px;
display: block;
}
#header .navWrapper .nav li {
float: left;
display: block;
height: 45px;
font-family: OpenSansBold, Arial;
font-size: 16px;
line-height: 2.9;
text-align: center;
color: #646464;
}
#header .navWrapper .nav li.spacer {
width: 2px;
min-width: 2px;
height: 45px;
min-height: 45px;
background: url('../images/nav-button-spacer-bg.png') left top no-repeat;
}
#header .navWrapper .nav li a,
#header .navWrapper .nav li a:visited
{
display: block;
height: 45px;
padding: 0 20px;
color: #646464;
text-decoration: none;
}
#header .navWrapper .nav li a:hover,
#header .navWrapper .nav li a:active,
#header .navWrapper .nav li a:focus
{
color: #fff;
background: url('../images/nav-button-bg.png') left bottom repeat-x;
}
#header .navWrapper .nav li.home {
max-width: 86px;
text-indent: -1px;
}
#header .navWrapper .nav li ul.sub {
position: absolute;
}
#header .navWrapper .nav li ul.sub li {
float: none;
display: block;
font-family: OpenSansSemibold, Arial;
font-size: 14px;
line-height: 2.3;
height: auto;
text-align: center;
background-color: #f4771d;
color: #fff;
}
#header .navWrapper .nav li ul.sub li a,
#header .navWrapper .nav li ul.sub li a
{
color: #fff;
height: auto;
}
#header .navWrapper .nav li ul.sub li a:hover,
#header .navWrapper .nav li ul.sub li a:focus,
#header .navWrapper .nav li ul.sub li a:active
{
background: #d66627;
}
#header .navWrapper .right {
float: right;
width: 4px;
min-width: 4px;
height: 47px;
min-height: 47px;
background: url('../images/nav-right-bg.png') left top no-repeat;
}
【问题讨论】:
-
请查看我的最新更新,它显示了您如何看到purecssmenu.com 将
position:relative应用于<ul>上:hover上的父<ul> -
好的,我明白了,但我认为您的意思是父
<li>,而不是<ul>。 :) -
我明白了。这对您有用,因为尽管您在列表中设置了
position:absolute,但您还没有定义任何top、left、bottom或right属性。这些属性不默认为 0。当既没有指定top也没有指定bottom时,元素将垂直定位在它仍然是流的一部分的位置。left和right以及水平定位也是如此。尝试将这些属性中的任何一个设置为 0px,你就会明白我的意思了。 -
...所以在您的情况下,需要设置
position:absolute,因为它会从流程中删除子菜单,从而允许没有指定宽度的容器 li 保持由菜单顶部的文本计算的宽度。而如果您在子列表中有position:relative,它的宽度会迫使包含的 li 变宽,从而导致“联系我们”项目下降到下一行。 -
好的,谢谢您的解释。 :)
标签: css position css-position