Understanding hierarchy is one of the most important steps when it comes to building custom selectors. Do not skip this section!

Every web element on a website adheres to a hierarchy. See the hierarchy for the search button on the Wikipedia page:

For the search button on Wikipedia in the above example, the hierarchy would be:

body > div > form > fieldset > button

Note that some elements are on the same level (see picture below). This means these elements are items in a list and siblings to each other. They cannot be defined in a hierarchical way as shown in the example above (with >). They can be either defined as a list (you will learn about it later in chapter Lists: Incremental CSS Selectors) or - which is a bit more advanced - as siblings (you will learn about it in the final chapter of this guide Addressing Siblings).

Strict and Loose Hierarchy

Strict hierarchy

Whenever you use >, the hierarchy is defined in a strict way - in the example above (body > div > form > fieldset > button), body MUST be followed by div and if not the selector will fail.

Loose hierarchy

Alternatively, you can use space to define a loose hierarchy, for example:

body button

This means that body is followed by button somewhere below and it doesn't matter if there are other elements between body and button.

Build Selectors Based on Hierarchy

In some cases, to build a selector, you may need to additionally define the hierarchy. You can simply define tags that follow each other, like this:

Strict hierarchy: tag1 > tag2 > tag3 > tag4 > tag5

Loose hierarchy: tag1 tag3 tag5 (did you note how tag2 and tag4 are skipped?)

Combination of strict and loose hierarchy: tag1 tag3 > tag4 (note how tag2 is skipped but tag4 strictly follows tag3)

And for any tag inside the hierarchy you can add attributes like this:

tag1[attribute='value'] > tag2[attribute='value']

tag1 > tag2[attribute='value']

tag1[attribute='value'] > tag2

For the example of the search button on Wikipedia, the list of selectors we built can be extended by these ones, and they will work just as well:

Strict hierarchy: body > div > form > fieldset > button[class*='pure-button']

Loose hierarchy: body form button[class*='pure-button']

Combination of strict and loose hierarchy: body > div button[class*='pure-button']

Video Tutorial: Selector Hierarchy

Last updated