2013-08-30 1 views
6

Я читал много статей о производительности CSS, таких как;Почему селектора, такие как [title = "home"] медленнее, чем использование класса?

Я понимаю, почему селекторы, как это плохо

#social a { 
} 

В браузере будет читать первым, а затем вынужден через все <a> теги на странице.

Но почему селектор, таких как а [название = «домой»] медленнее, чем при использовании класса?

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

Но не должны ли браузеры индексировать, какие элементы имеют определенный атрибут? (например, название)?

Мой вопрос:; почему CSS/элемент выглядит медленнее при использовании селекторов, таких как a [title = "home"] по сравнению с использованием класса ? Что и как работает браузер, чтобы результат был намного медленнее?

+0

«Но не должны ли браузеры индексировать, какие элементы имеют определенный атрибут?» - Как вы думаете, это имеет смысл? Класс говорит что-то вроде «Эй, я такого типа, кто-нибудь может со мной что-то сделать!» в то время как атрибут placeholder просто говорит «Yo, браузер, сделайте меня таким образом, а затем забудьте обо мне».И поскольку индексирование занимает некоторое время, я думаю, что браузеры хотят индексировать только первый тип атрибутов. – contradictioned

+1

FYI, термин «универсальный селектор» конкретно относится к селектору '*'. 'a [title =" home "]' не является универсальным селектором; '[title =" home "]' без 'a', с другой стороны, вы можете сказать, что использует универсальный селектор * implicit *, потому что он эквивалентен' * [title = "home"] '. – BoltClock

+1

Кроме того, «Поскольку браузер будет первым читать, он вынужден пропустить все теги на странице». Это не так, как ведут себя основные браузеры; см. http://stackoverflow.com/questions/5797014/why-do-browsers-match-css-selectors-from-right-to-left – BoltClock

ответ

3

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

Поскольку случайные селекторы, такие как title="home", не используются очень часто, они могут уйти от реализации с использованием более простых поисков. Это не повлияет на производительность, поскольку редко используется.

Классы также требуют специальной обработки в браузере, поскольку элемент может иметь несколько классов, например. class="foo bar baz". При анализе документа браузер должен разбить его так, чтобы он мог сопоставить любой из них с селекторами CSS.

+0

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

+0

Да. Классы и идентификаторы предназначены для использования в селекторах, поэтому они оптимизированы для этого использования. – Barmar

+1

Обратите внимание, что по этой причине использование селектора атрибутов для соответствия атрибуту 'class' не оптимизируется. (Кроме того, если вы используете селектора атрибутов для соответствия именам классов, вы, вероятно, пытаетесь сопоставить специальные критерии, которые не могут быть достигнуты с помощью селектора классов.) – BoltClock

0

Benchmark

Выводы

В селектор атрибута большинстве случаев»с неизвестным атрибутом, например, [a = "b"] 'и' селектор атрибутов с известным атрибутом, например. [title = "a"] 'появился в категории «3 худших». Можно с уверенностью сказать, что вам следует избегать этих селекторов.

+0

Почему вы тестировали такие старые версии браузера? – Barmar

+0

@Barmar: Он не тот, кто написал эти тесты. Стив Соудерс сделал это. Статья, в которой взята диаграмма, была написана 4 года назад. – BoltClock

+0

Ни одна из тестовых страниц не использует селектора типа 'a [title =" home "]'. – Barmar

Смежные вопросы