当前位置: 首页 > 面试题库 >

如何防止元素内的列中断?

慕容光启
2023-03-14
问题内容

考虑以下HTML:

<div class='x'>
    <ul>
        <li>Number one</li>
        <li>Number two</li>
        <li>Number three</li>
        <li>Number four is a bit longer</li>
        <li>Number five</li>
    </ul>
</div>

和以下CSS:

.x {
    -moz-column-count: 3;
    column-count: 3;
    width: 30em;
}

就目前情况而言,Firefox目前与以下内容类似:

• Number one    • Number three          bit longer
• Number two    • Number four is a    • Number five

注意,第四项在第二和第三列之间分配。我该如何预防?

所需的渲染可能更像:

• Number one    • Number four is a
• Number two      bit longer
• Number three  • Number five

要么

• Number one    • Number three        • Number five
• Number two    • Number four is a
                  bit longer

编辑: 仅指定宽度以演示不需要的渲染。在实际情况下,当然没有固定的宽度。


问题答案:

正确的方法是使用闯入式CSS属性:

.x li {
    break-inside: avoid-column;
}

不幸的是,截至2019年10月,Firefox不支持此功能,但其他所有主流浏览器均支持此功能。使用Chrome,我可以使用上面的代码,但是无法使Firefox正常运行。

如有必要,您可以为Firefox执行的解决方法是将不间断的内容包装在表中,但是如果可以避免的话,那将是一个非常非常糟糕的解决方案。

更新

根据上面提到的错误报告,Firefox 20+支持page-break-inside:avoid作为一种机制来避免元素内的列中断,但是以下代码片段展示了Firefox 20+ 仍不能与列表一起使用:

.x {

    column-count: 3;

    width: 30em;

}



.x ul {

    margin: 0;

}



.x li {

    -webkit-column-break-inside: avoid;

    -moz-column-break-inside:avoid;

    -moz-page-break-inside:avoid;

    page-break-inside: avoid;

    break-inside: avoid-column;

}


<div class='x'>

    <ul>

        <li>Number one, one, one, one, one</li>

        <li>Number two, two, two, two, two, two, two, two, two, two, two, two</li>

        <li>Number three</li>

    </ul>

</div>

正如其他人所提到的,您可以这样做overflow: hiddendisplay: inline- block但还是可以删除原始问题中显示的项目符号。您的解决方案将根据您的目标而有所不同。

更新2 由于Firefox确实可以防止中断,display:table因此display:inline- block可靠的但非语义的解决方案是将每个列表项包装在其自己的列表中,然后在此处应用样式规则:

.x {

    -moz-column-count: 3;

    -webkit-column-count: 3;

    column-count: 3;

    width: 30em;

}



.x ul {

    margin: 0;

    -webkit-column-break-inside: avoid; /* Chrome, Safari */

    page-break-inside: avoid;           /* Theoretically FF 20+ */

    break-inside: avoid-column;         /* IE 11 */

    display:table;                      /* Actually FF 20+ */

}


<div class='x'>

    <ul>

        <li>Number one, one, one, one, one</li>

    </ul>

    <ul>

        <li>Number two, two, two, two, two, two, two, two, two, two, two, two</li>

    </ul>

    <ul>

        <li>Number three</li>

    </ul>

</div>


 类似资料:
  • 我想要一个数组列表,并限制元素删除。我该怎么做?

  • 问题内容: 尽管像这样 的元素通常会增长以适应其内容,但是使用float属性会给 CSS新手带来一个惊人的问题:如果浮动元素具有非浮动父元素,则父元素会折叠。 例如: 在此示例中,父div 不会扩展为包含其浮动的子级-似乎有height: 0。 你怎么解决这个问题? 我想在这里创建一个详尽的解决方案列表。如果您知道跨浏览器的兼容性问题,请指出。 解决方案1 Float the parent. 优点

  • 问题内容: 我认为这是一个普遍的问题,不需要从我的图表中获取太多信息。 我想防止列彼此重叠/重叠,该怎么办? 请参阅下面的图像链接,了解现在的情况 http://highslide.com/forum/download/file.php?id=3157 jsfiddle:http : //jsfiddle.net/Dzs5q/ 问题答案: 请尝试在此处重现该错误@ http://jsfiddle.

  • 问题内容: 我们知道node.js为我们提供了强大的功能,但强大的功能带来了巨大的责任。 据我所知,V8引擎不进行任何垃圾收集。因此,我们应该避免什么最常见的错误,以确保没有内存从节点服务器泄漏。 编辑: 对不起,V8确实具有强大的垃圾收集器。 问题答案: 据我所知,V8引擎不进行任何垃圾收集。 V8内置了强大而智能的垃圾收集器。 您的主要问题是不了解闭包如何维护对外部函数的范围和上下文的引用。这

  • 我正在开发一个web应用程序,它显示了一个巨大的卡片网格,其高度本质上是可变的。 为了美观起见,我们使用jQuery的来均衡每行卡片的高度。 它的性能没有得到很好的扩展,所以今天我一直在迁移到一个基于flex box的解决方案,它的速度要快得多。 然而,我失去了一个行为——如果卡头的内容不合适,应该用省略号将其截断。 目标: 3列 列宽度变化以填充父 行间距不变 高度在一排内相等 如何安排容器大小

  • 问题内容: 如果我有标记: .a类具有与之关联的悬停类 .b类具有与之关联的伪元素…像这样: CSS是否有可能防止伪元素触发.a类悬停? 小提琴 问题答案: 以下CSS为现代浏览器(而非IE10-)提供了诀窍: 允许元素不接收悬停/点击事件。 警告 对非SVG元素的支持处于相对早期的状态。developer.mozilla.org给您以下警告: 在CSS中将指针事件用于非SVG元素是实验性的。 该