Отличие DOM и Render Tree
DOM (Document Object Model) — это полное программное представление HTML-документа в виде древовидной структуры узлов. Render Tree (или Render Object Tree) — это подмножество DOM, которое фактически используется браузером для визуализации (рендеринга) страницы на экране. Render Tree формируется на основе DOM Tree и CSSOM (CSS Object Model).
Сравнивая эти два понятия, мы видим, что Render Tree представляет собой визуализируемое подмножество DOM. Это означает, что он игнорирует те узлы DOM, которые не влияют на конечное графическое представление страницы. Это не просто "скрытые" элементы, а элементы, которые по своей природе не являются визуальными объектами или имеют стили, полностью исключающие их из потока отображения.
Какие элементы DOM отсутствуют в Render Tree?
Вот основные категории узлов DOM, которые НЕ включаются в Render Tree:
1. Элементы, скрытые с помощью CSS (display: none)
Это самый очевидный случай. В отличие от visibility: hidden или opacity: 0 (которые скрывают элемент визуально, но оставляют его в Render Tree как объект, занимающий место), display: none полностью удаляет элемент и его потомков из дерева рендеринга.
<div style="display: none;">
<p>Этот текст не рендерится</p>
</div>
<div style="opacity: 0;">
<p>Этот текст рендерится (как невидимый объект)</p>
</div>
2. Невизуальные служебные элементы
Элементы, которые несут метаинформацию или предназначены для скриптов, браузера, но не для отображения.
<head></head>
<meta charset="UTF-8">
<title>Страница</title>
<script src="app.js"></script>
<style>body { color: red; }</style>
<link rel="stylesheet" href="styles.css">
3. Элементы, не являющиеся частью CSS Box Model
Некоторые элементы по спецификации не создают визуальных боксов (box).
<template>
<div>Это контент шаблона</div>
</template>
4. Элементы с aria-hidden="true" (но только если это влияет на отображение)
Важно понимать: сам по себе aria-hidden="true" не гарантирует исключение из Render Tree. Это атрибут доступности. Однако, если элемент уже скрыт (через CSS), этот атрибут помогает скринридерам понять, что элемент действительно не должен быть доступен. Исключение из Render Tree зависит именно от стилей (display: none), а не от ARIA-атрибутов.
5. Скрипты с атрибутом type, отличным от text/javascript или пустым
Современные скрипты для шаблонов или нативных модулей также не рендерятся.
<script type="application/json">{"data": "value"}</script>
<script type="module">import module from './module.js';</script>
6. Элементы, находящиеся вне видимого контекста (в некоторых случаях)
Например, элементы внутри <svg>, <math>, или другие элементы в отдельных пространствах имён, которые не обрабатываются основным движком рендеринга HTML — их обработка происходит в других контекстах.
Важный технический нюанс: Render Tree состоит не из DOM0-узлов напрямую, а из специальных объектов рендеринга (Render Objects в Blink/WebKit, Frames в Gecko). Каждый такой объект соответствует элементу DOM, который имеет визуальное представление и стили, определяющие его бокс.
Почему это различие критически важно?
Понимание этой разницы — ключ к оптимизации производительности веб-страниц:
- Оптимизация загрузки: Если элементы изначально скрыты через
display: none, браузер может отложить их обработку (например, загрузку фоновых изображений внутри них) до момента, когда они понадобятся.
- Оптимизация рендеринга: При изменениях DOM (через JavaScript), браузер пересчитывает стили (Recalc Style), обновляет Render Tree (Layout), и только затем перерисовывает изменения (Paint, Composite). Исключение ненужных элементов из Render Tree уменьшает сложность Layout-фазы.
- Точный контроль отображения: CSS-свойство
content-visibility: auto (современная фича) позволяет браузеру временно исключать целые поддеревья из Render Tree, если они находятся вне области просмотра, что радикально ускоряет первоначальную отрисовку длинных страниц.
.long-list-item {
content-visibility: auto;
contain-intrinsic-size: 200px;
}
Таким образом, можно сказать, что Render Tree — это "выжимка" из DOM, содержащая только те элементы, которые влияют на визуальную композицию страницы в данный момент. Это фундаментальное разделение позволяет браузерам эффективно управлять ресурсами и рендерить сложные интерфейсы с высокой производительностью. При отладке в DevTools (во вкладке "Elements" мы видим DOM, а процессы Layout и Paint работают с Render Tree) это различие становится особенно заметным.