Продолжить предыдущую статьюВесь процесс после ввода URL в адресной строке браузера》
предисловие
Зачем понимать, как работает рендеринг в браузере? Каковы преимущества знания того, как работает рендеринг в браузере? Почему мы должны понимать принципы работы браузеров, когда занимаемся фронтенд-разработкой? Просто создайте веб-страницу напрямую, что нужно, просто возьмите шаттл и покончите с этим, разве не хорошо покончить с этим?
Но люди часто спрашивают, чтопереставлятьа такжеперерисовать?
переставлятьТакже известен какпереплавка(Reflow
),перерисовать(Repaint
), что повлияет на производительность браузера, создавая у пользователей впечатление, что доступ к веб-странице медленный, или веб-страница будет зависать и работать не плавно, что сократит количество посещений веб-страницы.
Таким образом, чтобы избежать, насколько это возможнопереставлятьа такжеперерисовать, вам нужно знать браузерПринцип рендеринга.
Рабочий процесс браузера
Как видно из рисунка выше, браузер разбирает три модуля:
-
HTML
,SVG
,XHTML
, анализируется для созданияDOM
Дерево. -
CSS
Разбор генерацииCSS
дерево правил. -
JavaScript
работатьDOM API
а такжеCSSOM API
, сгенерироватьDOM Tree
а такжеCSSOM API
.
После того, как синтаксический анализ завершится, браузер передаст проанализированныйDOM Tree
а такжеCSS
дерево правил для построенияRendering
Tree
.
-
Rendering Tree
Дерево рендеринга не эквивалентноDOM
дерево, потому что некоторым нравитсяHeader
илиdisplay:none
Нет необходимости помещать вещи в дерево рендеринга. -
CSS
изRule Tree
В основном, чтобы завершить матч и положитьCSS Rule
ДобавлятьRendering
. -
Tree
на каждомElement
. то естьDOM
узел, то естьFrame
. Затем рассчитать каждыйFrame
(то есть каждыйElement
) положение, которое также называютlayout
а такжеreflow
Обработать. -
Наконец, вызвав операционную систему
Native GUI
изAPI
рисовать.
Браузерный рендеринг для разных ядер
Картинка вышеwebkit
Процесс рендеринга ядра аналогичен общему процессу рендеринга.HTML
изDOM Tree
,а такжеCSS
дерево правил, а затем объединить для созданияRender Tree
, окончательный рендер.
ЭтоMozilla
изGecko
движок рендеринга.В целом процесс рендеринга аналогичен, за исключением того, что дерево рендеринга создается или
Frame
Когда дело доходит до деревьев, эти два названия несовместимы.webkit
назови этоLayout
,Gecko
называетсяReflow
.
порядок рендеринга
- Когда браузер получает веб-страницу, он сначала анализирует ее.
HTML
, если вы столкнулись с внешней цепочкойcss
, буду скачиватьcss
, при разбореHTML
. - когда
css
После завершения загрузки он продолжит синтаксический анализcss
, сгенерироватьcss Rules tree
, не повлияетHTML
анализ. - при встрече
<script>
этикетка, один раз параjavascript
, скрипт будет скачан сразу, при этом парсинг документа будет заблокирован.После выполнения скрипта начнется парсинг документа.
- когда
DOM
Дерево иCSS
После построения дерева правил постройтеRendering Tree
. - Вызов системы для отображения страницы.
Что вызовет перекомпоновку и перерисовку.
переставлятьЗначит, изменилась геометрия компонента, нужно перепроверить и рассчитатьRender Tree
. даRender Tree
часть или все это изменилось. ЭтоReflow
, илиLayout
.
переставлятьиз-за перерасчетаRender Tree
, и каждыйDOM Tree
Имеетсяreflow
метод, как только узел возникаетпереставлять, это может привести к тому, что дочерние элементы и родительские элементы или даже другие элементы на том же уровнеreflow
, тратя много времени на повторную проверкуRender Tree
.
следовательно,переставлятьстоит больше, чемперерисоватьнамного выше.
Следующие действия приведут кпереставлятьилиперерисовать.
- удалить, добавить или изменить
DOM
узел элемента. - переехать
DOM
положение, когда анимация включена. - Исправлять
CSS
стиль, при изменении размера, положения элемента или будет использоватьdisplay:none
, вызоветпереставлять;ИсправлятьCSS
цвет илиvisibility:hidden
Подожди, это вызоветперерисовать. - При изменении шрифта по умолчанию веб-страницы.
- При изменении размера окна (в мобильном терминале такой проблемы нет) или при его прокрутке.
- Содержимое меняется (пользователь также пишет содержимое в поле ввода).
- Активируйте псевдоклассы, такие как :hover.
- рассчитать
offsetWidth
а такжеoffsetHeight
.
Если текущая веб-страница содержит анимацию или веб-страница с фиксированными элементами, это также произойдет из-за прокрутки.переставлять, как только происходит прокрутка, текущий браузер испытывает большую нагрузку, что приводит к зависанию веб-страницы, пропаданию кадров и т. д.
var bstyle = document.body.style; // cache
bstyle.padding = "20px"; // reflow, repaint
bstyle.border = "10px solid red"; // 再一次的 reflow 和 repaint
bstyle.color = "blue"; // repaint
bstyle.backgroundColor = "#fad"; // repaint
bstyle.fontSize = "2em"; // reflow, repaint
// new DOM element - reflow, repaint
document.body.appendChild(document.createTextNode('dude!'));
Приведенная выше логика, почти каждый шаг вызоветпереставлятьилиперерисовать, если браузеры обрабатывают это так, возможно, современные браузеры не такие плавные, как те, которые мы используем.
Итак, в браузере есть механизм, которыйпереставлятьилиперерисоватьсначала накапливаются, а потом выполняются все сразупереставлятьа такжеперерисовать.
Конечно, не все случаи так обрабатываются браузерами, напримерresize
Или измените шрифт по умолчанию, для этих операций браузер сразупереставлять.
Итак, мы слушаемresize
события, которые мы обычно делаемСтабилизатора такжедросселирование.
Как уменьшить перекомпоновку и перерисовку
- попытайся избежать
style
использовать для операций, требующихDOM
узел элемента, переименованныйclassName
,ИзменятьclassName
имя. - Если вы добавляете элементы или
clone
элемент, вы можете сначала передать элемент черезdocumentFragment
Поместите его в память, и после завершения операции, затемappendChild
прибытьDOM
в элементе. - Не получайте один и тот же элемент часто.Получив элемент в первый раз, сохраните его в переменной, чтобы сократить время обхода.
- использовать как можно меньше
dispaly:none
,можно использоватьvisibility:hidden
заменять,dispaly:none
вызоветпереставлять,visibility:hidden
вызоветперерисовать. - Не используйте
Table
Макет, потому что небольшая операция может привести к тому, что вся таблицапереставлятьилиперерисовать. - использовать
resize
событие, сделатьСтабилизатора такжедросселированиеиметь дело с. - Используйте с анимированными элементами
absolute / fixed
Атрибуты. - При пакетном изменении элементов можно сначала удалить элементы из потока документов, а затем поместить их в поток документов после завершения изменения.
наконец
Справочная статья:
Введение в принципы браузерного рендеринга.
Оптимизация производительности переднего плана при перестановке и перерисовке.