Блокирует ли CSS парсинг HTML

Ответ

Да, CSS может блокировать парсинг HTML, но только в определённых случаях.

  1. Синхронные CSS (<link rel="stylesheet"> в <head> без media или onload): браузер приостанавливает рендеринг, пока не загрузится и не обработается CSS. Это связано с тем, что CSS может влиять на layout.

  2. CSS в <body>: если стили вставлены до контента, браузер может приостановить парсинг HTML для их обработки.

Пример блокирующего CSS:

<head>
  <link rel="stylesheet" href="styles.css"> <!-- Блокирует рендеринг -->
</head>

Оптимизация:

  • Используйте media-атрибуты для нефункциональных стилей (media="print").
  • Добавляйте rel="preload" для критического CSS.
  • Размещайте неважные стили в конце <body> или загружайте асинхронно.

Ответ 18+ 🔞

А, ну ты про это, про CSS, который может HTML-парсинг тормозить. Да, бывает такое, ёпта, как же без этого.

Смотри, в общем, если ты в <head> воткнёшь обычную ссылку на стили, типа <link rel="stylesheet" href="styles.css">, то браузер такой: "Стоп, мужик, погоди-ка". И будет он жрать этот CSS, пока весь не проглотит и не переварит, прежде чем дальше страницу рендерить начнёт. А всё почему? Потому что стили — это, блядь, святое! Они на layout влияют, на отступы, на размеры. Представь, он уже что-то нарисовал, а тут бац — приехали стили и всё поехало. Пиздец бардак. Вот он и ждёт, хитрая жопа.

Или вот ещё прикол: если ты эти стили прямо в середину <body> засуньешь, перед каким-нибудь блоком. Браузер опять в ступор впадёт: "Чё за хуйня? Надо сначала понять, как это выглядеть должно, а потом уже дальше читать".

Вот, смотри, как делать НЕ НАДО, если хочешь, чтобы всё быстро грузилось:

<head>
  <link rel="stylesheet" href="styles.css"> <!-- Вот эта хуйня всё и тормознёт -->
</head>

А как быть-то, спросишь? А вот как, ебать мои старые костыли:

  1. Атрибут media — наш друг. У тебя есть стили для принтера? media="print" и вперёд. Браузер посмотрит: "А, это на экран не влияет, похуй", и будет парсить дальше, не заморачиваясь.
  2. rel="preload" для самого главного. Скажи браузеру: "Слушай, вот этот CSS — овердохуища важный, качай его заранее, как только увидел, но не блокируй меня, я пока другим займусь".
  3. Неважное — в конец. Всё, что не нужно для первой отрисовки (шрифты какие-нибудь навороченные, стили для попапов), просто выкидывай в самый низ <body> или грузи асинхронно, когда основное уже отрисовалось.

Короче, вся фишка в том, чтобы не заставлять браузер ждать того, что ему прямо щас не нужно. А то получится как с Герасимом и Муму — пока он там со стилями разбирается, пользователь уже ушёл, накрывшись медным тазом.