Understanding the Parent CSS Selector :has(): A Comprehensive Guide for Beginners


Rahul / March 07, 2023

7 min read––– views

Have you ever felt like you're stuck in a loop while writing your CSS? Does the thought of using parent selectors to simplify your code seem like an impossible task?

Not sure where to start when it comes to understanding the parent CSS selector :has()?

Well, look no further! We've got you covered with this comprehensive guide for beginners.

Understanding the parent CSS selector :has() can be intimidating for those new to web development, but it doesn't have to be.

This guide will provide a step-by-step breakdown of the :has() selector and will show you how to use it in your code. We'll also discuss tips on how to maximize its efficiency and tips on troubleshooting common issues that come up when coding with :has().

So grab a coffee, get comfortable, and let's get started on understanding the parent CSS selector :has().

What Is the CSS Parent Selector :has()?

Are you a beginner looking to understand the CSS Parent Selector :has()? If so, you have come to the right place!

In this comprehensive guide, we'll walk through everything you need to know about the CSS Parent Selector :has() .

Simply put, the core purpose of the CSS Parent Selector :has() is to make it easier for developers and designers to target parent elements in a DOM tree.

By using this selector, you can target any element based on its content or its relationship with other elements on the page. As a result, you can style your pages more precisely and write your code faster.

Plus, by targeting parents instead of their children, you will likely increase the performance of your website or application.

It's important to note that while :has() is part of the current CSS spec draft, it is not currently supported by all browsers. However, many useful polyfills will allow most developers today to use it without concern.

Ultimately though, if you are developing for legacy browsers that don't support this selector yet, it's best to practice caution and avoid using it if possible.

Syntax of the CSS :has() Selector

Now that you understand the basics of the :has() selector, let's dive into the syntax.

The syntax of the :has() selector is simple and straightforward. All you need to do to use the :has() selector is to specify the parent element, followed by the :has() function, followed by the selector in parentheses.

To illustrate, if you want to target the <div> element that contains an <h1> element, your code would look like this:

div:has(h1) {
    // Your styling code goes here

In this example, the selector is targeting the parent <div> element because it contains the <h1> element.

Examples of How to Use the :has() Selector

First Example: Let's say you have a list of blog posts, each of which has a title, a date, and some content. You want to apply a different style to the date depending on whether the post has any images in it.

Let's say how you can do this by the :has() selector:

.post:has(img) .date {
  color: red;

This selector says "select any .post element that contains an img element, and then select the .date element inside that .post ". This will apply the color: red style to the date only if the post contains images.

Second Example: Let's say you have a navigation menu with several links, and you want to highlight the current page by applying a different background color to its link.

If you don't have a consistent class or ID for the current page link, you can use the :has() selector to target it based on its text:

.nav-link:has(span.current-page) {
  background-color: yellow;

This selector says "select any .nav-link element that contains a span element with the class .current-page , and apply the background-color: yellow style to that .nav-link ".

This will highlight the current page link without needing to modify the HTML to include a special class or ID.

Pros and Cons of the CSS Parent selector :has()

The CSS parent selector :has() is a great tool for simplifying your code and making it easier to read, and potentially reducing the amount of time you spend writing code. But like with any tool, it has its pros and cons.


First, let's look at some of the benefits of using the CSS parent selector :has():

  • It makes it much easier to write complex selectors without resorting to complicated selectors that get confusing quickly.

  • It gives you more freedom when constructing selectors, allowing you to select elements based on conditions that were previously not possible when using other methods.

  • You can use variables in your selectors, which helps with readability and organization.

  • The code is also shorter and more concise since you don't have to repeat the same selector multiple times for each rule.

  • With :has(), you can easily target specific elements within a larger group of elements because you can use multiple conditions in one statement.


The CSS parent selector :has() isn't always the best option, and there are several drawbacks:

  • It's not compatible with all browsers — it works in Chrome, Firefox and Edge but doesn't work in Internet Explorer or Safari.

  • It can be difficult to debug if something goes wrong since there are more variables involved than with other selectors.

Troubleshooting and Common Questions About Parent CSS Selector :has()

If you're just starting out with the parent CSS Selector :has(), you're probably going to have some questions about it.

That's why we've compiled this list of common troubleshooting questions and answers that beginners should know about.

What Is the Parent CSS Selector :has():

The parent CSS Selector :has() is a selector that makes it easier to target the parent element of a child element when styling your web page or application.

It lets you target the parent element, which can be helpful when styling multiple elements at once or when you have to style an element that's nested deep in your HTML structure.

What Are the Benefits of Using :has()?

Using :has() offers lots of benefits, including:

  • Flexibility - You can easily target any elements, even if they're deep inside nested elements in your HTML tree structure.

  • Easier Style Overrides - Since :has() allows you to target the parent element, you can use it to override styles for multiple elements at once instead of having to go through each one individually.

  • Better Performance - With :has(), your code runs faster than if you were targeting individual elements since it only has to run 1 query instead of multiple queries for each element.

Are There Any Limitations To Using :Has()?

Yes, there are a few limitations with using the parent CSS Selector :has().

Firstly, not all browsers support it, so if you're targeting older browsers, then this selector might not work as expected.

Also, it's important to note that this selector isn't supported in IE9 and below, so take that into consideration when using :has().


The :has() selector is a powerful tool when used properly and is a great choice for beginners looking to get creative with their CSS code.

The :has() selector is a parent selector that allows you to target an element based on the existence of a certain element with a certain class or id. It allows you to target elements that are inside of other elements, and can come in handy in several different scenarios.

Using the :has() selector correctly can take a bit of practice and understanding, but it’s not too difficult to master.

As you become more familiar with the :has() selector, you’ll be able to use it to create unique and sophisticated patterns with just a few lines of code. With just a little bit of practice, you’ll be a CSS pro in no time.