《HTML/CSS/JS 是如何“渲染”页面的?——浏览器的“厨房”大揭秘!》

67 阅读5分钟

HTML/CSS/JS 是如何“渲染”页面的?——浏览器的“厨房”大揭秘!


🍳 开场白:你以为浏览器只是“显示网页”?错!它是个米其林三星厨房!

当你在浏览器地址栏输入一个网址,按下回车——
你以为浏览器只是“读”了你的 HTML,然后“画”出来?
NO! 它其实在后台开了一场大型烹饪秀,而你的 HTML、CSS、JS 就是食材、菜谱和厨师!

今天,我们就来揭开浏览器“厨房”的神秘面纱,看看它是如何把一堆代码变成你眼前这张“香喷喷”的网页的!


🧱 第一步:HTML → DOM 树(搭建厨房的“骨架”)

📜 输入:一串 HTML 字符串

<p>介绍<span>渲染流程</span></p>
    <div>
        <p>green</p>
        <div>red</div>
    </div>

浏览器看到这段代码,就像厨师拿到一张潦草的菜单:“嗯?这是啥?红烧还是清蒸?”

但它不能直接“炒”,得先解析——把字符串变成树状结构,也就是 DOM(Document Object Model)树

  • <p> 是一个节点
  • <span><p> 的子节点
  • 文本“介绍”和“渲染流程”也是节点(文本节点)
  • 第一个 <div>也是一个节点
  • 第二个<p><div> 是第一个<div>的子节点

💡 小知识:DOM 树不是真的树,但它长得像家谱——有爹有娃,层级分明!

✅ 为什么要用语义化标签?

比如你写:

<header>
    <h1>HTML5语义化标签--陳陈陳的技术博客</h1>
  </header>
  <div class="container">
    <main>
      <section>
        <h2>主要内容</h2>
        <p>这里是页面的核心内容区域
          <code>&lt;main&gt;</code><code>&lt;section&gt;</code>
          标签表现结构清晰
        </p>
        <p>HTML5的语义标签有助于SEO和无障碍访问</p>
       
      </section>
    </main>
    <aside class="aside-left">
        <h3>左侧边栏</h3>
        <p>导航链接、目录和广告位</p>
      <ul>
        <li>首页</li>
        <li>关于</li>
        <li>联系</li>
      </ul>
    </aside>
    <aside class="aside-right">
        <h3>右侧边栏</h3>
        <p>相关文章、推荐内容</p>
    </aside>
  </div>
  <footer>
    <p>&copy;2025 陳陈陳.All rights reserved.</p>
  </footer>

而不是:

<div class="main">...</div>
<div class="sidebar">...</div>

好处

  • SEO 友好:百度蜘蛛(爬虫)一看就懂:“哦!这是主要内容,得重点收录!”
  • 无障碍访问:屏幕阅读器能告诉视障用户:“你现在在主内容区。”
  • 代码更清晰:你三个月后回来看,不会骂自己:“这坨 div 到底是干啥的?”

🤣 幽默时刻
如果 HTML 是写小说,<div> 就是“然后他做了个东西”,而 <article> 是“他写了一篇震惊业界的技术博客”——你说哪个更容易被记住?


🎨 第二步:CSS → CSSOM 树(给厨房上色、摆餐具)

浏览器拿到 CSS 后,也会把它变成一棵树——CSSOM(CSS Object Model)

比如这段 CSS:

#p7 {
            color:pink;
        }
p {
            color: blue!important;
        }
.highlight {
            color: green;
        }

再看这个 HTML:

<p class="highlight" id="p7" style="color:red;">这段文字什么颜色?</p>

问题来了:文字到底是啥颜色?

🧠 CSS 优先级大战(谁说了算?)

浏览器内部有一套“打分系统”:

  • 标签选择器(p):1 分
  • 类选择器(.highlight):10 分
  • ID 选择器(#p7):100 分
  • 内联样式(style=""):1000 分
  • !important直接开挂!无视一切!

所以最终颜色是: 蓝色

💡 记住口诀
!important 的声明最大,不管它在哪;
不带 !important 时,才看:内联 > ID > class > 标签


🤝 第三步:DOM + CSSOM = 渲染树(Render Tree)

现在,浏览器把 DOM 树CSSOM 树 合体,生成 渲染树(Render Tree)

  • 渲染树只包含需要显示的节点(比如 display: none 的元素直接被踢出群聊)
  • 每个节点都带上了最终的样式(颜色、大小、位置等)

🍽️ 比喻
DOM 是食材清单,CSSOM 是菜谱,渲染树就是“今晚要做的菜+做法+摆盘设计”!


📏 第四步:布局(Layout / Reflow)

浏览器开始计算:每个元素该放哪儿?多宽多高?

比如你用 Flex 布局:

* {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
    }
    body {
        line-height: 1.5;
        background-color: #f4f4f4;
    }
    header {
        background-color: #333;
        color:white;
        padding: 1rem;
        text-align: center;
    }
    .container {
        display: flex;
        /* css 内置函数 */
        min-height: calc(100vh - 160px);
    }
    main {
         flex: 1; /* 主内容区域 其他元素占满后,余下的都是主元素的 */
         background: lemonchiffon;
         padding: 1.5rem;
    }
    aside {
        width: 250px;
        background-color: burlywood;
        padding: 1.5rem;
    }
    .aside-left {
        order:-1;
    }
    footer {
        background-color: #333;
        color: white;
        padding: 1rem;
        text-align: center;
        margin-top: auto;
    }

order: -1 让左侧边栏在视觉上排到最前面,但 HTML 结构仍是 main 在前——这对 SEO 和无障碍访问更友好!”

在桌面端,布局是:左侧边栏 | 主内容 | 右侧边栏
最终结果如下图

image.png 但在手机上(媒体查询生效):

    /* 媒体查询 设备的宽度 375 < 480 */
    @media (max-width: 768px) {
        .container {
            flex-direction: column;  /* 主轴设置 */
        }
        .aside-left {
            order: 1;
        }
        .aside-right {
            order: 2;
        }
        aside {
            width: 100%;
            padding: 1rem;
        }
    }

布局变成垂直向下:主内容 → 左侧边栏 → 右侧边栏

最终结果如下图

image.png

⚠️ 性能警告
频繁触发 Reflow(重排) 会让页面卡成 PPT!比如循环中不断读取 offsetWidth


🖌️ 第五步:绘制(Paint)

浏览器把渲染树“画”成像素——文字、颜色、边框、阴影……统统变成位图。

这一步可能分层(Layer),比如:

  • 背景一层
  • 文字一层
  • 动画元素单独一层(便于 GPU 加速)

🚀 第六步:合成(Composite)

最后,浏览器把各个图层像“叠透明胶片”一样合成一张完整的图片,显示在屏幕上。

目标:每秒 60 帧(16.6ms 一帧)
如果哪一步超时,用户就会觉得“卡”!


🛠️ 性能优化小贴士(给你的网页“减减肥”)

  1. HTML 语义化:让结构清晰,SEO 友好。
  2. 减少重排重绘:避免频繁修改样式,用 transform 做动画。
  3. CSS 选择器别太复杂.nav ul li a:hover.nav a:hover 慢得多。
  4. 关键 CSS 内联:首屏样式直接写 <style>,别等外部文件加载。
  5. JS 放底部 or defer:别阻塞 DOM 构建! JS 会阻塞 DOM 构建!因为 JS 可能修改 HTML(比如 document.write),所以浏览器必须等 JS 执行完才能继续解析 HTML。

🎉 结语:你不是在写代码,你是在指挥一场交响乐!

HTML 是乐谱,CSS 是配器,JS 是指挥家,浏览器是演奏厅。
每一个 <main>、每一行 flex、每一个 !important,都在为这场演出添砖加瓦。

下次当你看到页面“唰”一下加载出来——
别忘了,背后是浏览器在疯狂“炒菜”、“摆盘”、“上菜”!