CSS selectors ul li a {…} vs ul > li > a {…}

>” is the child selector

” 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:

<foo> <!-- parent -->
  <bar> <!-- child of foo, descendant of foo -->
    <baz> <!-- descendant of foo -->
    </baz>
  </bar>
</foo>

for this example, foo * would match <bar> and <baz>, whereas foo > * would only match <bar>.

As for your second question:

Which one is more efficient and why?

I’m not actually going to answer this question as it’s completely irrelevant to development. CSS rendering engines are so fast that there is almost never* a reason to optimize CSS selectors beyond making them as short as possible.

Instead of worrying about micro-optimizations, focus on writing selectors that make sense for the case at hand. I often use > selectors when styling nested lists, because it’s important to distinguish which level of the list is being styled.

* if it genuinely is an issue in rendering the page, you’ve probably got too many elements on the page, or too much CSS. Then you’ll have to run some tests to see what the actual issue is.

Leave a Comment