确保列以 header 标记开头

Ensuring columns start with a header tag

我有一长串看起来有点像这样的混合属性:

<h3>Section Title</h3>
<ul>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
</ul>
<h3>Section Title</h3>
<ul>
    <li>Item</li>
    <li>Item</li>
</ul>

因为 html 是由客户端使用 CMS 生成的,所以我无法控制会有多少部分,或者每个部分将显示多少项目。我确实可以控制 CMS 使用的 html 输出和所有 front-end 技术等。

我们想把这个列表分成(大约)等高的 3 列,最有效的方法似乎是 CC3 列。

我们如何确保每个新列都以 header 开头? 目前该列可能会在列表中间中断,这是不希望出现的行为。

一个可能的解决方案是将每个部分包装在一个容器中(我将使用 <div>,但您可能想要使用 <section>),然后为该容器指定样式所以它不会在列之间中断。

来自您原始代码的扩展(为了方便,我将所有内容都包装在 div 中,添加了样式以在 3 列中显示它,并添加了几个部分来显示效果):

div#myDiv {
    -webkit-column-count: 3;
    -moz-column-count: 3;
    column-count: 3;
}
<div id="myDiv">
    
    <h3>Section Title</h3>
    <ul>
        <li>Item</li>
        <li>Item</li>
        <li>Item</li>
        <li>Item</li>
    </ul>
    
    <h3>Section Title</h3>
    <ul>
        <li>Item</li>
        <li>Item</li>
    </ul>
    
    <h3>Section Title</h3>
    <ul>
        <li>Item</li>
        <li>Item</li>
        <li>Item</li>
        <li>Item</li>
    </ul>
    
    <h3>Section Title</h3>
    <ul>
        <li>Item</li>
        <li>Item</li>
    </ul>

    <h3>Section Title</h3>
    <ul>
        <li>Item</li>
        <li>Item</li>
        <li>Item</li>
        <li>Item</li>
    </ul>

    <h3>Section Title</h3>
    <ul>
        <li>Item</li>
        <li>Item</li>
    </ul>

    <h3>Section Title</h3>
    <ul>
        <li>Item</li>
        <li>Item</li>
    </ul>

    <h3>Section Title</h3>
    <ul>
        <li>Item</li>
        <li>Item</li>
    </ul>

    <h3>Section Title</h3>
    <ul>
        <li>Item</li>
        <li>Item</li>
    </ul>
    
</div>

您可以通过两种不同的方式执行此操作:

选项 1:如果可以更改 HTML 结构

正如您提到的“我确实可以控制 html 输出”,将所有部分包装在 <div> 中并应用此样式来制作确保每个部分都被视为一个块,不会被分成不同的列:

div {
    display:inline-block;
    width:100%;
}

最终代码如下所示:

div#myDiv {
    -webkit-column-count: 3;
    -moz-column-count: 3;
    column-count: 3;
}
#myDiv div {
    display:inline-block;
    width:100%;
}
<div id="myDiv">
    <div>
         <h3>Section Title</h3>

        <ul>
            <li>Item</li>
            <li>Item</li>
            <li>Item</li>
            <li>Item</li>
        </ul>
    </div>
    <div>
         <h3>Section Title</h3>

        <ul>
            <li>Item</li>
            <li>Item</li>
        </ul>
    </div>
    <div>
         <h3>Section Title</h3>

        <ul>
            <li>Item</li>
            <li>Item</li>
            <li>Item</li>
            <li>Item</li>
        </ul>
    </div>
    <div>
         <h3>Section Title</h3>

        <ul>
            <li>Item</li>
            <li>Item</li>
        </ul>
    </div>
    <div>
         <h3>Section Title</h3>

        <ul>
            <li>Item</li>
            <li>Item</li>
            <li>Item</li>
            <li>Item</li>
        </ul>
    </div>
    <div>
         <h3>Section Title</h3>

        <ul>
            <li>Item</li>
            <li>Item</li>
        </ul>
    </div>
    <div>
         <h3>Section Title</h3>

        <ul>
            <li>Item</li>
            <li>Item</li>
        </ul>
    </div>
    <div>
         <h3>Section Title</h3>

        <ul>
            <li>Item</li>
            <li>Item</li>
        </ul>
    </div>
    <div>
         <h3>Section Title</h3>

        <ul>
            <li>Item</li>
            <li>Item</li>
        </ul>
    </div>
</div>

你也可以在这个 JSFiddle 上看到它:http://jsfiddle.net/w4jLgfo1/

选项2:如果不能改HTML,但可以运行JS

正如您提到的,您可以 运行 所有前端技术,JavaScript(为了方便起见,jQuery 是一种 :)

与上面相同的 CSS 代码,但现在 运行 一个小的 JavaScript 片段,用于在生成并提供 HTML 后包装这些部分:

$("#myDiv h3").wrap("<div></div>");
$("#myDiv div").each(function() {
    $(this).append($(this).next());
});
div#myDiv {
    -webkit-column-count: 3;
    -moz-column-count: 3;
    column-count: 3;
}
#myDiv div {
    display:inline-block;
    width:100%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="myDiv">
    
    <h3>Section Title</h3>
    <ul>
        <li>Item</li>
        <li>Item</li>
        <li>Item</li>
        <li>Item</li>
    </ul>
    
    <h3>Section Title</h3>
    <ul>
        <li>Item</li>
        <li>Item</li>
    </ul>
    
    <h3>Section Title</h3>
    <ul>
        <li>Item</li>
        <li>Item</li>
        <li>Item</li>
        <li>Item</li>
    </ul>
    
    <h3>Section Title</h3>
    <ul>
        <li>Item</li>
        <li>Item</li>
    </ul>

    <h3>Section Title</h3>
    <ul>
        <li>Item</li>
        <li>Item</li>
        <li>Item</li>
        <li>Item</li>
    </ul>

    <h3>Section Title</h3>
    <ul>
        <li>Item</li>
        <li>Item</li>
    </ul>

    <h3>Section Title</h3>
    <ul>
        <li>Item</li>
        <li>Item</li>
    </ul>

    <h3>Section Title</h3>
    <ul>
        <li>Item</li>
        <li>Item</li>
    </ul>

    <h3>Section Title</h3>
    <ul>
        <li>Item</li>
        <li>Item</li>
    </ul>
    
</div>

你也可以在这个 JSFiddle 上看到它:http://jsfiddle.net/w4jLgfo1/1/