【问题标题】:css make inline-block elements span the whole width of containercss 使内联块元素跨越容器的整个宽度
【发布时间】:2013-06-12 15:53:06
【问题描述】:

好的,这实际上有点复杂。

我有一个导航列表,其中列表项设置为inline-block列表的项目数是动态的,因此可能会有所不同。

我的目标是让列表项跨越容器的整个宽度。 (例如,如果有 4 个列表项,每个项将占用容器宽度的 25% [忽略边距/填充等])

浏览器似乎会在它们之间有空格(换行符/空格等)的内联块元素中添加 4px 边距,这增加了复杂性。

我以小提琴作为起点,其中有 2 个示例:第一个只是内联块模式下的列表项,第二个证明它们跨越宽度。

两者都没有达到我想要的,即整个宽度都被元素占据而不会中断到另一行。

http://jsfiddle.net/4K4cU/2/

编辑:稍微分开,但为什么在我的第二个示例中,lis 下方有一个空格,尽管我已将 line-height 和 font-size 设置为 0?

【问题讨论】:

  • 你愿意为列表项设置一个固定的高度吗?
  • 是的,我是。 (由于需要最少字符而令人费解的回复)
  • display:table-cell 成功了:stackoverflow.com/a/10526275/27862
  • 认为这样做可以,但我需要添加 -4px 修复程序才能使其正常工作:jsfiddle.net/4K4cU/7
  • 请注意,-4px 修复会产生与删除 li 标记之间的空白相同的基本问题,但相反。布局将依赖于标签之间的总是有空格,而不是从来没有它(这两种情况都违反了内容和表示的分离,产生了困难-如果源代码的格式稍后发生更改,则识别错误)。如果可以的话,改为safer to float them

标签: css


【解决方案1】:

好的,尽管有很多不错的答案,而且我最初认为 js/jquery 是唯一可行的方法,但实际上有一个很好的纯 CSS 解决方案:使用 表格单元格。 @Pumbaa80 的原创建议

.list {
    margin:0;
    padding: 0;
    list-style-type: none;
    display: table;
    table-layout: fixed;
    width:100%;
}
.list>li {
    display: table-cell;
    border:1px green solid;
    padding:5px;
    text-align: center;
}
.container {
    border: 1px #777 solid;
}
<div class="container">
    <ul class="list">
        <li>text</li>
        <li>text</li>
        <li>some longer text</li>
        <li>text</li>
    </ul>
</div>

这优于其他解决方案:

  • 仅 CSS
  • 没有与 inline-block 一样的 4px 边距问题
  • 浮动元素不需要 clearfix
  • 保持独立于li 内容的平均分布宽度
  • 简洁的CSS

在这里提琴:http://jsfiddle.net/rQhfC/

【讨论】:

    【解决方案2】:

    现在是 2016 年,我想用 flexbox 的答案更新这个问题。请咨询CanIUse 了解浏览器兼容性。

    /* Important styles */
    ul {
      display: flex;
    }
    li {
      flex: 1 1 100%;
      text-align: center;
    }
    
    /* Optional demo styles */
    * {
      margin: 0;
      padding: 0;
    }
    ul {
      margin-top: 2em;
      justify-content: space-around;
      list-style: none;
      font-family: Verdana, sans-serif;
    }
    li {
      padding: 1em 0;
      align-items: center;
      background-color: cornflowerblue;
      color: #fff;
    }
    li:nth-child(even) {
      background-color: #9980FA;
    }
    <ul>
      <li>text</li>
      <li>text</li>
      <li>text</li>
      <li>text</li>
    </ul>

    预编辑 fiddle(现在内联在上面的 sn-p)

    【讨论】:

      【解决方案3】:

      这是修改原始概念的一种方法。

      CSS 是:

      .list {
          padding:0;
          margin:0;
          list-style-type:0;
          overflow: hidden;
          height: 42px;
      }
      .list li {
          display: inline-block;
          line-height: 40px;
          padding: 0 5px;
          border:1px green solid;
          margin:0;
          text-align:center;
      }
      

      在您的父容器.list 上,设置一个高度以包围子元素。 在这种情况下,我选择了 40px 并添加了 2px 来考虑边框。

      另外,在.list 上设置overflow: hidden 以隐藏伪元素生成的第二行。

      li 元素上,设置line-height: 40px,它将使文本垂直居中。

      由于高度是固定的,第二行被隐藏,您可以使用边框等设置父级样式,而无需额外的空白区域破坏设计。

      演示:http://jsfiddle.net/audetwebdesign/WaRZT/

      并非万无一失...

      在某些情况下,您的链接可能多于一行。在这种情况下,这些项目可能会强制形成第二行,并且由于溢出隐藏,您将看不到它们。

      等间距的边框

      如果你想让边框均匀分布,你需要给li元素设置一个宽度。

      如果内容来自 CMS,并且您对编码有一定的控制权,则可以使用预定义的 CSS 规则动态生成类名来设置正确的宽度,例如:

      .row-of-4 .list li { width: 24%; }
      .row-of-5 .list li { width: 19%; }
      .row-of-6 .list li { width: 16%; }
      

      见:http://jsfiddle.net/audetwebdesign/WaRZT/3/

      【讨论】:

      • 谢谢,这修正了合理的例子,但如何使lis 跨越整个宽度?
      • 糟糕...li 的宽度是否相同,还是取决于链接文本?
      • 理想情况下,它们将在容器宽度上等距分布。例如对于 4 个lis,它们将是 25%,5 个将是 20%,等等。但不知道会有多少 lis。我觉得这可能需要使用一点 jQuery。
      • 所以边框应该是 25%(例如),并且其中的文本水平居中?例如:jsfiddle.net/audetwebdesign/WaRZT/2
      • 你有几个选项,如果链接的数量是在服务器端确定的,你可以生成一个附加到父容器的类名,可以用来选择正确的 CSS 规则.否则需要用js统计li项的个数,然后设置正确的%值。查看我关于链接数量的新评论。
      【解决方案4】:

      对此有多个修复。我更喜欢简单地删除元素之间的空白,因为字体大小技巧涉及非语义 CSS。而且它更容易哈哈。代码,因为答案需要它:

      <ul class="list">
          <li>
              text
          </li><li>
              text
          </li><li>
              text
          </li><li>
              text
          </li>
      </ul>
      

      Updated jsFiddle,其中第一个列表的项目设置为width:25%;,并适合窗口的一行。如果这不是你想要的,那我一定是误会了。

      编辑:未知数量的列表项

      这有一些 CSS3 的东西,但要跨浏览器兼容回 IE8,你需要一个 JS 解决方案。这样的事情应该可以工作:

      var listItems =  document.querySelectorAll('li');
      listItems.style.width = listItems.parentNode.style.width / listItems.length;
      

      第二次编辑:用于 jQuery 而不是 JS

      希望它,但是:

      var $listitems = $('.list').children();
      $listitems.width($listitems.parent().width()/$listitems.length);
      

      【讨论】:

      • 不是我想要的答案。我知道不需要的边距以及如何解决它(很好地描述了here),但它给整体问题增加了额外的复杂性
      • 啊,我看到了更新。是的,我认为可能需要一些 javascript/jQuery,但希望使其仅适用于 css
      • css3 列需要一个静态数字,css3 calc 也需要一个静态数字......对于一个真正动态生成的列表项宽度,适用于每个当前浏览器,JS 是要走的路。使用 jQuery 更容易实现,我只是没有假设你使用了 jQuery。
      • 是的,看起来 jQuery 是要走的路。我想我必须求助于它。
      【解决方案5】:

      您可以将 display:inline-block 与 li 元素一起使用,并将 text-align:justify 与 ul 元素一起使用。如果您有兴趣,请点击here

      【讨论】:

      • 这是 OP 提出的作为起点的内容......看他的小提琴。
      • 另外那个链接是中文的,对我最没有帮助
      猜你喜欢
      • 1970-01-01
      • 2014-05-12
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-18
      相关资源
      最近更新 更多