【问题标题】:Absolute element inherits parent width but I want it to stretch according its children绝对元素继承父宽度,但我希望它根据其子元素进行拉伸
【发布时间】:2012-10-30 20:33:27
【问题描述】:

我正在构建一个像这样的 jsfiddle 的 CSS 菜单:http://jsfiddle.net/YXT7j/48/

HTML:

<ul id="nav">
<li><a>item 1</a>
    <ul class="sub" style="width: 200px;">
        <li><a>item 1.1</a>
            <ul>
                <li><a>item 1.1.1</a></li>
                <li><a>item 1.1.2</a></li>
                <li><a>item 1.1.3</a></li>
            </ul>
        </li>
        <li><a>item 1.2</a>
            <ul>
                <li><a>item 1.1.1</a></li>
                <li><a>item 1.1.2</a></li>
                <li><a>item 1.1.3</a></li>
            </ul>           
        </li>
    </ul>
</li>
<li><a>item 2</a>
    <ul class="sub">
        <li><a>item 2.1</a></li>
        <li><a>item 2.2</a></li>
        <li><a>item 2.3</a></li>
    </ul>  
</li>
<li><a>item 3</a>
    <ul class="sub">
        <li><a>item 3.1</a></li>
        <li><a>item 3.2</a></li>
        <li><a>item 3.3</a></li>
    </ul>  
</li>
</ul>

CSS:

#nav>li {
    float: left; 
    margin: 0 10px;   
    position: relative;   
}
.sub {
    display: none;    
    position: absolute;
    top: 1em;
    left: 0;
}
.sub>li {
    float: left; 
    width: 100px;        
}
#nav>li:hover .sub {
    display: block;
}

​ ​

在第 1 项下,您可以看到 2 个彼此相邻的列表。同样在 html 中,您会看到一个内联宽度集。如果没有内联宽度(或等效的 css),列表将显示在彼此下方而不是彼此相邻(http://jsfiddle.net/YXT7j/34/)。

现在子菜单中的列表数量是动态的。这就是为什么我不能在 css 中设置宽度,而我现在使用的是内联样式(100*numlists+'px')。但这很丑陋。 我希望子菜单像任何其他元素一样调整为其 li-children 的大小。不幸的是,如果没有设置宽度,子菜单将遵循其父菜单项的宽度。

所以,tl/dr:如何在不设置 ul.sub 的显式宽度的情况下获得 http://jsfiddle.net/YXT7j/48/

谢谢!

【问题讨论】:

    标签: html css


    【解决方案1】:

    这是我的解决方案的 js-fiddle:http://jsfiddle.net/YXT7j/66/

    您必须在子菜单内联块中创建列表,而不是浮动它们。然后你告诉子菜单不要用空格包装内联项目:nowrap;

    这是我以前看到的其他问题的类似答案。虽然这些答案是为了防止文本(哪个标准是内联)换行,而不是完整的块元素。

    所以,为了完整起见,代码:

    <ul id="nav">
        <li><a>item 1</a>
            <ul class="sub multi">
                <li><a>item 1.1</a>
                    <ul>
                        <li><a>item 1.1.1</a></li>
                        <li><a>item 1.1.2</a></li>
                        <li><a>item 1.1.3</a></li>
                    </ul>
                </li>
                <li><a>item 1.2</a>
                    <ul>
                        <li><a>item 1.1.1</a></li>
                        <li><a>item 1.1.2</a></li>
                        <li><a>item 1.1.3</a></li>
                    </ul>           
                </li>
            </ul>
        </li>
        <li><a>item 2</a>
            <ul class="sub">
                <li><a>item 2.1</a></li>
                <li><a>item 2.2</a></li>
                <li><a>item 2.3</a></li>
            </ul>  
        </li>
        <li><a>item 3</a>
            <ul class="sub">
                <li><a>item 3.1</a></li>
                <li><a>item 3.2</a></li>
                <li><a>item 3.3</a></li>
            </ul>  
        </li>
    </ul>
    ​
    

    #nav>li {
        float: left; 
        margin: 0 10px;   
        position: relative;   
    }
    .sub {
        display: none;    
        position: absolute;
        top: 1em;
        left: 0;
    
        white-space: nowrap;
    }
    .sub>li {
        width: 100px;   
    }
    .multi.sub>li { 
        display: inline-block;
    }
    #nav>li:hover .sub {
        display: block;
    }
    

    【讨论】:

    • 好答案,很高兴我回来检查。
    【解决方案2】:

    当您等待更好的答案时,一个 hacky 解决方案是这样做:

    #nav>li:hover .sub {
        display: block;
        width:1000%;
    }
    

    http://jsfiddle.net/YXT7j/39/

    【讨论】:

    • +1 可能是最简单的方法。我想不出另一种只使用 CSS 的方式。
    • @andyb 必须有更好的方法来做到这一点。需要更多 google fu。
    • 同意阿萨德的观点,一定有更好的方法吧?此解决方案仍然与在 ul.sub 上设置宽度非常相似。它只是超大,所以任何东西都适合。但是您已经说过这当然是hacky ;)。另外,当您开始对其进行样式设置时,解决方案会中断(例如,子上的背景)。这可以通过 wrapper-divs 和额外的类再次修复。当然,这几乎是干净的:jsfiddle.net/YXT7j/62。不过感谢您的回答,这是正确的一步!
    猜你喜欢
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2016-03-02
    • 2013-05-20
    相关资源
    最近更新 更多