【问题标题】:Can I set a column break in a CSS multicolumn layout?我可以在 CSS 多列布局中设置分栏符吗?
【发布时间】:2026-01-14 20:20:03
【问题描述】:

我有一大段文本流入 CSS 多列布局,使用 CSS hyphening 拉伸,例如,两列、三列或四列。在某些时候,需要提前结束某一列的文本,以便让段落的其余部分从第二列的顶部开始。

我们有什么方法可以简单地设置一个<column-break> 以在下一列的顶部开始其余的文本?

目前我正在用大量<br>s 填充列(需要分栏符)以延长 HTML 中的列以达到效果。

此外,每当任一列中的某些内容发生更改时,<br> 填充的数量就会不足,需要重新评估。

#multicolumn{
    -webkit-column-count: 2; /* Chrome, Safari, Opera */
    -moz-column-count: 2; /* Firefox */
    column-count: 2;
    
}
<div id="multicolumn">FIRST paragraph orem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam.
<br>
<br>
<br>
<br>
SECOND paragraph Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum.</div>

See my JSFiddle

有什么方法可以优雅地“结束”第一列,并告诉浏览器从下一列中的其余内容开始?

【问题讨论】:

  • 你有代码吗?
  • @Paulie_D 到目前为止,我只有 jsfiddle,没有优雅的(css)解决方案。正如您所看到的,许多&lt;br&gt; 确实没有答案,这就是为什么我省略了代码,因为我不想要一个“令人尴尬的糟糕开始”可以这么说......谢谢!
  • 我刚试过这样的布局,浏览器还没有。你仍然需要使用 JS 来完成这项工作。同位素可能是您所需要的。
  • 解决方案的要求是什么?它必须是基于css或javascript的吗?它需要响应吗?还是目标只是实现该布局的最简单途径,并且只需要如图所示?

标签: javascript css layout css-multicolumn-layout


【解决方案1】:

5. Column breaks

当内容以多列布局时,用户代理必须 确定分栏符的放置位置。断裂的问题 内容分栏类似于将内容分页。

引入了三个新属性以允许分栏 在与分页符相同的属性中描述:'break-before', “break-after”和“break-inside”。这些属性取 与“page-break-before”、“page-break-after”和“page-break-after”相同的值 ‘page-break-inside’[CSS21]。此外,一些新的关键字 添加值。

这些属性描述分页/分栏行为 生成框之前/之后/内部。这些值通常是 定义在[CSS21]:

  • auto:在生成的框之前(之后,内部)不强制也不禁止分页/分栏。
  • always:始终在生成的框之前(之后)强制分页。
  • avoid:避免在生成框之前(之后、内部)出现分页/分栏。
  • left:在生成的框之前(之后)强制一个或两个分页符,以便将下一页格式化为左页。
  • right:在生成的框之前(之后)强制一个或两个分页符,以便将下一页格式化为正确的页面。

本规范添加了以下新值:

  • page:始终在生成的框之前(之后)强制分页。
  • column:总是在生成框之前(之后)强制换行。
  • avoid-page:避免在生成框之前(之后、内部)出现分页符。
  • avoid-column:避免在生成框之前(之后、内部)出现分栏。

因此,您可以使用类似的东西

#multicolumn {
  -webkit-column-count: 2; /* Chrome, Safari, Opera */
  -moz-column-count: 2; /* Firefox */
  column-count: 2;
}
.column {
  break-before: column;
  break-after: column;
}
<div id="multicolumn">
  <div class="column">FIRST paragraph orem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam.</div>
  <div class="column">SECOND paragraph Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum.</div>
</div>

但是,似乎只有 Internet Explorer 10+ 和 Opera 11.10-12.1 支持这些属性。

【讨论】:

  • 我已经运行了你的代码,我也看到了 Firefox 上的列!
  • Firefox 支持多列(带有供应商前缀)。它不支持使用break-* 手动换行。
【解决方案2】:

解决此问题的一种方法是将文本实际包装在段落中(p 标签),正如您应该为语义所做的那样,并且不允许您的第 2 段中断,因为它永远不会超过 1 列.

这可以通过使用break-inside CSS 属性来实现。 https://developer.mozilla.org/en/docs/Web/CSS/break-inside

基于您的 sn-p 的代码示例:

@import url(http://fonts.googleapis.com/css?family=Open+Sans:400, 700);
 #multicolumn {
  -webkit-column-count: 2;
  /* Chrome, Safari, Opera */
  -moz-column-count: 2;
  /* Firefox */
  column-count: 2;
}
p {
  font-size: 1em;
  line-height: 1.4;
  margin: 0;
  padding: 0 0 1.4em;
}
p:nth-of-type(2) {
  -webkit-column-break-inside: avoid;
  page-break-inside: avoid;
  break-inside: avoid;
}
 
<div id="multicolumn">
  <p>FIRST paragraph orem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam.</p>
  <p>SECOND paragraph Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum.</p>
</div>

【讨论】:

    【解决方案3】:

    使用&lt;p&gt;标签区分段落。

    <div id="multicolumn">
    <p>FIRST paragraph orem ipsum dolor sit amet, consectetuer adipiscing elit, 
    sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat 
    volutpat. Ut wisi enim ad minim veniam.</p>
    <div id="filler"></div>
    <p>SECOND paragraph Duis autem vel eum iriure dolor in hendrerit in vulputate 
    velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at 
    vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum 
    zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor 
    cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim 
    placerat facer possim assum.</p>
    </div>
    

    还有 CSS

    @import url(http://fonts.googleapis.com/css?family=Open+Sans:400,700);
    
    #multicolumn{
    -webkit-column-count: 2; /* Chrome, Safari, Opera */
    -moz-column-count: 2; /* Firefox */
    column-count: 2;
    
    }
    
    #filler {
    float: left;
    position: relative;
    background-color: #f00;
    height: 120px;
    width: 50%;
    

    http://jsfiddle.net/mnz2h9hr/2/

    &lt;p&gt; 标签将段落放在一起,而“填充”(红色标记)则保持一个没有文本的区域。

    【讨论】:

    • 我认为这行不通。尝试在第一段使用更大的文字。
    【解决方案4】:

    对于您的情况,最好的解决方案是使用网格系统。 请在全页视图中运行 sn-p。

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <title>Bootstrap Example</title>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
      <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
    </head>
    <body>
    
    <div class="container-fluid">
      <div class="row">
     <div class="col-sm-6" style="background-color:lavenderblush;">FIRST paragraph orem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam.</div>
          <div class="col-sm-6" style="background-color:lavender;">
            SECOND paragraph Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis
            dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum.</div>
    
        </div>
      </div>
    </div>
    
    </body>
    </html>

    【讨论】:

      【解决方案5】:

      如果您能够将每一列包装在一个 div 中,那么最优雅的解决方案就是使用引导式网格。

          .row {
            margin: 0 -15px;
          }
          .column {
            box-sizing: border-box;
            float: left;
            padding: 0 15px;
            width: 50%;
          }
      <div id=row">
        <div class="column">FIRST paragraph orem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam.</div>
        <div class="column">SECOND paragraph Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum.</div>
      </div>

      如果您使用所见即所得来输入副本,那么您必须有权访问源按钮以将列包装在 div 中。然后使用上面的代码,列就变得很简单了;并且很容易做出响应。

      【讨论】:

        【解决方案6】:

        详细说明@Oriol 答案,您可以设置宽度,因此第一列将始终使用左半边。

        #multicolumn {
          -webkit-column-count: 2; /* Chrome, Safari, Opera */
          -moz-column-count: 2; /* Firefox */
          column-count: 2;
        }
        
        .column:nth-of-type(1) {
         width:50%;
        }
        <div id="multicolumn">
          <div class="column">FIRST paragraph orem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam.</div>
          <div class="column">SECOND paragraph Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum.</div>
        </div>

        【讨论】:

          【解决方案7】:

          从技术上讲,这不是您要插入的 CSS 多列功能,但这看起来很相似。

          .column {
             width : 46%;
             margin: 0% 2%;
             height: 100%;
             float: left;
          }
          
          <div class="column">FIRST paragraph orem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam.</div>
          
          <div class="column">SECOND paragraph Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum.</div>
          

          这是 jsFiddle:http://jsfiddle.net/Vbr9d/242/

          【讨论】:

          • 感谢您的实际思考和提供的示例。这也适用于 2、3、4、... n 列。