Skip to content

Tailwind CSS - Borders

Tailwind CSS - Borders, Outlines, and Rings

Section titled “Tailwind CSS - Borders, Outlines, and Rings”

Styling the boundaries of elements is crucial for creating well-defined, organized, and interactive user interfaces. Tailwind CSS provides a comprehensive suite of utilities for managing borders, outlines, and rings, each serving a distinct purpose in UI design.

Below is a summary of the key utility categories for styling element boundaries. Each one controls a different aspect of an element’s appearance and behavior.

TopicDescriptionCommon Use Case
Border RadiusControls the roundness of an element’s corners using classes like rounded-md, rounded-full.Softening the look of buttons, cards, and containers.
Border WidthControls the thickness of an element’s borders, e.g., border, border-2, border-t-4.Defining container boundaries or creating visual separators.
Border ColorSets the color of the border using your theme’s color palette, e.g., border-slate-200.Styling inputs, cards, or matching borders to brand colors.
Border StyleSets the pattern of the border, such as border-solid, border-dashed, or border-dotted.Creating stylized separators or placeholder elements.
Divide UtilitiesAdds borders between child elements, e.g., divide-y, divide-x, divide-slate-200.Styling stacked lists, menus, or separating items in a group.
Outline UtilitiesControls the width, color, style, and offset of an element’s outline.Crucial for a11y: Creating visible keyboard focus indicators.
Ring UtilitiesAdds solid rings of color using box-shadow. Unlike borders, they don’t affect layout.Advanced focus states, selection indicators, or layered effects.

Let’s see how these utilities work together to build modern UI components.

Example 1: Styling a Card with Borders and Dividers

Section titled “Example 1: Styling a Card with Borders and Dividers”

This example uses border and rounded-lg to define the card’s main shape. Inside, divide-y is used to create subtle horizontal lines between the header, body, and footer sections, providing clear visual separation without extra markup.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Card with Borders and Dividers</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-slate-100 p-8 flex justify-center">
<div class="max-w-sm w-full bg-white rounded-lg border border-slate-200 shadow-md divide-y divide-slate-200">
<div class="p-4">
<h3 class="font-bold text-lg text-slate-800">Project Update</h3>
</div>
<div class="p-4 text-slate-600">
<p>The Q3 project roadmap has been finalized. Please review the attached document and provide feedback by EOD Friday.</p>
</div>
<div class="p-4 flex justify-end">
<button class="px-4 py-2 bg-blue-600 text-white text-sm font-semibold rounded-md hover:bg-blue-700">View Details</button>
</div>
</div>
</body>
</html>

Example 2: Creating an Accessible Form Input with Rings

Section titled “Example 2: Creating an Accessible Form Input with Rings”

This input field demonstrates a best-practice approach to focus states. It has a default border. On focus, the border color changes, and a ring is added. Rings are excellent for focus states because they are drawn outside the border, don’t affect the element’s size, and can be easily styled with color and opacity.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Accessible Form Input</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-gray-100 p-8 flex justify-center">
<div class="w-full max-w-xs">
<label for="email" class="block text-sm font-medium text-gray-700">Email Address</label>
<div class="mt-1">
<input type="email" name="email" id="email"
class="block w-full px-3 py-2 bg-white rounded-md shadow-sm
border border-gray-300
placeholder-gray-400
focus:outline-none focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500"
placeholder="you@example.com">
</div>
</div>
</body>
</html>
  • Border: The standard. Part of the box model, so adding a border can change the element’s total size and affect layout. Use for permanent boundaries.
  • Outline: Drawn outside the border. Does not affect layout. Its main purpose is for accessibility (focus states). Can’t have rounded corners in some browsers.
  • Ring: A modern alternative to outline. Implemented with box-shadow, so it doesn’t affect layout, can be offset, and respects border-radius. Excellent for highly-styled focus and selection states.