【问题标题】:Break columns only before specific list elements仅在特定列表元素之前断开列
【发布时间】:2021-04-26 14:59:09
【问题描述】:

我正在使用 CSS 列将列表分成 3 列。 它工作正常,但我无法控制休息的位置。 列表中有一些标题,我只想在它们之前打破。 有没有办法做到这一点?

我尝试使用break-before: avoid。但它不起作用。

这是我的代码:

ul {
    -moz-column-count: 3;
    -webkit-column-count: 3;
    column-count: 3;
    -moz-column-gap: 1.5rem;
    -webkit-column-gap: 1.5rem;
    column-gap: 1.5rem;
    padding-left: 0;
    list-style: none;
}

ul .title {font-size: 18px; font-weight: bold; margin: 20px 0 10px;}
<ul>
<li class="title">Title</li>
<li>List item</li>
<li>List item</li>
<li>List item</li>
<li>List item</li>
<li>List item</li>
<li>List item</li>
<li>List item</li>
<li>List item</li>
<li>List item</li>
<li>List item</li>
<li class="title">Title</li>
<li>List item</li>
<li>List item</li>
<li>List item</li>
<li>List item</li>
<li>List item</li>
<li>List item</li>
<li>List item</li>
<li>List item</li>
<li class="title">Title</li>
<li>List item</li>
<li>List item</li>
<li>List item</li>
</ul>

【问题讨论】:

    标签: html css multiple-columns


    【解决方案1】:

    您可以强制使用分栏符,而不是尝试避免在标题前出现换行符。避免部分中断不起作用,因为从技术上讲,浏览器确实通过在列表中更早插入中断来避免中断。

    使用break-before: column 可以解决问题。然而!请注意,缺少browser support;例如,column 可以在 Chrome 中工作,但不能在 Firefox 中工作。

    ul {
        -moz-column-count: 3;
        -webkit-column-count: 3;
        column-count: 3;
        -moz-column-gap: 1.5rem;
        -webkit-column-gap: 1.5rem;
        column-gap: 1.5rem;
        padding-left: 0;
        list-style: none;
    }
    
    ul .title {
        font-size: 18px;
        font-weight: bold;
        margin: 20px 0 10px;
        break-before: column;
    }
    <ul>
    <li class="title">Title</li>
    <li>List item</li>
    <li>List item</li>
    <li>List item</li>
    <li>List item</li>
    <li>List item</li>
    <li>List item</li>
    <li>List item</li>
    <li>List item</li>
    <li>List item</li>
    <li>List item</li>
    <li class="title">Title</li>
    <li>List item</li>
    <li>List item</li>
    <li>List item</li>
    <li>List item</li>
    <li>List item</li>
    <li>List item</li>
    <li>List item</li>
    <li>List item</li>
    <li class="title">Title</li>
    <li>List item</li>
    <li>List item</li>
    <li>List item</li>
    </ul>

    现在,说了这么多,我有一个偷偷摸摸的怀疑,语义上你想要的是三个不同的列表,每个都有一个标题,而不是一个巨大的列表。如果这是真的,那么您可以通过一些重组和使用 flexbox 来实现近乎完整的浏览器支持。

    ul {
        padding-left: 0;
        list-style: none;
    }
    
    .outer-list {
        display: flex;
    }
    .outer-list > li {
        flex: 1;
    }
    
    ul .title {
        font-size: 18px;
        font-weight: bold;
        margin: 20px 0 10px;
    }
    <ul class="outer-list">
        <li>
            <h1 class="title">Title</h1>
            <ul>
                <li>List item</li>
                <li>List item</li>
                <li>List item</li>
                <li>List item</li>
                <li>List item</li>
                <li>List item</li>
                <li>List item</li>
                <li>List item</li>
                <li>List item</li>
                <li>List item</li>
            </ul>
        </li>
        <li>
            <h1 class="title">Title</h1>
            <ul>
                <li>List item</li>
                <li>List item</li>
                <li>List item</li>
                <li>List item</li>
                <li>List item</li>
                <li>List item</li>
                <li>List item</li>
                <li>List item</li>
            </ul>
        </li>
        <li>
            <h1 class="title">Title</h1>
            <ul>
                <li>List item</li>
                <li>List item</li>
                <li>List item</li>
            </ul>
        </li>
    </ul>

    【讨论】:

      【解决方案2】:

      您可以使用以下技术来满足您的要求。

      ul {
                  padding-left: 0;
                  list-style: none;
                  width: 100%;
              }
      
              ul .title {
                  font-size: 18px;
                  font-weight: bold;
              }
      
              /* Create three equal columns that floats next to each other */
              .col {
                  float: left;
                  width: 33.33%;
                  padding: 10px;
              }
      
              /* Clear floats after the columns */
              .row{
                  display: inline-flex;
              }
              .row:after {
                  content: "";
                  display: table;
                  /* display: inline-flex; */
                  clear: both;
              }
       <ul class="row">
              <div class="col">
                  <li class="title">Title</li>
                  <li>List item</li>
                  <li>List item</li>
                  <li>List item</li>
                  <li>List item</li>
                  <li>List item</li>
                  <li>List item</li>
                  <li>List item</li>
                  <li>List item</li>
                  <li>List item</li>
                  <li>List item</li>
              </div>
      
              <div class="col">
                  <li class="title">Title</li>
                  <li>List item</li>
                  <li>List item</li>
                  <li>List item</li>
                  <li>List item</li>
                  <li>List item</li>
                  <li>List item</li>
                  <li>List item</li>
      
              </div>
              <div class="col">
                  <li class="title">Title</li>
                  <li>List item</li>
                  <li>List item</li>
                  <li>List item</li>
                  <li>List item</li>
      
              </div>
          </ul>

      【讨论】:

      猜你喜欢
      • 2017-07-11
      • 2022-10-17
      • 1970-01-01
      • 2023-02-21
      • 2014-10-23
      • 2016-03-12
      • 2021-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多