В общем, селекторы идут в следующем порядке эффективности (от самого низкого до самого эффективного):
- ID
- Класс
- Имя тега
- Детские отношения (
foo > bar
)
- Отношения потомков (
foo bar
)
- Атрибут (
foo[bar="baz"]
)
- Псевдоклассы (
foo:hover
, foo:nth-child()
)
Другое соображение заключается в том, что CSS-селекторы - это в основном поиск по дереву, поэтому чем больше вы можете вырезать из дерева, тем лучше. #foo .bar
- это отношение потомков, но если включение #foo
исключит большую часть вашего HTML из поиска, это сделает этот селектор более эффективным. Точно так же теоретически img[data-src]
будет быстрее, чем [data-src]
, поскольку существует более ограниченный набор элементов, атрибут которых необходимо проверить.
(я не знаю этого наверняка, но ожидал бы, что правила CSS не всегда интерпретируются в строгом порядке справа налево. #foo .bar
например, будет более эффективным, если интерпретируется слева направо: сначала ищите элемент ID, затем вам нужно только проверить его дочерние элементы на .bar
вместо поиска по всему документу. Я бы предположил, что очевидные оптимизации производительности, подобные этой, уже встроены в большинство или во все движки браузера.)
Есть также некоторые случаи, когда вы можете заменить javascript-методы для правил css, такие как $('foo:nth-child(1)')
против $('foo').first()
- в этом конкретном случае jQuery быстрее , хотя это не обобщается для всех конечно, селекторы (так как для них нет соответствующих методов).
Если вы сомневаетесь, вы можете сравнить такие вещи, просто повторно выполнив выделение (в соответствии с вашим настоящим HTML) в цикле:
... результаты которого подводят меня к моей главной мысли: преждевременная оптимизация.
В большинстве случаев, с большинством веб-страниц, это мало что меняет в реальном мире. С очень простым HTML выше, селектор почти не имеет значения даже при 100 000 итерациях. На 10 000 итераций я даже не получаю последовательных результатов, из которых быстрее.
Если вы работаете с относительно большими деревьями HTML и сложными селекторами и начинаете видеть реальные проблемы с производительностью, которые, как вы подозреваете, связаны с этими поисками DOM, , тогда хорошая идея - начать тестирование такого рода. вещи. (Хотя даже в этом случае большую часть времени вы увидите больше улучшений от кэширования и повторного использования предыдущих вариантов, чем от точной настройки самих вариантов.)
Используйте здравый смысл, постарайтесь, чтобы ваши селекторы были простыми и точными, и используйте их, когда это возможно, - но, вероятно, не стоит потеть каждую миллисекунду, если вы не видите реальных проблем с производительностью.