Производительность селектора CSS — псевдоселекторы

Селекторы CSS анализируются справа налево, а затем отображаются.

Имея это в виду, на основе этого кода:

<a href="#" class="myImage">
    <img>
</a>

Что более производительно?:

.myImage img 

or

.myImage img:only-child

Помогает ли :only-child специфичности при выборе селектора? Таким образом, вместо того, чтобы сначала сопоставлять все <img> в документе, а затем искать родительский класс, он соответствует только <img>, которые являются единственными дочерними (тем самым уменьшая пул вариантов)?

ссылка на чтение: http://csswizardry.com/2011/09/writing-efficient-css-selectors/

ИЗМЕНИТЬ

Нашел дальнейшее чтение:

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

— Дэвид Хаятт (архитектор Safari и WebKit, также работал над Mozilla, Camino и Firefox) Источник: http://www.stevesouders.com/blog/2009/03/10/performance-impact-of-css-selectors/


person Jason    schedule 15.01.2014    source источник
comment
Вы делаете две разные вещи с этими селекторами. Вы должны попытаться достичь чего-то относительного, чтобы провести сравнение в первую очередь. Я полагаю, что если вы пытаетесь применить стиль к единственному дочернему элементу вашего img, то, очевидно, это будет лучший вариант, поскольку img применит стиль ко всем img в классе .myImg, чего вы не делаете. не хочу.   -  person Ali Gajani    schedule 15.01.2014
comment
Помогает ли :only-child конкретизировать выбор селектора? Ну да... в этом вся суть.   -  person BoltClock    schedule 15.01.2014


Ответы (1)


Хорошо, так что это полностью зависит от варианта использования. Я собираюсь заниматься делами.

Пункт 1 - Относительно данного примера


Случай А

Скажите, что ваш код просто:

<a href="#" class="myImage">
    <img>
</a>

В этом случае .myImage img и .myImage img:only-child будут иметь практически идентичные показатели производительности. Причина в следующем:

Хиты производительности CSS происходят из-за необходимости стилизовать или изменять стили блоков. Что делает CSS, так это влияет на ваш графический процессор, а не на ЦП, поэтому нас интересуют только визуальные обновления. И повторная стилизация вещей с повторяющимися свойствами ДЕЙСТВИТЕЛЬНО вызывает перерисовку (под этим я подразумеваю повторяющиеся свойства, которые применяются позже, что обычно вызывают селекторы).

Обычно .myImage img стилизует ВСЕ <img> в .myImage. При использовании селектора only-child возможно не все стили (очевидно).

Но в этом примере и .myImage img, и .myImage img:only-child будут выполнять одинаковые действия, так как они оба вызовут 1 отрисовку/перерисовку на одном и том же поле.


Случай Б

Но предположим, что у нас есть:

<a href="#" class="myImage">
    <img>
    <img>
</a>

Однако здесь у нас другая история.

В этом примере only-child вообще не будет работать, так как <img> не единственный дочерний элемент.


Случай C

Наконец, предположим, что у вас есть это, но вы хотите стилизовать только под:

<a href="#" class="myImage">
    <img>
</a>
<div class="myImage>
    <img>
    <img>
</div>

В этом случае использование селектора only-child будет значительно лучше с точки зрения производительности, поскольку вы будете стилизовать только один элемент вместо трех.


Заключение и вывод

В общем, запомните несколько вещей.

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

  • only-child НЕ быстрее, чем .class child, если этот .class имеет только один дочерний элемент.

  • Технически то, что вы сравниваете, это две совершенно разные вещи, используемые для разных целей.

Заключение

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

Однако, как

«Помогает ли :only-child специфичности при выборе селектора?»

идет: Да, в этом смысл селектора. См.: http://www.w3schools.com/cssref/sel_only-child.asp.

Источники: я являюсь важным разработчиком-добровольцем для Mozilla Thunderbird и проекта Mozilla и работаю в области CSS.

К вашему сведению

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

Пункт 2 - Касательно скорости поиска селекторов

Я намеренно пытаюсь донести мысль о том, что именно рисование вызывает удар производительности CSS, а не поиск селекторов. Однако я говорю это не потому, что поиск селекторов не требует времени, а потому, что это время ничтожно мало по сравнению со временем, затрачиваемым на отрисовку. Тем не менее, если бы у вас было 5000 <div>s или что-то в этом роде, и вы попытались бы стилизовать некоторые из них с помощью псевдоселекторов, это определенно заняло бы немного больше времени, чем использование классов CSS и идентификаторов.

Опять же, в вашем примере это не имело бы никакого значения, поскольку он все равно просматривал бы каждый элемент. Почему only-child полезен с точки зрения производительности, так это потому, что он прекратит поиск некоторого элемента после того, как найдет более одного дочернего элемента, тогда как простое выполнение class child этого не сделает.

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

Предоставленные вами ссылки на самом деле очень полезны, и я удивлен, что они не ответили на ваш вопрос.

Я должен отметить одну вещь: многие селекторы, которые считаются медленными, теперь могут быть значительно улучшены. См.: http://calendar.perfplanet.com/2011/css-selector-performance-has-changed-for-the-better/

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

person Josiah    schedule 15.01.2014
comment
И снова стилизация вещей с повторяющимися свойствами вызывает перерисовку. Вы имеете в виду два правила, влияющие на один и тот же элемент? Если да, то наверняка каскадное разрешение для каждого элемента предотвратит это? Или я наивен? - person BoltClock; 15.01.2014
comment
@BoltClock: Нет, это правильно. Я должен был быть более конкретным. Насколько я понимаю, каскадирование для каждого элемента применяется только к обычным правилам CSS. Однако изменения через JS вызовут перерисовку, аналогичные методы могут столкнуться с той же проблемой. На самом деле я указывал на то, что производительность CSS почти полностью зависит от того, сколько ему нужно отрисовать, а не от того, насколько быстро он может находить элементы. - person Josiah; 15.01.2014
comment
Спасибо за подробный ответ. Ссылки действительно ответили на мой вопрос, однако я оставил его открытым для обсуждения. - person Jason; 15.01.2014
comment
@Josiah: А, я понимаю, что ты имеешь в виду. - person BoltClock; 15.01.2014