Оптимизация CSS для ускорения обработки браузерами

Оптимизация CSS для ускорения обработки браузерами

Всем привет.

Сегодня хочу поговорить о том, как браузеры обрабатывают правила CSS и как писать эти самые правила так, чтобы страница рендерилась быстрее.

Наверное, самый яркий пример тормозов, которые может вызвать CSS, это когда страница «дергается» при прокрутке в Ослике — это обычно связано с использованием :hover не у элементов <a>.

Итак, в связи с всеобщей тягой к ускорению веба, многие монстры интернета начали писать статьи и притворять в жизнь описываемые приемы. У Гугла есть статья про оптимизацию рендеринга в браузерах, у Мозиллы — про написание эффективного CSS. Я же хочу сделать «выжимку» из них ;-)

Как браузер обрабатывает стили

Ключевой момент — браузер читает правила справа налево. Мы же с вами пишем их слева на право. Чтобы почувствовать разницу, рассмотрим простой пример:

#global-wrapper ul.companies li a span { ... }

Браузер делаем следующее: сначала он находит все элементы <span>, затем берет те из них, что содержатся внутри <a>, потом внутри <li> и так далее. Соответственно, процесс обработки такого правила довольно долгий.

Основные типы селекторов и их эффективность

Существует четыре основных типа селекторов, на которых основаны все остальные. Ниже они представлены в порядке уменьшения их эффективности с точки зрения скорости обработки:

#global-wrapper   { ... } /* по id элемента — самый эффективный */
.partners { ... } /* по классу */
ul { ... } /* по тегу */
*, [rel=external] { ... } /* универсальный — самый медленный */

Как видите, любые другие правила можно составить на основе этих четырех. Принимая во внимание способ обработки стилей браузером и эффективность основных типов легко понять принцип ускорения.

Советы по написанию селекторов

Избегайте универсальных селекторов

Делайте так, чтобы элементы наследовали стили от родителей или используйте классы для применения стилей к разным элементам.

Избегайте лишних селекторов

Не используйте без нужды теги при селекторе по id или классу:

div#global-wrapper   { ... } /* Плохо */
#global-wrapper { ... } /* Хорошо */
... li.categories { ... } /* Плохо */
.categories { ... } /* Хорошо */

Излишняя вложенность селекторов так же нежелательна:

#company-profile ul li { ... } /* Плохо (ul лишний, так как li может содержаться только внутри ul) */
#company-profile li { ... } /* Хорошо */
Используйте class и id — самые быстрые селекторы

По возможности старайтесь использовать в ваших правилах селекторы по id или классам — они самые эффективные.

Используйте :hover только для ссылок в IE7 и IE8

Если вам нужно указать поведение элемента при наведении, используйте JavaScript.

Не используйте expression

Экспрешены работают только в IE 5-7, но при этом замедляют рендеринг страниц. Вместо них можно использовать JavaScript.

Дополнительные материалы

Рекомендую ознакомиться с оригинальными статьями от Гугла и Мозиллы:

Еще есть небольшая заметка от Яндекса по поводу верстки новой страницы результатов поиска. Метод основан на указанных выше статьях.

Расскажите друзьям

Оцените статью:
  • 1
  • 2
  • 3
  • 4
  • 5

Комментарии — 39

intero
Спасибо! Полезное напоминание пройденного материала!
vasa_c
Так что, теперь ID писать в конце списка селекторов?
Snegurka
"Используйте :hover только для ссылок в IE7 и IE8" - можете подробнее расписать почему?
Evgenij
Нашел еще другую информацию:
"Internet Explorer 7 and later, in standards-compliant mode (strict !DOCTYPE), can apply the :hover pseudo-class to any element, not merely links."
Там была еще ссылка на источник из MSDN, но нерабочая. Как и основная часть ссылок на MSDN.
seelts
Неплохо было бы ещё указать ссылку на оригинал.
#
seelts
Nick
>> браузер читает правила справа налево
Откуда эта информация? Просто предположение? Думаю там алгоритмы поиска по ДОМ не такие уж и тупые как может показаться.
Конечно я согласен с тем, что длинные селекторы обрабатываются медленнее, но зачем же так заморачиваться?
Вот если бы речь была о селекторах jQuery - это было бы куда актуальнее!
Nick
>> Если вам нужно указать поведение элемента при наведении, используйте JavaScript.

По-моему полная глупость!
Ну не может JS работать быстрее заточенных как раз под конкретные нужды вещей и еще скомпилированных в битовый код. Это вы про какие-то конкретные браузеры говорите?

Люди! Не пользуйтесь затычками, от них проблем всегда больше чем пользы! Используйте вещи по прямому назначению! Если они и в правду где-то работают медленнее, то это временные баги и они будут исправляться и ускорятся!
Олег
Спасибо!
#
Олег  
diablero13
Nick
>> Откуда эта информация? Просто предположение?
пруф
>> По-моему полная глупость!
А по моему нужно отделять "поведение" от "отображения"
#
diablero13
Zen Similia
Тема интересная, но как мне кажется - не актуальная! Современные браузеры на современных компьютерах при использовании HTML и CSS не тормозят чтобы их ускорять или оптимизировать. Если и появляются тормоза, то при использовании JavaScript. Я думаю надо склоняться к оптимизации размера загружаемых страниц и CSS - вот это актуальнее! А IE он и в африке ИЕ - о нём надо думать в последнюю очередь - что-то не поддерживает - его проблемы и проблемы его юзера!
#
Zen Similia  
Тормощ
Солидарен с Ником.

Ну и пусть старые IE не поймут :hover для произвольных элементов, не так уж страшно. Нужно проектировать сайт так, чтобы даже при отсутствии некоторых способностей браузера сайт оставался доступным и приятным, пусть и без некоторых полезных фишечек.

А навешивать JS на каждый пук - изврат.
Тормоз
Ой, в своём же нике опечатался :) Стыд и срам!
monitoringe
Солидарен с мнениями, что с :hover и IE6 не нужно заморачиваться. Использовать JS во всех браузерах только потому что в IE6 страница будет плохо скроллиться? Глупость — это уже не graceful degradation, а disgusting degradation какой-то
#
monitoringe  
Matt
Спасибо, буду теперь знать. Надо поисправлять свои сайты, чтобы быстрее грузились.
set
li может содержаться только внутри ul
ну что за бред-то? ol идёт лесом, что ли? всегда указываю, для элемента какого именно списка пишу стиль.
#
set
Nick
>>> set
>>> li может содержаться только внутри ul
>>ну что за бред-то? ol идёт лесом, что ли? всегда указываю, для элемента какого именно списка пишу стиль.

Наверное имелось ввиду, что необязательно упопенять ul. :)
Ну то-есть если ol, то не писать ul ol, а стразу ol. Хотя тожешь.. это рекомендации Мозинны. Возможно в других каких-то бразузерах это будет не так.. фиг его занет.

В принципе статья хорошая, но нужно читать с умом, а не тупо следовать инструкциям.
Nick
>>>>>> Если вам нужно указать поведение элемента при наведении, используйте JavaScript.
>>>> По-моему полная глупость!
>>А по моему нужно отделять "поведение" от "отображения"
Извините, но я не чувствую разницы.. Объясните пожалуйста зачем мне навешивать js-есные события на элементы, там где я могу обойтись обычным hover?
Nick
Приношу извинения SET, он был прав по поводу OL>LI
Что-то я завтыкал... :)
http://www.w3schools.com/tags/tag_ol.asp
Romper
Солидарен с Nick-ом.
Что если пользователь отключил javascript (многие так делают для избежания тупых рекламных скриптов). Тогда все ваши hover пойдут лесом...
К тому же - javascript будет замедлять работу браузера несопоставимо больше с плохо работающими этими стилями в ИЕ.
>> ну что за бред-то? ol идёт лесом, что ли? всегда указываю, для элемента какого именно списка пишу стиль.
+1 - li может содержатся как внутри ul, так и внутри ol
ИМХО - выжимка получилась очень скудной.
#
Romper
Ян
спасибо за статью))
все написал понятно)
darya
Статья познавательная и я с удовольствием добавляю ее в закладки!
Дашута
Статейка - зе бест!!! Автор молодец, постарался на славу!
wawilon
>>Современные браузеры на современных компьютерах при использовании HTML и CSS не тормозят чтобы их ускорять или оптимизировать. Если и появляются тормоза, то при использовании JavaScript.

А если оптимизировать и то и другое то работать будет еще быстрее. Не так ли?

>>Ну не может JS работать быстрее заточенных как раз под конкретные нужды вещей и еще скомпилированных в битовый код.

Представьте себе может =) Не знаю слышали вы или нет, но кое какие люди написали флеш плеер на javascript и вот у меня он работает быстрее чем скомпилированный адобовский)))) Хоть я и понимаю всю абсурдность сего факта, но это так. Вот кстати линк: http://www.linux.org.ru/news/opensource/4980402


#
wawilon
Nick
>> Представьте себе может =)
Вообще-то в данном контексте решь ишла о встрояных возможностях самого браузера, а не о флеш-плеере.

И вообще, там реализована только возможность проигрования видео, то-есть это оч оч громно сказано по поводу флеш-плеера. Темболее можно начинать широко использовать как альтернативу флешу - HTML5 и тег Видео, темболее в линукса, где нету ИЕ! Это будет работать точно лучше чем самоточеные затычки...

Еще было бы интересно протестить этого зверя на винде. Просто в линуктсе часто вечно какие-то глюки лезул с флеш-плеером, и реализации под линукс вечно какие-то недоконца выленаные.

#
Nick
Nickproger
>> А если оптимизировать и то и другое то работать будет еще быстрее. Не так ли?

Оптимизировать безусловно нужно, но не ценой удобства и отказа от прямого предназначения готового функционала (это я о сложных селекторах). И не заменой стандартного функционала затычками. Тем более, как сказал Zen Similia, что этой оптимизации даже никто не заметит.

Можно же с нуля написать свой браузер на ассемблере конкретно заточенный под некий сайт. И даже можно добиться, что он будет работать быстрее чем все остальные. Но кому это надо?
Иван Васильев
Оптимизировать надо не только CSS но и все что движется. Вообще оптимизация любых процесов это такая отличная штука, которую я прям обожаю. Респект автору статьи.
Лёха
Полезная информация... Я как то не задумывался про такое ранее, делал всё по шаблону и стандартно, оказывается коряво делал. Спасибо!
Игроман
Очень полезная статья, спасибо автору.
bulls
Очень полезно, особенно когда со временем что то упускаеш из виду
evgen
спасибо за советы
#
evgen
007.dmrexpress.ru
Оптимизация всему голова, только начинать ее надо сразу, потом переделывать строение и наполнение сайта сложно, проще заново состряпать.
svx
Бесспорно длинные селекторы с большой вложенностью это зло, но иногда оно необходимо, например, когда элемент подпадает под несколько разных стилей, длинный путь помогает прикрепить к нему именно нужный нам.
#
svx
Сергей
еще раз понял, что для понимания такого текст нужно подучится!))
Boris
мы когда делали следующую гадость, выпаливали сообщение о то что вы пользуетесь устаревшей версией ie 6
iLyaS
здрасте хочу спросить верстальщик это же дизайнер, дизайнер рисует но не умеет кодировать а верстальщик как раз таки противоположность ему, и еще пожалуйста посоветуйте как правильно стартануть на css,движок использую wordpress
#
iLyaS
Надежда
Спасибо за рекомендации. Статья - супер!
Ольга
Было интересно почитать, по мне IE лучше вообще закрыли бы, самый корявый браузер.

Новый комментарий

как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть
как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть
counter strike mt2 silkroad pvp metin2 metin2 pvp knight pvp gm olarak başlayan pvpler pvp silkroad pvp serverler counter strike serverler msn show cam show görüntülü sohbet oyunlar suskunlar gazete oku