A descendant selector in CSS is any selector with white space between two selectors without a combinator. Here's some examples:

ul li {  }
header h2  {  }
footer a  {  }
.module div {  }
#info-toggle span  {  }
div dl dt a  {  }

Take ul li { } for example. It means "any list item that is a descendant of an unordered list."

Descendant means anywhere nested within it in the DOM tree. Could be a direct child, could be five levels deep, it is still a descendant. This is different than a child combinator (>) which requires the element to be the next nested level down.

To illustrate, div span { } will match:

  <span>I will match</span>
       <span>I will match too</span>

You probably shouldn't worry about it very much, but the decedent selector is pretty "expensive" - meaning hard/slow for rendering engines to figure out and do stuff with. MDN:

The descendant selector is the most expensive selector in CSS. It is dreadfully expensive—especially if the selector is in the Tag or Universal Category.

But only in comparison to other selectors. It's still blazingly fast and you'll probably never notice it unless you go crazy.

Browser Support

Chrome Safari Firefox Opera IE Android iOS
Any Any Any Any Any Any Any

Posting Code

You may write comments in Markdown. This makes code easy to post, as you can write inline code like `<div>this</div>` or multiline blocks of code in triple backtick fences (```) with double new lines before and after.

Code of Conduct

Absolutely anyone is welcome to submit a comment here. But not all comments will be posted. Think of it like writing a letter to the editor. All submitted comments will be read, but not all published. Published comments will be on-topic, helpful, and further the discussion or debate.

Want to tell us something privately?

Feel free to use our contact form. That's a great place to let us know about typos or anything off-topic.

Submit a Comment