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

修复移动端组件引发的Cumulative Layout Shift(CLS)问题

修复移动设备上该组件CLS异常的方案

从状态变化和代码来看,CLS异常的核心原因是自定义字体加载前后的文本尺寸偏移,加上移动端列表元素的显示逻辑触发布局重排。以下是具体修复方案:

1. 优化字体加载逻辑,消除字体切换偏移

  • 在自定义字体的@font-face规则中添加font-display: swap,让浏览器优先显示系统 fallback 字体,自定义字体加载完成后无缝替换,避免空白期同时减少尺寸跳动:
    @font-face {
      font-family: '你的自定义字体名';
      src: url('字体文件路径.woff2') format('woff2');
      font-display: swap;
    }
    
  • 为文本元素设置固定的排版参数,让系统字体和自定义字体的尺寸匹配:
    .text__link {
      font-size: 14px;
      line-height: 1.5;
      letter-spacing: 0.02em;
      white-space: nowrap; /* 避免文本换行引发的布局变化 */
    }
    

2. 锁定移动端列表的初始布局空间

移动端初始仅显示最后3个text__item,需要提前为这些元素预留固定尺寸,避免字体加载后宽高变化引发重排:

.text__item {
  &:nth-last-child(-n+3) {
    display: inline-block;
    min-width: 90px; /* 根据实际文本的最大宽度设置 */
    height: 26px; /* 匹配文本行高+内边距的总高度 */
  }
}

@media (max-width: $screen-sm - 1px) {
  .text__list {
    height: 26px; /* 固定列表高度,避免整体布局跳动 */
    overflow: hidden;
  }
}

3. 优化元素显示逻辑,减少重排触发点

避免使用display: none/inline-block的切换(会触发全量重排),改用visibility+绝对定位处理非显示元素:

@media (max-width: $screen-sm - 1px) {
  .text__item:not(:nth-last-child(-n+3)) {
    position: absolute;
    visibility: hidden;
    pointer-events: none; /* 禁用交互,避免误触 */
  }
}

4. 预加载自定义字体

在HTML头部添加字体预加载,缩短字体加载时间,减少布局偏移的持续时间:

<link rel="preload" href="字体文件路径.woff2" as="font" type="font/woff2" crossorigin>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:20:29