Первое и самое важное, что нужно понять, это то, что браузеры не могут начать рисовать страницу, пока не будет загружен весь CSS. (Имейте в виду, спецификация W3C гласит, что CSS-ссылки разрешены только в голове, поэтому, когда вы начнете ссылаться на таблицы стилей в теге body, как вы это делали, разные браузеры будут обрабатывать эту ситуацию по-разному.)
Теперь веб-страница читается как поток, и правила CSS применяются к элементам HTML по мере их поступления на страницу. Чтобы процитировать статью Google по ссылке ниже:
По мере того, как браузер анализирует HTML, он создает внутреннее дерево документов, представляющее все отображаемые элементы. Затем он сопоставляет элементы стилям, указанным в различных таблицах стилей, в соответствии со стандартным CSS-каскадом, наследованием и правилами упорядочения.
Итак, теперь ответьте на ваши вопросы:
Применяет ли оно каждое правило одно за другим, когда оно анализирует таблицу стилей и постепенно отображает результат? Или содержимое файла CSS полностью загружено, затем полностью оценено и затем применено к HTML сразу? Или что-то еще?
Загружает весь CSS, затем начинает рисовать документ сверху вниз.
Тестируя в Firefox 5, я ожидал сначала увидеть зеленый, а потом - красный. Этого не случилось Я попытался с двумя отдельными таблицами стилей с противоречивыми правилами и получил те же результаты.
Это потому, что сначала загружаются все CSS, а затем, когда он столкнулся с вашим элементом, он применил только красный стиль из-за того, как работает каскад.
После многих комбинаций единственный способ заставить его работать - это встроенный блок <style>
в <head>
, с конфликтующими правилами из <link>
в <body>
Хотя я не могу точно сказать, почему это произошло, я думаю, что браузер не искал CSS в теге body, начал рисовать, встретил CSS тела, затем перекрасил.
CSS каким-либо образом влияет на перерисовку?
Честно говоря, я бы больше беспокоился о том, что JS вызвал перекрашивание. Но если у вас очень большой DOM, имеет смысл структурировать ваш CSS таким образом, чтобы вы не вызывали рефлоки из-за странного позиционирования. @Matt дал вам несколько хороших ссылок на эту тему
Некоторые хорошие ресурсы:
http://www.dayofjs.com/videos/22158462/web-browsers_alex-russel
Алекс Рассел подробно рассказывает о том, как webkit анализирует CSS, как работает перекомпоновка и перерисовка и что их вызывает.
http://code.google.com/speed/page-speed/docs/rendering.html
Это основная статья о том, как оптимизировать CSS-рендеринг