【问题标题】:Combining "column-count" and "display: table" renders single column in Firefox结合“列计数”和“显示:表”在 Firefox 中呈现单列
【发布时间】:2015-12-23 15:05:06
【问题描述】:

我正在尝试解决 Firefox(我使用的是 40.0.3)中的一个问题,其中使用 -moz-column-countdisplay: table 会导致列表显示为一列。这是我的示例和jsfiddle

div {
  -webkit-column-count: 2; /* Chrome, Safari, Opera */
  -moz-column-count: 2; /* Firefox */
  column-count: 2;
}

ul {
  display: table;
  margin: 0 auto;
}
<div>
  <ul>
    <li>abcd</li>
    <li>b</li>
    <li>cdefg</li>
    <li>d</li>
  </ul>
</div>

我正在使用 display: table 将 div 中的列居中。在 Edge、IE10 和 Chrome 中,列表分为两列。

我的问题是如何在 Firefox 中使用 display: table 获得两列,或者如何正确地将列表居中以使其在所有浏览器中都有效。

【问题讨论】:

    标签: html css firefox


    【解决方案1】:

    实际上,我认为 Chrome 和 IE 是错误的。他们确实提供你想要的,但他们不应该,就像FF一样。

    在你的代码中你'说'split-div-in-2-columns,但实际上你只输入了一个ul。当您将 ul 一分为二(参见 sn-p)时,FF 会按预期工作,CH 和 IE BTW 也是如此。

    如果我创建了您的代码,我实际上只期望一列,即 li 的 ul(或 p 的一个 div、span 的一个 p 等)。第二个 ul 将是第二列(第二个 div ......等)。因此我的结论是 Chrome 和 IE 搞砸了。

    我讨厌这样的意外行为,让人不确定哪个浏览器是正确的。

    这是更正后的代码:

    div {
      -webkit-column-count: 2; /* Chrome, Safari, Opera */
      -moz-column-count: 2; /* Firefox */
      column-count: 2; /* demo code */
    }
    ul {
      display: table;
      margin: 0 auto;
    }
    <div>
      <ul>
        <li>abcd</li>
        <li>b</li>
      </ul>
      <ul>
        <li>cdefg</li>
        <li>d</li>
      </ul>
    </div>

    - 使用额外的演示代码更新 -

    此外还有一些演示 sn-p 如何在没有 table 的情况下使用它。只需将您的代码删除表格内容并将column-count移动到ul

    同样有效:

    ul, li {
        list-style-type: none; padding: 0;
    }
    
    div {
        width: 500px; /* just some width */
        border: 2px dashed silver;
        margin: 0 auto; /* center in body */
    }
    ul {
        -webkit-column-count: 2; /* Chrome, Safari, Opera */
        -moz-column-count: 2; /* Firefox */
        column-count: 2;
        margin: 0 auto; /* center in div */
    }
    
    li {
        border: 1px dotted red;
    }
     <div>
        <ul>
            <li>abcd</li>
            <li>b</li>
            <li>cdefg</li>
            <li>d</li>
        </ul>
    </div>

    【讨论】:

    • 好一个勒内!值得赏金。
    • @Manoj Kumar 在浏览器技术发展 20 年(及以上)之后,我从未对浏览器之间的大量不一致和错误感到惊讶。我是一名 ol'school(Windows 之前,甚至 DOS 之前)的软件工程师,我认为尤其是 MS 应该深感羞愧。
    • @Manoj Kumar 忘记了适当的谢谢,所以,谢谢你的赞美。但我并不是真正追求赏金,对我来说,这更像是一个迹象,表明还有一些紧迫的问题悬而未决。顺便说一句,有没有办法直接与 ppl 交流(除了聊天)。我正在寻找一个图形设计师/技术人员,用最少的 Vanilla JS(开源)构建一个智能、简化的 CSS 框架。有兴趣吗?
    • 感谢您的邀请。希望我能加入你,但我不确定我目前是否可以工作。不过,我很高兴看到您正在尝试构建什么。给我发电子邮件:me@manojkr.com
    • 感谢您的输入雷内。我通常不是网络开发人员,现在我看的更多了,FF 会把它放在一个列中是有道理的
    【解决方案2】:

    如何正确地使列表居中以使其适用于所有浏览器?

    您可以使用 CSS3 灵活的框布局来居中对齐列表。由于您使用的是 CSS3 多列布局,我假设您正在为现代浏览器构建列表。因此,flexible box 方法是可行的方法。

    1. &lt;div&gt; 成为灵活项目容器。 justify-content:center 将列表与中心对齐。

    2. 设置列计数 &lt;ul&gt;。您可以设置*-column-gap 之间的间距 列。

    适用于 Firefox、Chrome、Internet Explorer、Edge 和 Opera(即基本上所有浏览器)。这是JSfiddle demo

    * {
      margin: 0;
      padding: 0;
    }
    div {
      display: flex;
      justify-content: center;
    }
    ul {
      -webkit-column-count: 2; /* Chrome, Safari, Opera */
      -moz-column-count: 2; /* Firefox */
      column-count: 2;
      -moz-column-gap: 100px;
      -webkit-column-gap: 100px;
      column-gap: 100px;
    }
    h2 {
      text-align: center;
      margin-bottom: 10px;
    }
    <h2> Centered CSS3 multi-column layout </h2>
    <div>
      <ul>
        <li>abcd</li>
        <li>b</li>
        <li>cdefg</li>
        <li>d</li>
      </ul>
    </div>

    【讨论】:

    • 您在容器中以最小宽度居中div,但在问题中他将lis 居中在每列内。
    • 也许你就在这里,但我采取了这个我正在使用 display: table 居中 div 中的列。此演示基于假设他只想使列居中而不是里面的项目。所以我必须在这里等待OP的回应才能即兴回答。
    • 就在我发布我的答案之前,OP 接受了答案(显然可以完成工作)。虽然正确,但此解决方案隐藏了一个问题,即存在需要解决的浏览器怪癖。请查看我的回答并发表评论,我想听听您对此的想法。
    【解决方案3】:

    您应该在 ul 上使用 display:block,因为列计数在 Firefox 中无法与 display:table 一起正常工作。

    您可以使用width: fit-content; 将 div 中的列居中。

    div {
      -webkit-column-count: 2;
      /* Chrome, Safari, Opera */
      -moz-column-count: 2;
      /* Firefox */
      column-count: 2;
    }
    ul {
      display: block;
      margin: 0 auto;
      width: -moz-fit-content;
      width: -webkit-fit-content;
      width: fit-content;
    
    }
    <div>
      <ul>
        <li>abcd</li>
        <li>b</li>
        <li>cdefg</li>
        <li>d</li>
      </ul>
    </div>

    【讨论】:

    • fit-content 浏览器支持不佳。
    【解决方案4】:

    可以使用@supports 规则检查 Firefox。
    由于其他浏览器不支持-moz-column-count,因此不受影响。
    FF 可以在该块内获得单独的解决方案。

    https://jsfiddle.net/094gmjp2/5/

    div {
        -webkit-column-count: 2; /* Chrome, Safari, Opera */
        -moz-column-count: 2; /* Firefox */
        column-count: 2;
    }
    
    ul {
        display: table;
        margin: 0 auto;
    }
    
    @supports (-moz-column-count: 2) {
        ul {
            display: block;
            width: -moz-fit-content;
            width: fit-content;
        }
    }
    <div>
        <ul>
            <li>asadf</li>
            <li>b</li>
            <li>cadsfa</li>
            <li>d</li>
        </ul>
    </div>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-10
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      • 2021-01-24
      相关资源
      最近更新 更多