← 中文资源

简体中文版本

关键渲染路径

关键渲染路径是从首批 HTML 字节到首次有意义绘制的最小步骤序列:DOM 与 CSSOM 构建、样式、布局、绘制与合成,逐级被阻塞资源卡住。

阅读英文原文

概念定义

关键渲染路径是浏览器渲染初始视口必须完成的最小步骤:HTML 解析为 DOM、CSS 取回并解析为 CSSOM、两者合成渲染树、执行布局、绘制、合成。路径上每一个阻塞渲染的样式表与同步脚本都直接推迟首次绘制。

工作机制

渲染有依赖链:文档中间的同步脚本未执行完 DOM 就无法完成;由于任何规则都可能影响任何元素,CSSOM 必须完整解析后渲染树才能构建。随后样式解析生成渲染树、布局计算几何、绘制填充像素、合成组装图层。媒体查询与打印样式可标记为当前上下文非阻塞。

使用场景

转化依赖可见内容的页面:落地页、搜索结果、文章首屏。做法是把初始视口所需 CSS 内联、其余延迟、脚本改 async 或 defer,并预加载主字体,避免文字等待 CSS 链发现。

常见误区

并非只有图片拖延首绘——阻塞 CSS 与同步脚本在任何像素出现前就停止渲染。全量内联 CSS 是用字节膨胀换渲染阻塞的坏交易,伤害回访与缓存效率。脚本晚到还会让布局失效重跑。度量应看 LCP 与绘制时序,而非整页加载完成。

代码示例

/* Grid template areas */
.page-layout {
  display: grid;
  grid-template-areas:
    "header header header"
    "nav    main   aside"
    "footer footer footer";
  grid-template-columns: 200px 1fr 250px;
  grid-template-rows: auto 1fr auto;
  min-height: 100vh;
  gap: 1rem;
}

.page-layout > header { grid-area: header; }
.page-layout > nav { grid-area: nav; }
.page-layout > main { grid-area: main; }
.page-layout > aside { grid-area: aside; }
.page-layout > footer { grid-area: footer; }

/* Auto-fit responsive grid */
.auto-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  gap: 1.5rem;
}

/* 12-column grid system */
.grid-12 {
  display: grid;
  grid-template-columns: repeat(12, 1fr);
  gap: 1rem;
}

.grid-12 .col-6 { grid-column: span 6; }
.grid-12 .col-4 { grid-column: span 4; }
.grid-12 .col-3 { grid-column: span 3; }

/* Masonry-like layout */
.masonry {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  grid-auto-rows: 10px;
  gap: 1rem;
}

.masonry .item-tall { grid-row: span 30; }
.masonry .item-short { grid-row: span 20; }

/* Responsive grid with media query */
@media (max-width: 768px) {
  .page-layout {
    grid-template-areas:
      "header"
      "nav"
      "main"
      "aside"
      "footer";
    grid-template-columns: 1fr;
  }
}
public class StringBuilderManipulation {

    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder(64);

        sb.append("Hello");
        sb.append(" ");
        sb.append("World");
        System.out.println("Built: " + sb);

        sb.insert(5, " Java");
        System.out.println("After insert: " + sb);

        sb.delete(5, 10);
        System.out.println("After delete: " + sb);

        sb.replace(0, 5, "Hi");
        System.out.println("After replace: " + sb);

        sb.reverse();
        System.out.println("Reversed: " + sb);

        String csv = String.join(", ",
            "Apple", "Banana", "Cherry", "Date");
        System.out.println("CSV: " + csv);

        String formatted = String.format(
            "Name: %s, Age: %d, Score: %.2f",
            "Alice", 30, 95.5
        );
        System.out.println(formatted);

        String stripped = "  padded  ".strip();
        System.out.println("Stripped: '" + stripped + "'");
    }
}