You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CSS column-count布局下首列li的:before/:after伪元素显示异常

问题现象

使用CSS column-count 属性实现双列布局时出现UI渲染异常:第一列<li>元素的:before、:after伪元素渲染断裂、位置错乱,第二列应用完全相同CSS样式的<li>元素伪元素显示正常。

  • 异常效果参考:双列布局伪元素渲染异常截图
  • 测试环境:Chrome 102.0.5005.63 (Official Build) (64-bit)
  • 在线复现地址:Fiddle在线复现
复现代码

原有CSS代码

.two-column {
  column-count: 2;
  column-gap: 2rem;
  max-width: 100%;
}

.column-break {
  display: block;
  break-after: column;
}

.two-column li {
  position: relative;
  font-size: 1rem;
  font-weight: 500;
  padding: 5px 0 5px 20px;
  list-style-type: none;
  list-style:none;
}

.two-column li:before {
  content: "";
  position: absolute;
  left: 0px;
  width: 15px;
  height: 0.125rem;
  background-color: rgb(195, 51, 69);
  margin-top: 0.5rem;
}

.two-column li a {
  display: block;
  position: relative;
}

.two-column li a:after {
  content: "";
  position: absolute;
  width: 15px;
  border-radius: 50%;
  height: 15px;
  top: 3px;
  background-color: rgb(195, 51, 69);
  margin-left: 5px;
}

原有HTML结构

<div class="two-column">
  <div>
    <p><strong>Column 1</strong></p>
    <ul>
      <li><a href="#" target="_blank">Link</a></li>
      <li><a href="#" target="_blank">Link</a></li>
      <li><a href="#" target="_blank">Link</a></li>
    </ul>
  </div>
  <span class="column-break"></span>
  <div>
    <p><strong>Column 2</strong></p>
    <ul>
      <li><a href="#" target="_blank">Link</a></li>
      <li><a href="#" target="_blank">Link</a></li>
      <li><a href="#" target="_blank">Link</a></li>
      <li><a href="#" target="_blank">Link</a></li>
    </ul>
  </div>
</div>
异常原因

这是Chromium内核多列布局模块的已知渲染bug:多列容器内使用break-after: column做强制列分割时,分割点之前的定位父元素如果没有创建独立渲染层,其内部的绝对定位伪元素会错误计算定位基准,继承列分割产生的偏移值,最终出现位置错乱、渲染断裂的问题。第二列元素处于分割点之后,不受该偏移计算错误影响,因此显示正常。

修复方案

选择以下任意一种方案即可解决问题:

  • 方案1:强制创建独立渲染层。给多列容器内所有带position: relative的元素添加transform: translateZ(0)规则,触发浏览器为元素创建独立合成层,隔离列分割规则对伪元素定位计算的影响。补充的CSS代码如下:
    .two-column li, .two-column li a {
      transform: translateZ(0);
    }
    
  • 方案2:移除强制换列的空标签。删除用于换列的<span class="column-break">节点和对应CSS规则,改为给两列的外层容器设置break-inside: avoid,让浏览器自动完成列内容分配,从根源上规避该渲染bug。补充的CSS代码如下:
    .two-column > div {
      break-inside: avoid;
    }
    

内容的提问来源于stack exchange,提问作者Kamal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 19:12:30