В вашем вопросе есть некоторая неопределенность: я не уверен, спрашиваете ли вы о HTML resize
событии или как CSS @media
запросы реагируют на изменение размера. Поэтому я буду обращаться к ним отдельно.
HTML * resize
Событие
Это событие, инициируемое window
, нацеленное на window
и может в настоящее время быть услышанным только window
, хотя "[t] здесь - предложение разрешить всем элементам уведомляться об изменениях размера" . Это обычное событие DOM, поэтому внешние Javascripts могут присоединять слушателей к window
и в основном делать все, что хотят. Если вас интересует, как работают события DOM, вам, вероятно, стоит просто прочитать документацию от Mozilla , потому что они работают лучше, чем я когда-либо.
CSS @media
«Реагирование» для изменения размера событий
Обратите внимание, что «Реакция» заключена в кавычки, потому что CSS действительно не волнует, сработало ли какое-либо событие, и оно на самом деле не реагирует. Вы должны прочитать эту отличную статью от Google о том, как работает рендерер страниц в браузерах. Слова не могут сделать эту статью справедливой о том, насколько хорошо она написана, но я постараюсь дать краткое изложение интересующей вас части.
TLDR;
Средство визуализации страниц является эмпирический характер oop, не обусловленный событиями. Он просто использует ту часть CSS, которая ему нужна, когда это необходимо. В случае @media
запросов он просто проверяет, соответствуют ли запросы текущим состояниям во время рендеринга, и применяет их, если они это делают. Затем он делает это снова и снова на следующей итерации.
Чуть точнее:
При загрузке страницы главный поток сначала получает HTML, создает дерево DOM и запрашивает загрузку ресурсы, включая CSS (пропускает сканер с предзагрузкой, поскольку он не имеет отношения к вопросу). Затем он анализирует CSS и вычисляет вычисленный стиль для каждого элемента, прежде чем передать DOM с вычисленным стилем, присоединенным к потоку рендерера. Средство визуализации выполняет компоновку, рисование, составление и отправляет окончательный составной кадр в графический процессор. Вы можете прочитать больше об этих отдельных процедурах в связанной статье Google.
Теперь браузер работает с некоторой частотой кадров, обычно 60. Таким образом, средство визуализации должно выдавать sh 60 составных кадров в GPU каждую секунду. Очевидно, что глупо пересчитывать все это для каждого кадра, поэтому весь процесс кэшируется на каждом этапе. Если между двумя кадрами ничего не произошло, то средство визуализации просто выталкивает последний вычисленный кадр. Если какое-то событие произошло между двумя кадрами, то браузер пытается обновить кадр с минимально возможной работой. Например, если вы вводите что-то в текстовое поле, нет необходимости пересчитывать вычисленный стиль.
Если событие, подобное resize
, сработало в течение интервала между двумя кадрами, однако, вычисленный пересчет стиля необходим , Таким образом, основной поток просто читает CSS и игнорирует запросы @media
, которые не соответствуют состояниям для текущего кадра. Затем он вычисляет новый вычисленный стиль и передает его рендереру. Отрисовщик делает свою работу оттуда.
Очевидно, я упускаю из виду многие детали оптимизации производительности, которые существуют во всех современных браузерах, но вот суть всего процесса. Снова go прочитайте статью Google. Все объясняется очень четко (с иллюстрациями тоже!).