Skip to content

The CSS :has() selector

The :has() CSS pseudo-class represents an element if any of the selectors passed as parameters match at least one element.

In earlier revisions of the CSS Selectors Level 4 specification, :has had a limitation that it couldn’t be used within stylesheets. Instead, it could only be used with functions like document.querySelector(); this was due to performance concerns. This limitation has been removed because no browser implemented it that way. Instead, browsers currently only support the use of :has() within stylesheets.

For example, the following selector matches only <a> elements that contain an <img> child:

a:has(> img)

When selector matches a <dt> element immediately followed by another <dt> element:

dt:has(+ dt)

When selector matches <section> elements that don’t contain any heading elements:

section:not(:has(h1, h2, h3, h4, h5, h6))

Or swapping the nesting of the two pseudo-classes:

section:has(:not(h1, h2, h3, h4, h5, h6))

Safari Technology Preview Release 137 is now available for download and enabled support for :has() pseudo-class by default. The Chromium is not supported right now, but they currently working on implementing it. Firefox is not supported right now.