Skip to content

Understanding the Difference Between `:focus` and `:focus-visible` in CSS

Understanding the Difference Between `:focus` and `:focus-visible` in CSS

Understanding the Difference Between :focus and :focus-visible in CSS

I have learned my fair share about the importance of keyboard accessibility, so I know that visual indication of the focused element is very important. But the well-known :focus pseudo-class is not always the best fit for this job. That's where :focus-visible comes in. Let's look at the differences between these two pseudo-classes and explore the best practices for using them effectively.

What is the :focus Pseudo-Class?

The :focus pseudo-class is a CSS selector that applies styles to any element that receives focus, regardless of how that focus was triggered. This includes focus events from keyboard navigation, mouse clicks, and touch interactions.

Example Usage of :focus

button:focus {
  outline: 2px solid blue;
}

In this example, the button will display a blue outline whenever it is focused, whether the user clicks on it with a mouse, taps it on a touchscreen, or navigates to it using the keyboard.

What is the :focus-visible Pseudo-Class?

The :focus-visible pseudo-class is more specialized. It only applies styles to an element when the browser determines that the focus should be visible. This typically occurs when the user navigates via the keyboard or assistive technologies rather than through mouse or touch input.

Example Usage of :focus-visible

button:focus-visible {
  outline: 2px solid blue;
}

Here, the button will only show a blue outline when focused through keyboard navigation or another input method that usually requires visible focus indicators.

Key Differences Between :focus and :focus-visible

:focus

  • Behavior: Applies to any element that receives focus, regardless of the input method.
  • Use Cases: Ensures that all interactions with the element are visually indicated, whether by mouse, keyboard, or touch.

:focus-visible

  • Behavior: Applies styles only when the focus should be visible, such as using a keyboard or assistive technology.
  • Use Cases: Ideal for scenarios where you want to provide focus indicators only to keyboard and assistive technology users while avoiding unnecessary outlines for mouse and touch users, typically required by design.

Accessibility Implications

:focus

  • Pros:
  • Guarantees that all users can see when an element is focused, which is critical for accessibility.
  • Cons:
  • Can lead to a suboptimal experience for mouse users, as focus styles may appear unnecessarily during mouse interactions.

:focus-visible

  • Pros:
  • Enhances user experience by showing focus indicators only when necessary, thus keeping the interface clean for mouse and touch users.
  • Tailors the experience for keyboard and assistive technology users, providing them with clear visual cues.
  • Cons:
  • Additional considerations may be required to ensure that focus indicators are not accidentally omitted, especially in older browsers that do not support :focus-visible.
    • There may be cases where you want to show focus indicators for all users, regardless of input method.

Best Practices for Using :focus and :focus-visible

To achieve the best accessibility and user experience, combining both :focus and :focus-visible in your CSS is often a good idea.

Combining :focus and :focus-visible

button:focus {
  outline: none; /* Remove default focus for all interactions */
 /* maybe some subtle general focus style */
}

button:focus-visible {
  outline: 2px solid blue; /* Only show outline when the element was interacted with via keyboard or assistive technology */
}

Here is a Stackblitz example of what such styling could look like for you to try out and play with.

Additional Tips

  • Test with Keyboard and Assistive Technology: Ensure that your web application is navigable using a keyboard (Tab, Shift + Tab, etc.) and that focus indicators are visible for those who rely on them. It's never a bad idea to include accessibility testing in your e2e testing suite.
  • Provide Clear Focus Indicators: Make sure that focus indicators are prominent and easy to see. A subtle or hard-to-spot focus indicator can severely impact accessibility for users who rely on keyboard navigation.

Conclusion

The :focus-visible pseudo-class offers a more refined way to manage focus indicators, improving accessibility and user experience, particularly for keyboard and assistive technology users. By understanding the differences between :focus and :focus-visible, and applying best practices in your CSS, you can create more accessible and user-friendly web applications.

Remember, accessibility should never be an afterthought. By thoughtfully applying focus styles, you ensure that all users, regardless of how they interact with your site, can easily navigate and interact.

This Dot is a consultancy dedicated to guiding companies through their modernization and digital transformation journeys. Specializing in replatforming, modernizing, and launching new initiatives, we stand out by taking true ownership of your engineering projects.

We love helping teams with projects that have missed their deadlines or helping keep your strategic digital initiatives on course. Check out our case studies and our clients that trust us with their engineering.

Let's innovate together!

We're ready to be your trusted technical partners in your digital innovation journey.

Whether it's modernization or custom software solutions, our team of experts can guide you through best practices and how to build scalable, performant software that lasts.

Prefer email? hi@thisdot.co