Подтвердить что ты не робот

Является ли селектор CSS, специфичный для отдельных элементов?

Является ли p.error лучше или хуже, чем .error?

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

4b9b3361

Ответ 1

.error более эффективен, чем p.error.

Чтобы понять, почему это более эффективно, я рекомендую вам прочитать эту статью в трюках css.

Ответ 2

Селектора CSS читаются справа налево. Итак, p.error имеет один дополнительный шаг к .error. Это может привести к меньшему набору или нет - зависит от вашей разметки.

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

Вот отличная статья о селекторах CSS, которая подробно описывает, как они оцениваются: http://css-tricks.com/efficiently-rendering-css/

Ответ 3

нет, это не плохо, но это может не всегда быть необходимым

инструменты, такие как Google PageSpeed ​​и YSlow! обратитесь к этим типам селекторов как к "более квалифицированным", возможно, к тому, что вы слышите "плохую" часть - материал для чтения

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

Однако с именами классов, такими как ваш пример, иногда может быть желательно добавить квалификатор, поскольку вы можете захотеть, чтобы класс был повторно использован для разных типов элементов, но имел разные свойства в зависимости от того, является ли это div или p например, "квалификатор" затем делает селектор немного более конкретным

.error {background: red; margin: 5px;}
p.error {margin: 2px;}

Вышеприведенный код означает, что вы можете использовать класс error для любого элемента и иметь 5px-поля, но если вы установите класс ошибки в элементе p, второй селектор действительно что-то делает, он перебирает первые поля, но все еще получая цвет фона

Таким образом, они выполняют задание, но слишком часто вы видите слишком много людей по поводу квалификации всех своих элементов, когда это не обязательно. Например, если вы только применяете этот класс .error к элементу p, тогда вам не понадобится второй селектор.

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

Ответ 4

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

Во время каскадирования CSS применяются современные браузеры, следующий процесс, который возникает для каждого свойства CSS для каждого элемента веб-страницы:

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

  • Сортировка деклараций по важности и происхождению в следующем порядке (от наименьшего до наивысшего приоритета):

    • таблицы стилей пользовательских агентов (стили браузера по умолчанию)
    • нормальные объявления в листе пользовательского стиля (пользовательская таблица стилей пользователей)
    • нормальные объявления в листе стилей автора (таблицы стилей веб-страниц, внешние, встроенные и встроенные стили)
    • ! важные объявления в листе стилей автора
    • ! важные объявления в таблице стилей пользователя

    Побеждает тот, кто имеет наивысший приоритет. Если более одного имеют одинаковый приоритет, переходите к 3.

  • Сортировка по специфичности селектора. Побеждает тот, у кого самый специфический селектор. Если нет четкого победителя, перейдите к 4.

  • Побеждает тот, который приходит последним в источнике!

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

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

Итак, Вы должны иметь такое специфическое значение, как это имеет смысл.

Ответ 5

Как правило, меньшее количество селекторов, которые браузер должен оценивать, лучше.

p.error не обязательно "хуже", чем .error, если .error используется для нескольких тегов. например div.error (см. нотную заметку внизу).

Но если он используется только в абзаце, то p.error просто заставляет браузер работать усерднее.

Сначала нужно будет найти все элементы с атрибутом class error, а затем отфильтровать их только с тегами p.

Ниже приведено интересное чтение Оптимизация отображения браузера на сайте Google Page Speed.


Foot Note

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

.error
{
   color:red;
}

h1
{
font-size:2em;
}

p
{
   font-size:0.8em;
}


<h1 class="error">Bad Heading!</h1>
<p class="error">bad!</p>

Таким образом, это порождает необходимость префикса классов с тегами в любом случае.

Надеюсь, это поможет!

Ответ 6

Причина - специфика. Например...

  • +1 каждый доступ по классу
  • +1 каждый доступ по тегу
  • +10 каждый доступ по идентификатору
  • и др.

Итак, если у вас есть доступ к классу и тегу, этот стиль имеет спецификацию 2 (1 + 1).

Позже, если вы пытаетесь стилизовать все элементы .error, но у вас есть противоречивый стиль в элементах p.error, более высокая специфика победит. Это может привести к некоторым головным болям по линии. Вот почему вы не можете всегда использовать класс tag +.

(Говоря это, специфика решает гораздо больше проблем, чем создает, и обычно рассматривается как Pretty Awesome.)