How to use has() Property in CSS

Niraj Narkhede - Jun 14 - - Dev Community

As a UI developer, you're always on the hunt for tools and techniques to make your styling more efficient and intuitive. The has() property in CSS is a game-changer, providing new ways to enhance your styles with conditional logic. You might have heard about it or maybe evenabbled with some code snippets, but how does it really work? And how can you use it to improve your workflow?

In this comprehensive guide, we’ll dive deep into the has() property, exploring its functionality, use cases, and potential pitfalls. Whether you're new to CSS or a seasoned developer, there's something for everyone. Ready to level up your CSS skills? Let's get started!

Understanding the Basics of has()

The has() pseudo-class is a powerful addition to CSS selectors, allowing you to apply styles based on the presence of an element within another element. Think of it as a way to check if a parent element contains a specific child element and style it accordingly. This pseudo-class can help you make more dynamic styles without relying heavily on JavaScript or adding unnecessary classes to your HTML.

Syntax and Basic Usage

The basic syntax of the has() pseudo-class is quite simple:

Example

element:has(selector) {
    /* Styles go here */
}
Enter fullscreen mode Exit fullscreen mode

Here's a straightforward example to illustrate:

Example

div:has(p) {
    border: 2px solid blue;
}
Enter fullscreen mode Exit fullscreen mode

In this example, any div that contains a p element will have a blue border. The has() property works by evaluating the presence of the specified selector within the parent element.

Compatibility

It's important to note that, as of now, the has() pseudo-class is not yet widely supported across all browsers. This means you should check for browser compatibility and possibly use feature detection to ensure your styles work as expected.

Practical Use Cases for has()

Now that we understand the basics, let’s explore some practical scenarios where the has() pseudo-class can make your life as a UI developer easier.

1. Styling Based on Content

One common use case for the has() pseudo-class is styling elements based on their content. For example, you might want to style a div differently if it contains a specific type of content, such as an image or a button.

Example

div:has(img) {
    padding: 20px;
    background-color: #f7f7f7;
}
Enter fullscreen mode Exit fullscreen mode

In this example, any div containing an img element will have additional padding and a lighter background color. This can be especially useful for content management systems where content is dynamically generated.

2. Form Validation

Form validation is another area where the has() pseudo-class can be incredibly handy. You can style form elements based on whether they contain specific types of input fields.

Example

form:has(input[type="submit"]) {
    border: 2px solid green;
}
Enter fullscreen mode Exit fullscreen mode

This CSS rule applies a green border to forms that contain a submit button, providing a visual cue for users to indicate actionable forms.

3. Navigation Menus

The has() pseudo-class is also great for styling navigation menus. For example, you might want to highlight menu items that have submenus.

Example

li:has(ul) {
    font-weight: bold;
    color: #333;
}
Enter fullscreen mode Exit fullscreen mode

This rule makes parent menu items bold and changes their color if they contain a submenu, giving users a clear indication of expandable options.

4. Conditional Styling with Multiple Selectors

You can also use the has() pseudo-class with multiple selectors to apply conditional styling based on a combination of elements.

Example

section:has(h2, p) {
    margin: 40px;
    background-color: #eef;
}
Enter fullscreen mode Exit fullscreen mode

In this scenario, any section that contains both an h2 and a p element will have a specific margin and background color. This is particularly useful for structuring complex layouts where different content blocks require different styling.

Advanced Techniques with has()

While the examples above showcase straightforward uses of the has() pseudo-class, there are more advanced techniques that can further streamline your CSS.

1. Combining has() with Other Pseudo-classes

One powerful feature is the ability to combine has() with other pseudo-classes like :not(), :nth-child(), and more to create more intricate styles.

Example

div:has(img):not(:has(.thumbnail)) {
    border: 2px solid red;
}
Enter fullscreen mode Exit fullscreen mode

This rule applies a red border to any div that contains an image but does not contain an element with the class thumbnail

2. Styling Based on User Interaction

You can also use has() to conditionally apply styles based on user interactions, such as focusing on an input field within a form.

Example

form:has(input:focus) {
    outline: 2px dashed #00f;
}
Enter fullscreen mode Exit fullscreen mode

When any input field within a form gains focus, the entire form gets an outline, helping users easily see the active form section.

3. Accessibility Improvements

The has() pseudo-class can improve accessibility by providing better visual cues for users with disabilities. For example, you can highlight form sections containing errors.

fieldset:has(.error) {
    border: 2px solid #f00;
    background-color: #fee;
}

Enter fullscreen mode Exit fullscreen mode

This rule visually emphasizes fieldsets containing elements with the error class, making it easier for users to identify problematic sections.

4. Potential Pitfalls and How to Avoid Them

While the has() pseudo-class is a fantastic addition to CSS, it’s not without its challenges. Here are some common pitfalls and tips to avoid them.

5. Performance Concerns

Because the has() pseudo-class requires the browser to evaluate the presence of child elements within a parent, it can be more performance-intensive than other selectors. This is especially true for complex selectors or large documents.

Tip: Use has() sparingly and only when it provides a significant benefit. Avoid using it in performance-critical sections of your application.

6. Browser Compatibility

As mentioned earlier, has() is not yet fully supported across all browsers. Make sure to test your styles in different browsers and provide fallbacks where necessary.

Tip: Use feature detection and conditional logic in your CSS or JavaScript to gracefully degrade functionality or inform users when a feature is not available.

Conclusion: Embracing the Future of CSS

The has() pseudo-class is a powerful tool in the arsenal of any UI developer, offering new ways to dynamically style elements based on their content and relationships. While it’s not yet widely supported, understanding its potential and limitations can help you make informed decisions about when and how to use.

By incorporating has() into your styling repertoire, you can create more intuitive and responsive designs, reduce your reliance on JavaScript, and write cleaner, more maintainable CSS. As browser support grows, the has() pseudo-class is poised to become an essential part of modern web development.

So, the next time you’re facing a complex styling challenge, consider whether the has() pseudo-class might be the solution you’ve been looking for. With a bit of creativity and careful consideration, you can leverage this powerful feature to enhance your UI designs and create more engaging user experiences.

“Great design is not just about how it looks, but also about how it works.” - Steve Jobs

Let's continue pushing the boundaries of what CSS can do, making the web more beautiful and functional one line of code at a time. Happy coding!

. . . . . . . . . . . . . . . . . . . . . . . .