Чи важливо погано для продуктивності?


193

Я ненавиджу їх, він протистоїть каскадному характеру CSS, і якщо ви не використовуєте їх обережно, ви опиняєтесь у циклі додавання більше !important.

Але я хочу знати, чи погані вони для продуктивності?

EDIT
З (швидких) відповідей я можу зробити висновок, що це не матиме (істотного) впливу на продуктивність. Але це приємно знати, навіть якщо це просто як додатковий аргумент для відлякування інших;).

EDIT 2
BoltClock зазначив, що якщо є 2 !importantдекларації, специфікація говорить, що вона вибере найбільш конкретну.


7
з цікавості, як ви оцінюєте ефективність таблиці стилів CSS? краще CSS візуалізувати швидше чи щось?
xiaoyi

4
@Yoshi йому ще потрібно шукати інші !importantправила.
Джон Дворак

1
@janw: Я щойно уточнив, що він вибирає найбільш конкретний ... Я видалив оманливий коментар.
BoltClock

15
випадкове подумав: назва була б набагато смішніше , якщо він прочитав: «Дуже важливо важливо !?»
Nik Bougalis

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
Мені подобається, що ти єдиний, хто турбує перевірку, а не припускати. Чудова робота, сер!
Мукс

Ця модель об'єкта не є DOM, до речі ... це CSSOM. На всякий випадок, коли хтось цікавиться.
BoltClock

5
Це має бути відповіддю. Мені соромно, що моя відповідь подвоїла бали як ваша. О, дорогий о дорогий. Хтось надає цій людині кредит там, де належить!
Майкл Джованні Пумо

3
Ця публікація стосується синтаксичного розбору, і я би очікував, що вплив на продуктивність там буде нульовим. Парсери швидкі. Питання в тому, а як бути під час візуалізації, коли браузер здійснює пошук декларацій CSS, що відповідають певному елементу? Чи є загальним випадком, коли немає !importantправил, спеціально оптимізованих? Я так не думаю, але важко бути впевненим; каталог / макет / стиль у Firefox - це 80 000 рядків коду.
Джейсон Орендорф

1
Ваші зусилля щодо перевірки точного джерела та обміну цим високим рівнем знань просто надзвичайні та дивовижні. Такі люди, як ти, - це той, хто робить StackOverflow таким популярним і довірливим. Дуже дякую, що відповіли та поділилися цим.
Анмол Сараф

113

Я не думаю, що !important це по суті погано з точки зору того, наскільки швидко браузер відповідає правилам (він не є частиною селектора, лише частиною декларації)

Однак, як уже було зазначено, це призведе до зменшення ремонтопридатності вашого коду, а отже, ймовірно, він спричинить непотрібне збільшення його розміру через майбутні зміни. Використання!important також, ймовірно, знизить продуктивність розробника.

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

Тільки мої думки, на жаль, я не зміг знайти жодних орієнтирів щодо того, як це !importantмогло б вплинути на продуктивність.


56
"11 зайвих байтів" дайте або візьміть кілька байт за необов'язковий пробіл о боже пробіл
BoltClock

11
Я знаю ... Я просто висміюю, як надзвичайно прискіпливі люди отримують, коли справа доходить до виступу, переносячи цю прискіпливість на наступний рівень.
BoltClock

11
якщо ви справді вибагливі, додаткова специфіка, необхідна для правильного виконання, часто набагато перевищує 11 байт.
BlakeGru


10
@DisgruntledGoat: Людина на рівні з головою зрозуміє, що не витрачаються на байти, а на секунди, хвилини, години, дні та нейрони. (Чому я досі тут?)
BoltClock

59

!importantмає своє місце. Повірте мені це. Це врятувало мене багато разів і часто є більш корисним як короткочасне рішення, перш ніж знайти більш довгий і елегантний метод вашої проблеми.

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

Якщо ви хочете оптимізувати свої сторінки, є ще багато важливих маршрутів;);)


8
Це було лише трохи веселого кінця, давайте всі посміхнемось і просто ... розслабимось!
Майкл Джованні Пумо

12
Який осел? Я мушу знати!
Оскар Броман

1
@Oscar Broman Я думаю, що він означає, що :) :) схожий на певну частину анатомії людини, яка має загальну назву з іншим ім’ям для осла в англійській мові. "Віслюк або осла" - ось початок статті у вікіпедії про дупу, пробачення, осла. Я припускаю, що пан Ян Дворак та два наглядачі є серед людей, які ображаються буквально на кожне слово (або смайлик), яке навіть віддалено (або в цьому випадку уявне) образливе. Однак говорити віслюка, коли ти маєш на увазі дупу, досить дурне і недобросовісне, оскільки мало хто, хто не говорить англійською мовою, зрозумів би це.
Димитар Славчев

7
@DimitarSlavchev Ян не говорив про смайлик. Дивіться початкову версію посту Майкла (редакція 2).
andytuba

5
@andytuba tbh, це визнає недійсним аргумент Димитсара, але не його суть :) :)
Гримаса відчаю

31

Тут відбувається за лаштунками, що під час обробки вашого CSS браузер читає його, зустрічається з !importantатрибутом, і браузер повертається назад, щоб застосувати стилі, визначені !important. Цей додатковий процес може здатися невеликим додатковим кроком, але якщо ви подаєте багато запитів, тоді ви отримаєте хіт у виконанні. (Джерело)

Використання! Важливого у вашому CSS зазвичай означає, що нарцисистський розробник & егоїстичний чи ледачий. Поважай чортів, що прийшли ...

Мислення розробника при використанні !important:

  1. Моя гойдалка CSS не працює ... grrrr.
  2. Що мені робити зараз ??
  3. І тоді !importantтак .... зараз це працює добре.

Однак це не дуже вдалий підхід для використання !importantлише тому, що ми не дуже добре керували CSS. Це створює безліч проблем із дизайном - які гірші, ніж проблеми з продуктивністю - але це також змушує нас використовувати багато зайвих рядків коду, оскільки ми перекриваємо інші властивості, !importantі наш CSS переповнюється непотрібним кодом. Що ми повинні зробити замість цього - спочатку дуже добре керувати CSS, і не дозволяти властивостям переважати один одного.

Ми можемо використовувати !important. Але використовуйте це економно і лише тоді, коли іншого виходу немає.

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


Який спосіб краще? Специфіка в css для забезпечення елемента застосовується саме належними стилями (що може означати величезний оператор css; наприклад, #news .article .article-title h3 a {}) або просто додавання важливого тегу?
Денніс Мартінес

1
@DennisMartinez, краще було б скласти клас за посиланням на заголовок і просто додати це ..
NullPoiитея

Ні, просто ледачий. Станьте палицею. Удар.
Ерік Відкрити

1
Я не думаю, що casperOne видалив зображення лише тому, що вони повільно завантажуються ...
BoltClock

13

Я погоджуюся з вами щодо того, що не використовуєте його, оскільки це погана практика, незалежно від продуктивності. Тільки з цих причин я б уникав використання, !importantде це можливо.

Але щодо питання продуктивності: Ні, це не повинно бути помітно. Це може мати певний ефект, але воно повинно бути таким крихітним, що ви ніколи цього не помічаєте, а також не турбуєтесь про це.

Якщо це досить важливо, щоб бути помітним, то у вас, швидше за все, виникають більші проблеми в коді, ніж просто !important. Просте використання звичайного елемента синтаксису основних мов, якими ви користуєтесь, ніколи не стане проблемою продуктивності.

Дозвольте мені відповісти на ваше запитання натомість запитанням; кут, який ви, мабуть, не враховували: про який браузер ви маєте на увазі?

Кожен браузер, очевидно, має свій механізм візуалізації, з власними оптимізаціями. Отже, тепер стає питання: які наслідки для продуктивності у кожному браузері? Можливо, !importantв одному браузері працює погано, але в іншому добре? І, можливо, у наступних версіях це буде навпаки?

Думаю, моя думка тут полягає в тому, що ми, як веб-розробники, не повинні думати про (або не потрібно думати) про наслідки для продуктивності окремих синтаксичних конструкцій мов, якими ми користуємося. Ми повинні використовувати ці синтаксичні конструкції, оскільки вони є правильним способом досягти того, що ми хочемо робити, не через те, як вони виконують.

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


Приємні міркування. Я знаю, що не варто оптимізувати, але мені просто цікаво.
січня 12

7

Це не помітно впливає на продуктивність. Однак це, однак, знижує ремонтопридатність вашого коду, а тому, ймовірно, знизить продуктивність у довгостроковій перспективі.


2
@Jan Dvorak, у чому твоя проблема?
Enve

@BoltClock Я задумуюсь до першого речення.
Джон Дворак

4
@Enve моя проблема полягає в тому, що я хотів би бачити орієнтир, а не apriori припущення, представлені як факти. Я не знаю, хто це.
Джон Дворак

Я заперечую, що той факт, що ваш код ускладнює підтримку, повинен бути достатнім аргументом, щоб не використовувати його. Я ніколи не відчував погіршення продуктивності, навіть порівняно з іншими незначними підвищеннями продуктивності, такими як використання ID замість селекторів 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 селектори можуть стати безладним.

Тому я думаю, що використання! Важливого може зробити щасливих розробників, і я думаю, що це дуже важливо : D


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 класи не замінять ідентифікатор (скрипка: @Faust ). У ідентифікаторів є проблема з більш глибокою маршрутизацією, вони повинні бути унікальними, це означає, що ви не можете повторно використовувати їх для дублювання стилів, тому ви в кінцевому підсумку пишете лінійний 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мають однакову специфіку, тому поведінка відступає до каскадного характеру CSS, внаслідок чого останнє правило, заявлене в CSS, має перевагу, тобто .foo.

HTML

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

CSS

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

JSFiddle

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.