Skip to content

Tailwind CSS - Margin

Margin utilities are fundamental to any layout, used to create space around an element, outside of its border. Tailwind CSS provides a comprehensive and intuitive set of classes to control margin on all sides of an element or on specific sides.

Margin classes follow a logical and consistent naming convention. The * corresponds to a key in your theme.spacing configuration.

ClassDescription
m-*Sets margin on all sides (e.g., m-4).
mx-*Sets horizontal margin (left and right) (e.g., mx-8).
my-*Sets vertical margin (top and bottom) (e.g., my-2).
mt-*Sets margin on the top side (e.g., mt-6).
mr-*Sets margin on the right side (e.g., mr-3).
mb-*Sets margin on the bottom side (e.g., mb-10).
ml-*Sets margin on the left side (e.g., ml-1).
ms-*Sets logical inline-start margin (left in LTR, right in RTL).
me-*Sets logical inline-end margin (right in LTR, left in RTL).
  • Spacing Scale: The number in a margin class (e.g., m-4) corresponds to a value in Tailwind’s spacing scale. By default, 1 is 0.25rem (or 4px), so m-4 translates to margin: 1rem;.
  • Negative Margin: To apply a negative margin, add a dash prefix to the class, like -m-4 or -mt-8. This is useful for overlapping elements.
  • Arbitrary Values: For pixel-perfect control, you can use arbitrary values in square brackets: m-[10px] or mt-[3.3rem].
  • Automatic Margin: The mx-auto class is a widely used utility to center block-level elements with a defined width within their parent.
  • Logical Properties: ms-* (margin-start) and me-* (margin-end) are modern best practices for creating layouts that support both left-to-right (LTR) and right-to-left (RTL) languages automatically.

Example 1: Spacing and Centering a Login Form

Section titled “Example 1: Spacing and Centering a Login Form”

This example demonstrates using various margin utilities to structure a simple form. mx-auto centers the form, mb-4 adds space between fields, and mt-6 provides extra space above the button.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Margin Example</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-slate-200 py-12">
<!-- Container centered horizontally with mx-auto -->
<div class="max-w-md mx-auto bg-white rounded-xl shadow-md p-8">
<h2 class="text-2xl font-bold text-center mb-6">Login</h2>
<form>
<div class="mb-4"> <!-- Space below the email field -->
<label for="email" class="block text-gray-700 text-sm font-bold mb-2">Email Address</label>
<input id="email" type="email" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
</div>
<div class="mb-6"> <!-- More space below the password field -->
<label for="password" class="block text-gray-700 text-sm font-bold mb-2">Password</label>
<input id="password" type="password" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
</div>
<button type="submit" class="w-full bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline mt-2"> <!-- Space above the button -->
Sign In
</button>
</form>
</div>
</body>
</html>

When you need to add consistent spacing between a list of items (like buttons, list items, or grid children), applying margin to every child can be repetitive. A more modern and efficient approach is to use the Space Between utilities (space-x-* or space-y-*) on the parent container.

Example 2: Using space-x-* for a Button Group

Section titled “Example 2: Using space-x-* for a Button Group”
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Space Between Example</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-gray-100 flex items-center justify-center min-h-screen">
<!-- The space-x-4 class on the parent div adds a left margin to every child except the first one -->
<div class="flex p-4 bg-white rounded-lg shadow-lg space-x-4">
<button class="bg-sky-500 text-white font-semibold px-4 py-2 rounded-md">Save</button>
<button class="bg-gray-200 text-gray-800 font-semibold px-4 py-2 rounded-md">Cancel</button>
<button class="bg-red-500 text-white font-semibold px-4 py-2 rounded-md">Delete</button>
</div>
</body>
</html>
  • Margin Not Working? Margin won’t have a visible effect on inline elements like <span> or <a> unless you change their display property (e.g., to inline-block or block).
  • Margin Collapsing: Be aware of CSS margin collapsing. Vertical margins of adjacent block-level elements can merge. This is standard CSS behavior, not a Tailwind issue. Using Flexbox, Grid, or a single mb-* on the top element can help manage this.
  • Inspect with DevTools: The browser’s developer tools are your best friend. Inspect an element to see the exact CSS being applied and to visualize the margin as a colored box around your element.