Это важно для производительности?

193

Я ненавижу их, это противоречит каскадной природе CSS, и если вы не используете их осторожно, вы в конечном итоге добавляете больше !important.

Но я хочу знать, это плохо для производительности?

РЕДАКТИРОВАТЬ
Из (быстрых) ответов я могу сделать вывод, что это не окажет (существенного) влияния на производительность. Но это приятно знать, даже если это всего лишь дополнительный аргумент для обескураживания других;).

EDIT 2
BoltClock указал, что если есть 2 !importantобъявления, спецификации говорят, что он выберет наиболее конкретную.

janw
источник
7
из любопытства, как вы оцениваете производительность таблицы стилей CSS? лучше рендеринг CSS быстрее или как?
Сяои
4
@ Йоши еще нужно искать другие !importantправила.
Джон Дворжак
1
@janw: Я только что уточнил, что он выбирает самый конкретный ... Я удалил вводящий в заблуждение комментарий.
BoltClock
15
случайная мысль: название было бы намного смешнее, если бы оно гласило: "важно! важно?"
Ник Бугалис
59
я всегда читаю! важно как «не важно»
oɔɯǝɹ

Ответы:

269

Это не должно иметь никакого влияния на производительность на самом деле. Увидев анализатор CSS Firefox в,/source/layout/style/nsCSSDataBlock.cpp#572 и я думаю, что это актуальная процедура, обрабатывающая перезапись правил CSS.

это просто кажется простой проверкой «важности».

  if (aIsImportant) {
    if (!HasImportantBit(aPropID))
      changed = PR_TRUE;
    SetImportantBit(aPropID);
  } else {
    // ...

Также комментарии на source/layout/style/nsCSSDataBlock.h#219

    /**
     * Transfer the state for |aPropID| (which may be a shorthand)
     * from |aFromBlock| to this block.  The property being transferred
     * is !important if |aIsImportant| is true, and should replace an
     * existing !important property regardless of its own importance
     * if |aOverrideImportant| is true.
     * 
     * ...
     */

  1. Firefox использует анализатор сверху вниз, написанный вручную. В обоих случаях каждый файл CSS анализируется в объекте StyleSheet, каждый объект содержит правила CSS.

  2. Затем Firefox создает деревья контекста стиля, которые содержат конечные значения (после применения всех правил в правильном порядке)

CSS Parser Firefox

От: http://taligarsiel.com/Projects/howbrowserswork1.htm#CSS_parsing

Теперь вы можете легко увидеть, что в случае описанной выше объектной модели синтаксический анализатор может легко пометить правила, на которые влияют !important, без особых затрат. Ухудшение производительности не является хорошим аргументом против !important.

Тем не менее, ремонтопригодность требует успеха (как уже упоминалось в других ответах), что может быть вашим единственным аргументом против них.

Анирудх Раманатан
источник
87
Мне нравится, что вы единственный, кто потрудился проверить, а не предположить. Отличная работа, сэр!
Moox
Кстати, эта объектная модель не DOM ... это CSSOM. На всякий случай, если кому-то интересно.
BoltClock
5
Это должно быть ответом. Мне стыдно, что мой ответ в два раза больше, чем ваш. О, дорогой, дорогой. Кто-то отдаст этому человеку должное, где он должен!
Майкл Джованни Пумо
3
Этот пост посвящен анализу, и я ожидаю, что влияние на производительность будет нулевым. Парсеры быстрые. Вопрос в том, что происходит во время рендеринга, когда браузер ищет объявления CSS, соответствующие определенному элементу? Является ли общий случай, когда нет !importantправил, специально оптимизированных? Я так не думаю, но в этом трудно быть уверенным; директория layout / style в Firefox - это 80000 строк кода.
Джейсон Орендорфф
1
Ваши усилия, чтобы проверить точный источник и поделиться этим высоким уровнем знаний, просто экстраординарны и удивительны. Именно такие люди, как вы, делают StackOverflow таким популярным и надежным. Большое спасибо за ответ и обмен этим.
Anmol Saraf
113

Я не думаю, что !importantэто изначально плохо с точки зрения того, насколько быстро браузер соответствует правилам (он не является частью селектора, а только частью объявления)

Однако, как уже было сказано, это снизит удобство сопровождения вашего кода и, следовательно, может привести к неоправданному увеличению его размера из-за будущих изменений. Использование !importantтакже может снизить производительность разработчика.

Если вы действительно требовательны, вы также можете сказать, что !importantдобавляет 11 дополнительных байтов к вашему CSS-файлу, это не так уж и много, но я думаю, если у вас !importantв таблице стилей достаточно много, это может сложиться.

Только мои мысли, к сожалению, я не смог найти никаких ориентиров относительно того, как это !importantможет повлиять на производительность.

Шон
источник
56
«11 дополнительных байтов» дают или берут несколько байтов для необязательного пробела, о боже, пробел
BoltClock
11
Я знаю ... Я просто высмеиваю, насколько чрезвычайно придирчивые люди получают, когда дело доходит до производительности, поднимая эту проницательность на следующий уровень.
BoltClock
11
если вы действительно требовательны, дополнительная специфика, необходимая для правильной работы, часто превышает 11 байтов.
BlakeGru
10
@DisgruntledGoat: рассудительный человек поймет, что теряются не байты, а секунды, минуты, часы, дни и нейроны. (Почему я все еще здесь?)
BoltClock
59

!importantимеет свое место. Доверься мне в этом. Это спасло меня много раз и часто более полезно в качестве краткосрочного решения, прежде чем можно будет найти более длинный и изящный метод решения вашей проблемы.

Однако, как и большинство вещей, им злоупотребляют, но нет необходимости беспокоиться о «производительности». Могу поспорить, что один маленький GIF размером 1x1 имеет больший прирост производительности на веб-странице, чем!

Если вы хотите оптимизировать свои страницы, есть еще много важных маршрутов;);)

Майкл Джованни Пумо
источник
8
Это был просто забавный финал, давайте улыбнемся и просто ... расслабимся!
Майкл Джованни Пумо
12
Какой осел? Я должен знать!
Оскар Броман
1
@ Оскар Броман Я думаю, что он имеет в виду :) :) выглядит как особая часть анатомии человека, которая имеет общее имя с другим именем для осла на английском языке. «Осел или осел» - это начало статьи в Википедии о попке, простите, осле. Я полагаю, что г-н Ян Дворак и два его старшеклассника относятся к тем людям, которые оскорблены буквально каждым словом (или смайликом), которое даже отдаленно (или в данном случае воображаемое) оскорбительно. Тем не менее, говорить «осел», когда вы имеете в виду задницу, довольно глупо и невежливо, так как мало кто не говорит по-английски.
Димитар Славчев
7
@DimitarSlavchev Ян не говорил о смайлике. Смотрите первоначальную версию поста Майкла (редакция 2).
andytuba
5
@andytuba tbh, это лишает законной силы аргумент Димитара, но не его точку зрения :) :)
Grimace of Despair
31

За кулисами происходит то, что, когда ваш CSS обрабатывается, браузер читает его, встречает !importantатрибут, и браузер возвращается, чтобы применить стили, определенные !important. Этот дополнительный процесс может показаться небольшим дополнительным шагом, но если вы обслуживаете много запросов, то вы снизите производительность. (Источник)

Использование! Важное в вашем CSS обычно означает, что разработчик самовлюблен, эгоистичен или ленив. Уважайте разработчиков, чтобы прийти ...

Мышление разработчика при использовании !important:

  1. Мой качающий CSS не работает ... grrrr.
  2. Что мне теперь делать??
  3. А потом !importantда .... теперь работает нормально.

Однако использовать его не очень хорошо !importantтолько потому, что мы плохо справились с CSS. Это создает много проблем проектирования - которые хуже, чем проблемы производительности - но также заставляет нас использовать много дополнительных строк кода, так как мы переопределяем другие свойства, !importantи наш CSS становится загроможденным бесполезным кодом. Вместо этого мы должны сначала очень хорошо управлять CSS, и не позволять свойствам перекрывать друг друга.

Мы можем использовать !important. Но используйте его экономно и только тогда, когда другого выхода нет.

введите описание изображения здесь

NullPoiиteя
источник
Какой метод лучше? Специфичность в css для гарантии того, что элемент применяется, его правильные стили (что может означать громадный оператор css; например, #news .article .article-title h3 a {}) или просто добавление важного тега?
Деннис Мартинес
1
@DennisMartinez было бы лучше сделать класс для заголовка и просто добавить это ..
NullPoiиteя
Нет, просто ленивый. Получить палку. Ударить.
Эрик Реппен
1
Я не думаю, что casperOne удалил изображения только потому, что они медленно загружались ...
BoltClock
13

Я согласен с вами не использовать его, потому что это плохая практика, независимо от производительности. На этих основаниях я бы избегал использования !importantвезде, где это возможно.

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

Если он достаточно важен, чтобы его можно было заметить, то в вашем коде, скорее всего, есть большие проблемы, чем просто !important. Простое использование обычного синтаксического элемента основных языков, которые вы используете, никогда не будет проблемой производительности.

Позвольте мне ответить на ваш вопрос ответным вопросом в ответ; угол, который вы, вероятно, не рассматривали: какой браузер вы имеете в виду

Каждый браузер, очевидно, имеет свой собственный движок рендеринга со своими оптимизациями. Теперь возникает вопрос: каковы последствия для производительности в каждом браузере? Возможно, !importantплохо работает в одном браузере, но действительно хорошо в другом? И, возможно, в следующих версиях все будет наоборот?

Я предполагаю, что моя точка зрения заключается в том, что мы, как веб-разработчики, не должны думать (или должны думать) о влиянии на производительность отдельных синтаксических конструкций языков, которые мы используем. Мы должны использовать эти синтаксические конструкции, потому что они являются правильным способом достижения того, что мы хотим сделать, а не из-за того, как они работают.

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

SDC
источник
Хорошая аргументация. Я знаю, что оптимизировать не стоит, но мне просто любопытно.
janw
7

Это заметно не влияет на производительность. Это, однако, снижает удобство сопровождения вашего кода и, следовательно, может ухудшить производительность в долгосрочной перспективе.

Хенрик
источник
2
@ Джан Дворжак, в чем твоя проблема?
Enve
@BoltClock Я ссылаюсь на первое предложение.
Джон Дворжак
4
@ Enve моя проблема в том, что я хотел бы видеть эталон, а не априорные предположения, представленные как факты. Я не знаю, кто этот.
Джон Дворжак
Я бы сказал, что тот факт, что он усложняет поддержку вашего кода, должен быть достаточным аргументом, чтобы не использовать его. Я никогда не испытывал снижения производительности, даже по сравнению с другими незначительными улучшениями производительности, такими как использование идентификатора вместо селекторов CLASS.
Хенрик
7

Раньше !importantмне приходилось использовать несколько раз, и я лично не заметил заметного снижения производительности при его использовании.

В качестве примечания см. Ответ на этот вопрос стека по причине, которую вы, возможно, захотите использовать !important.

Также я упомяну кое-что, что все остальные не упомянули. !importantэто единственный способ переопределить встроенную CSS, за исключением написания функции JavaScript (которая повлияет на вашу производительность, хотя бы чуть-чуть). Так что это может сэкономить вам некоторое время, если вам нужно переопределить встроенный CSS.

Райан
источник
6

хм ... важно или !! важно?

Давайте пройдем этот шаг за шагом:

  1. Парсер должен проверять наличие важного для каждого свойства независимо от того, используете вы его или нет - поэтому разница в производительности здесь равна 0
  2. При перезаписи свойства парсер должен проверить, важно ли перезаписываемое свойство! Важно или нет - поэтому разница в производительности здесь снова равна 0
  3. Если перезаписываемое свойство является !! важно, оно должно перезаписать свойство - снижение производительности равно -1, если не используется! Важный
  4. Если перезаписываемое свойство имеет значение! Важный, оно пропускает перезапись свойства - повышение производительности на +1 для использования!
  5. Если новое свойство является! Важным, анализ должен перезаписать его независимо от того, перезаписывается ли свойство! Важно или !! важно - разница в производительности снова 0

Так что, я думаю, вы хотите, чтобы!

и как @ryan упоминает ниже, единственный способ переопределить встроенный CSS и избегать использования JavaScript ... так что еще один способ избежать ненужного снижения производительности

хм ... оказывается, что важно важно

а также,

  • Использование! важный экономит много времени для разработчика
  • иногда спасает вас от перепроектирования всего CSS
  • иногда HTML или родительский файл CSS не находится под вашим контролем, поэтому он спасает вашу жизнь там
  • очевидно препятствует тому, чтобы важные элементы были случайно перезаписаны другими важными элементами
  • и иногда браузеры просто не выбирают правильные свойства, не будучи слишком специфичными в селекторах, поэтому использование! важный действительно становится важным и избавляет вас от написания тонны определенных селекторов CSS в вашем CSS. поэтому, я думаю, даже если вы используете больше байтов для записи! Важно, это может сэкономить ваши байты в других местах. и мы все знаем, что селекторы CSS могут запутаться.

Так что, думаю, использование! Важный может сделать разработчиков счастливыми, и я думаю, что это очень важно : D

xtrahelp.com
источник
1
«Так что, я думаю, важный действительно имеет лучшую производительность, так как он может помочь парсеру пропустить многие свойства, которые он не пропустит иначе». Это утверждение немедленно аннулируется, если у вас есть несколько !importantобъявлений. Браузер должен будет проверить их все. Итак, вернемся к шагу 1, правда.
BoltClock
1
@BoltClock анализатор должен проверять свойство независимо от того, сколько раз вы его используете ... поэтому, если у вас есть 10 свойств, анализатор должен выполнить эту проверку 10 раз, независимо от того, важны ли эти свойства! Или нет. так что если у вас есть 10 важных свойств, анализатор делает проверку 10 раз, а если у вас 10 важных свойств, анализатор все равно делает проверку 10 раз ... имеет смысл?
xtrahelp.com
Все еще не уверены, важно ли повышение производительности или нет, на самом деле ... но я полностью наслаждаюсь всеми комментариями и обсуждениями. Мои знания делают следующие шаги вперед. StackOverflow просто потрясающий: D
Anmol Saraf
4

Я не могу предвидеть !importantпрепятствие производительности, по сути, по сути. Если, однако, ваш CSS пронизан !important, это означает, что вы перевыполнили селекторы и слишком конкретны, и у вас закончились родители или квалификаторы, чтобы добавить специфичность. Следовательно, ваш CSS будет становиться раздутой (что будет препятствовать производительности) и трудно поддерживать.

Важный мем правила CSS

Если вы хотите , чтобы написать эффективный CSS , то вы хотите быть только в качестве конкретного , как вы должны быть , и написать модульный CSS . Рекомендуется воздерживаться от использования идентификаторов (с хэшами), цепочек селекторов или квалифицированных селекторов.

Идентификаторы с префиксом #в CSS очень специфичны, так что 255 классов не будут переопределять идентификатор (fiddle by: @Faust ). У ID тоже есть проблема с более глубокой маршрутизацией, они должны быть уникальными, это означает, что вы не можете повторно использовать их для дублирующих стилей, поэтому вы в конечном итоге пишете линейный CSS с повторяющимися стилями. Последствия этого будут варьироваться от проекта к проекту, в зависимости от масштаба, но ремонтопригодность сильно пострадает, а в крайних случаях - и производительность.

Как вы можете добавить специфичность без !important, цепочки, квалификации или идентификаторов (а именно #)

HTML

<div class="eg1-foo">
    <p class="eg1-bar">foobar</p>
</div>
<div id="eg2-foo">
    <p id="eg2-bar">foobar</p>
</div>
<div class="eg3-foo">
    <p class="eg3-foo">foobar</p>
</div>

CSS

.eg1-foo {
    color: blue;
}
.eg1-bar {
    color: red;
}
[id='eg2-foo'] {
    color: blue;
}
[id='eg2-bar'] {
    color: red;
}
.eg3-foo {
    color: blue;
}
.eg3-foo.eg3-foo {
    color: red;
}

JSFiddle

Хорошо, так как это работает?

Первый и второй примеры работают одинаково, первый буквально является классом, а второй - селектором атрибутов. Селекторы классов и атрибутов имеют одинаковую специфику. .eg1/2-barне наследует свой цвет, .eg1/2-fooпотому что у него есть собственное правило.

Третий пример выглядит как квалификатор или цепочка селекторов, но это не так. Цепочка - это когда вы добавляете префиксы к родителям, предкам и т. Д .; это добавляет специфичности. Квалификация похожа, но вы определяете элемент, к которому применяется селектор. квалификация: ul.classи цепочка:ul .class

Я не уверен, что вы бы назвали эту технику, но поведение является преднамеренным и задокументировано W3C

Повторные вхождения одного и того же простого селектора допускаются и повышают специфичность.

Что происходит, когда специфика между двумя правилами идентична?

Как указал @BoltClock , если существует несколько! Важных объявлений, то спецификация диктует, что наиболее конкретное должно иметь приоритет.

В приведенном ниже примере, как .fooи .barимеют одинаковую специфичность, поэтому поведение fallsback к каскадным природе CSS, в результате чего последнее правило , объявленной в CSS претензий очередностью т.е. .foo.

HTML

<div>
    <p class="foo bar">foobar</p>
</div>

CSS

.bar {
    color: blue !important;
}
.foo {
    color: red !important;
}

JSFiddle

Джек Так
источник