【问题标题】:centered nav with flexible left and right widths - percentage padding does not work具有灵活左右宽度的居中导航 - 百分比填充不起作用
【发布时间】:2013-08-30 09:19:30
【问题描述】:

更新:根据以下答案之一简化了 HTML 和 CSS。但是问题仍然存在。

我有一个类似这样的工作导航:

                item11item2item3    Centered    item4item5item6

我想在项目之间添加填充,使其看起来像这样:

       item1     item2     item3    Centered    item4     item5     item6

left 上的项目右对齐右边的项目是left-justified

问题

  • 如果我使用float: right; 来证明列表的合理性,我会得到item3 item2 item1
  • 如果我使用float: left; 并将容器宽度设置为auto,我可以获得正确的布局,但只有当我使用px 填充时。
  • 当我使用像 padding-left: 3%; 这样的 % 填充时,它会中断并且看起来像这样:

              item1     item2       Centered    item4     item5     item6
              item3
    

这是我的 HTML

<div class="container">
    <nav>
        <ul class="left">
            <li>Item 1</li>
            <li>Item 2</li>
            <li>Item 3</li>
        </ul>
        <ul class="center">
            <li>Centered</li>
        </ul>
        <ul class="right">
            <li>Item 4</li>
            <li>Item 5</li>
            <li>Item 6</li>
        </ul>   
    </nav>
</div>

这是我的 CSS

/* Reset */

html, body, nav, li {
  margin: 0; padding: 0; border: 0;
}

li {
  list-style-type: none;
  list-style-position: outside;
}

/* Styles */

.container {
  width: 100%;
  height: auto;
}

nav {
    width: 80%;
    margin: 0 auto;
}

nav > ul.left {
    position: absolute;
    right: 55%;
}

nav > ul.left > li {
    float: left;
    padding-right: 5%;
}

.center {
    position: absolute;
    left: 45%;
    width: 10%;
}

.center li {
    text-align: center;
}

nav > ul.right {
    position: absolute;
    left: 55%;
    width: 45%;
}

nav > ul.right > li {
    float: left;
    padding-left: 5%;
}

注意事项:

  • 我使用绝对定位和容器来保持“居中”完全居中,即使左右导航项的宽度不相同。
  • 我使用基于 % 的宽度,因为它是一种灵活的布局(响应式)
  • 上面的代码工作正常,但我真的很想基于填充百分比,所以它很灵活。

所以它似乎li-container div 正确地继承了宽度并在我使用像素时考虑了填充,但在我使用百分比时却没有。这是典型的行为吗?解决办法是什么?

Here's a jsFiddle 以防你想玩弄它。

附加更新:

主要问题似乎是需要将“左”项右对齐。如果我使用float:right,那么我会得到相反的顺序,这不好。如果我在左边的项目上使用float:left,那么顺序是正确的,但我需要从容器中删除显式宽度,或者项目不是右对齐的。删除显式容器宽度会导致我遇到的问题。

【问题讨论】:

  • &lt;div&gt; 不是 &lt;ul&gt; 的有效子代。唯一允许的内容是:“零个或多个 li 和脚本支持元素。”,参见4.5.6 The ul element
  • 从 ul > li nav 更新到 div > li nav 能解决问题吗?
  • 将代码更新为nav &gt; li - 我认为现在有效,对吧?
  • li 元素的唯一有效父元素是:ul, li, menu,参见 w3.org li – list item "Permitted parent elements"

标签: html css navigation padding


【解决方案1】:

编辑:这是一个新的解决方案。希望这看起来像预期的那样。 ;)

HTML

<nav>
    <ul class="left">
        <li>Item 1 longer longer</li>
        <li>Item 2</li>
        <li>Item 3</li>
    </ul>
    <ul class="centered">
        <li>Centered</li>
    </ul>
    <ul class="right">
        <li>Item 4</li>
        <li>Item 5</li>
        <li>Item 6</li>
    </ul>
</nav>

CSS

ul, li {
    margin: 0;
    padding: 0;
    list-style-type: none;
}

nav {
    position: relative;
    min-width: 700px;
}

nav > ul {
    width: 100%;
    background: red;
}

nav > ul > li {
    display: inline-block;
    text-align: center;
    background: green;
    color: white;
}

nav > ul.centered {
    position: absolute;
    left: 40%;
    width: 20%;
    background: orange;
}

nav > ul.centered > li {
    display: block;
    background: orange;
}

nav > ul.left {
    position: absolute;
    left: 0;
    max-width: 40%;
}

nav > ul.left > li {
    float: right;
    padding: 2%;
}

nav > ul.right {
    position: absolute;
    left: 60%;
    max-width: 40%;
}

nav > ul.right > li {
    float: left;
    padding: 2%;
}

演示

Try before buy

更新

使用display: inline-block 以正确的顺序排列所有内容而不会出现任何中断的唯一方法。我只更新了左侧来演示它。

最后的想法:因为这永远不会中断,你必须为&lt;nav&gt;-元素设置一个min-width,否则元素会在太小的屏幕上重叠。你之前的经历,当浮动元素的父容器的宽度变得太小并且它们进入下一行时,是浮动元素的预期行为

更新的 CSS

nav > ul.left {
    position: absolute;
    left: 0;
    max-width: 40%;
    text-align: right;
    white-space: nowrap;
    line-height: 0;
    font-size: 0;
}

nav > ul.left > li {
    display: inline-block;
    padding: 10%;
    line-height: auto;
    font-size: 12px;
}

演示

Try display: inline-block


这也是我的first solution 的链接。

【讨论】:

  • 此解决方案不起作用,因为它依赖于每个 li 的宽度相同,或者至少左右 li 组对于“居中”li 的宽度相同真正居中。见:jsfiddle.net/timshutes/Nm2en/1
  • 使用我的 CSS,虽然体积更大,但行为更好,虽然我有 % 宽度问题:jsfiddle.net/timshutes/4snNw/4
  • @timshutes 好的,问题中并不清楚。或许我还能想点别的。
  • @timshutes 我已经更新了我的答案。希望这次我做对了。 ;)
  • 赞成并更新了我的问题。您的解决方案几乎可以做到,但是左侧的浮动 li 反转了我的菜单顺序。我需要命令保持正常。任何尝试 float: left 但我遇到了填充问题。
【解决方案2】:

在那个小提琴上使用 Chrome 中的元素检查器,with 填充在.left .li 上的 3% 我收集到这个:

.left .li-container的计算宽度:128px

每个li的宽度:43px

你有三个li's --> 3 * 43 = 129px

这会导致子 li 的宽度扩展父容器的宽度,从而换行。所以它可能与从该百分比值计算实际宽度的四舍五入有关。

为了弥补这一点,我目前只能想到一个 jQuery/JS 解决方案,但我怀疑你是否想要它,并且只想要纯 CSS 中的它。

注意:我只想将其添加为评论,但不幸的是我不能,因为这需要 50 个代表。很抱歉没有提供完整的答案!

【讨论】:

  • 四舍五入很有趣。我想知道解决方案是什么?
  • 正如我所说,如果允许使用 jQuery,我有一个非常快速的解决方案。否则,我将不得不进行一些挖掘。
  • 是的,我宁愿为此提供一个 CSS 解决方案。
  • +1 因为我认为您的答案指向正确的解决方案,即使它不是解决方案。我更新了我的问题以进一步澄清。
  • 我想我找到了一个后续:CSS3 的 calc() 函数。这样你就可以做到padding-left: calc(3% - 1px);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
  • 2021-11-16
  • 2021-09-19
  • 1970-01-01
  • 2012-03-22
  • 2013-05-10
  • 2017-12-27
相关资源
最近更新 更多