Селекторы CSS ул ли а {...} против ул> ли> в {…}
- в чем разница между
ul > li > a {...}
иul li a {...}
в CSS? - какой из них более эффективный и почему?
5 ответов
">
" - это ребенок селектор
"" is the descendant selector
The difference is that a descendant can be a child of the element, or a child of a child of the element or a child of a child of a child ad inifinitum.
A child element is simply one that is directly contained within the parent element:
for this example, foo *
будет соответствовать <bar>
и <baz>
, а foo > *
будет соответствовать только <bar>
.
Что касается вашего второго вопроса:
какой из них более эффективный и почему?
Я на самом деле не собираюсь отвечать на этот вопрос, поскольку он совершенно не имеет отношения к развитию. Движки рендеринга CSS настолько быстры, что почти никогда* нет причин оптимизировать селекторы CSS кроме того, чтобы сделать их как можно короче.
вместо того, чтобы беспокоиться о микро-оптимизации, сосредоточьтесь на написании селекторов, которые имеют смысл для рассматриваемого случая. Я часто использую >
селекторы при стилизации вложенных списков, потому что важно различать, какой уровень списка стилизуется.
* если это действительно проблема при рендеринге страницы, у вас, вероятно, слишком много элементов на странице или слишком много CSS. Тогда вам придется провести несколько тестов, чтобы увидеть какова реальная проблема.
ul>li
выбирает все li
это прямой ребенок ul
, тогда как ul li
выбирает все li
которые находятся где угодно внутри (спускаясь так глубоко, как вам нравится) a ul
для HTML:
<ul>
<li><span><a href='#'>Something</a></span></li>
<li><a href='#'>or Other</a></li>
</ul>
и CSS:
li a{ color: green; }
li>a{ color: red; }
цвета Something
останется зеленым, но or Other
будет красным
Часть 2, вы должны написать правило, соответствующее ситуации, я думаю, что разница в скорости будет невероятно мала, и вероятно, затмевается дополнительными символами, участвующими в написании большего количества кода, и определенно затмевает время, затраченное разработчиком, чтобы подумать об этом.
однако, как правило, чем конкретнее вы с вашими правилами, тем быстрее движки CSS могут найти элементы DOM, к которым вы хотите применить его, поэтому я ожидаю li>a
быстрее li a
поскольку поиск DOM может быть прерван ранее. Это также означает, что вложенные якоря не стилизованы с этим правилом, это то, что вы хотите? гораздо более уместный вопрос.
ul > li > a
выбирает только прямые детей. В этом случае только первый уровень <a>
первый уровень <li>
внутри <ul>
будет выбран.
ul li a
С другой стороны будет выбрать все <a>
-s во всех <li>
- s в неупорядоченном списке
пример ul > li
ul > li.bg {
background: red;
}
<ul>
<li class="bg">affected</li>
<li class="bg">affected</li>
<li>
<ol>
<li class="bg">NOT affected</li>
<li class="bg">NOT affected</li>
</ol>
</li>
</ul>
если бы вы использовали ul li
- все li
-S могут быть затронуты
обновление Порядок от более до менее эффективных селекторов CSS идет следующим образом:
- ID, например,
#header
- класса, например,
.promo
- тип, например,
div
- рядом брат, например,
h2 + p
- ребенок, например,
li > ul
- потомок, например,
ul a
- универсальный, то есть
*
, например, - псевдо-классы/-элементов, например,
a:hover
[type="text"]
поэтому лучше использовать children
селектор, а не просто descendant
. Однако разница на обычной странице (без десятков тысяч элементов) может быть абсолютно незначительной.
1) например, HTML-код:
<ul>
<li>
<a href="#">firstlink</a>
<span><a href="#">second link</a>
</li>
</ul>
и правила css:
1) ul li a {color:red;}
2) ul > li > a {color:blue;}
"> " - символ означает, что это будет искать только дочерний селектор (parentTag > childTag)
Итак, первое правило CSS будет применяться ко всем ссылкам (первая и вторая) и второе правило будет применяться только к первой ссылке
2) Что касается эффективности - я думаю, что второй будет быстрее - как в случае с селекторами JavaScript. Это правило читается справа налево, это означает, что когда правило будет разбор браузером, он получает все ссылки на странице: - в первом случае он найдет все родительские элементы для каждой ссылки на странице и отфильтрует все ссылки, где существуют родительские теги " ul " и " li" - во втором случае он будет проверять только родительский узел ссылки, если это тег "li", то - > проверьте, является ли Родительский тег "li" "ul"
что-то вроде этого. Надеюсь, я опишу все правильно для вас
чтобы ответить на ваш второй вопрос-производительность зависит - если вы используете эти селекторы с одним (без вложенных) ul:
<ul>
<li>jjj</li>
<li>jjj</li>
<li>jjj</li>
</ul>
ребенок селектор ul > li
более эффективен, чем ul li
потому что это более конкретно. браузер пересекает dom "справа налево", поэтому, когда он находит li
затем он ищет any ul
как родитель в случае дочернего селектора, в то время как он должен пересечь все дерево dom, чтобы найти любой ul
предки в случае селектор