Skip to content

Tailwind CSS - Ring Offset Width

Tailwind’s Ring Offset Width utilities (ring-offset-{width}) set the thickness of a simulated ‘gap’ between an element and its focus ring. This is primarily used to ensure focus rings are clearly visible and don’t overlap with the element’s border.

Creating highly visible focus indicators is a cornerstone of web accessibility. Traditionally, this was done with outline. However, outline can be visually jarring and is drawn directly on top of an element’s border. Tailwind’s ring utilities, combined with ring-offset, provide a more powerful and aesthetically pleasing solution. They use box-shadow to draw a ring outside the element’s border, and the offset creates a clean separation.

These classes control the width of the offset. The ring color and offset color can be controlled separately.

ClassCSS Properties (Simplified)
ring-offset-0--tw-ring-offset-width: 0px;
ring-offset-1--tw-ring-offset-width: 1px;
ring-offset-2--tw-ring-offset-width: 2px;
ring-offset-4--tw-ring-offset-width: 4px;
ring-offset-8--tw-ring-offset-width: 8px;

This example shows how to create accessible, visually appealing buttons. When a button is focused (by clicking or tabbing to it), a ring appears. The ring-offset-2 utility ensures there is a 2px gap between the button and the ring, making it stand out. The ring-offset-color is controlled by ring-offset-white, ensuring the gap is visible against the dark background.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Accessible Ring Offset</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-gray-800 p-8 flex justify-center items-center min-h-screen">
<div class="space-x-4">
<button class="px-6 py-3 bg-blue-600 text-white font-semibold rounded-lg shadow-md
transition-transform transform hover:-translate-y-1
focus:outline-none focus:ring-2 focus:ring-blue-400 focus:ring-offset-2 focus:ring-offset-gray-800">
Primary Button
</button>
<button class="px-6 py-3 bg-green-600 text-white font-semibold rounded-lg shadow-md
transition-transform transform hover:-translate-y-1
focus:outline-none focus:ring-2 focus:ring-green-400 focus:ring-offset-2 focus:ring-offset-gray-800">
Success Button
</button>
</div>
</body>
</html>

You can also place the ring inside the element’s border using the ring-inset utility. The ring-offset will still create a gap, but this time it will be on the inside.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Inset Ring Offset</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="p-8">
<h2 class="text-2xl font-bold mb-6 text-center">Inset Ring with Offset</h2>
<div class="grid grid-cols-1 md:grid-cols-3 gap-8">
<div class="bg-gray-200 p-6 rounded-lg border-2 border-gray-400 ring-4 ring-purple-500 ring-offset-4 ring-offset-gray-200 ring-inset">
<p class="font-bold text-center">`ring-offset-4` inside</p>
</div>
<div class="bg-gray-200 p-6 rounded-lg border-2 border-gray-400 ring-4 ring-teal-500 ring-offset-8 ring-offset-gray-200 ring-inset">
<p class="font-bold text-center">`ring-offset-8` inside</p>
</div>
<div class="bg-gray-200 p-6 rounded-lg border-2 border-gray-400 focus-within:ring-4 focus-within:ring-red-500 focus-within:ring-offset-4 focus-within:ring-inset">
<input type="text" class="w-full bg-transparent outline-none text-center" placeholder="Focus me!">
</div>
</div>
</body>
</html>
  • Prioritize Focus States: The primary use for rings is focus: and focus-visible:. Always start there.
  • Disable Default Outline: When using rings for focus, add focus:outline-none to prevent the browser from drawing two focus indicators.
  • Set Offset Color: Always define a ring-offset-{color} (e.g., ring-offset-white or ring-offset-gray-800) that contrasts with your page background to ensure the offset gap is visible.
  • Consistency: Use a consistent ring and offset width for interactive elements across your site for a predictable user experience.