Skip to main contentSkip to docs navigation

Add spacing between the direct children of an element using margins, with responsive variants.

@layer utilities
MDN Reference

Overview

Space utilities control the spacing between direct children of an element by applying margin-inline-end or margin-block-end to all children except the last. Unlike gap utilities which require a flex or grid formatting context, space utilities work on any parent element.

Item 1
Item 2
Item 3
HTML
<div class="space-x-md p-md bg-evident">
  <div class="d-inline-block p-sm bg-main">Item 1</div>
  <div class="d-inline-block p-sm bg-main">Item 2</div>
  <div class="d-inline-block p-sm bg-main">Item 3</div>
</div>

The selectors generated for space utilities are wrapped in :where() for zero specificity, making them easy to override with additional utilities or custom CSS.

Notation

Space utilities that apply to all breakpoints, from xs to 2xl, have no breakpoint abbreviation in them. This is because those classes are applied from min-width: 0 and up, and thus are not bound by a media query. The remaining breakpoints, however, do include a breakpoint abbreviation.

The classes are named using the format {property}-{size} for xs and .{breakpoint}:{property}-{size} for sm, md, lg, xl, and 2xl.

Where property is one of:

  • space-x — for classes that set horizontal spacing via margin-inline-end
  • space-y — for classes that set vertical spacing via margin-block-end

Where size is one of:

  • zero or 0 — for classes that eliminate spacing by setting it to 0
  • 4xs - default token value is 0.0625rem (1px).
  • 3xs - default token value is 0.125rem (2px).
  • 2xs - default token value is 0.25rem (4px).
  • xs - default token value is 0.5rem (8px).
  • md - default token value is 1rem (16px).
  • lg - default token value is 1.25rem (20px).
  • xl - default token value is 1.5rem (24px).
  • 2xl - default token value is 1.75rem (28px).
  • 3xl - default token value is 2rem (32px).
  • 4xl - default token value is 2.25rem (36px).
  • 5xl - default token value is 2.5rem (40px).
  • 6xl - default token value is 3rem (48px).

Horizontal

space-x-* utilities control the horizontal space between children by applying margin-inline-end to all children except the last.

Item 1
Item 2
Item 3
HTML

<div class="space-x-md p-md bg-evident">
  <div class="d-inline-block p-sm bg-main">Item 1</div>
  <div class="d-inline-block p-sm bg-main">Item 2</div>
  <div class="d-inline-block p-sm bg-main">Item 3</div>
</div>

Vertical

space-y-* utilities control the vertical space between children by applying margin-block-end to all children except the last.

Item 1
Item 2
Item 3
HTML

<div class="space-y-md p-md bg-evident">
  <div class="p-sm bg-main">Item 1</div>
  <div class="p-sm bg-main">Item 2</div>
  <div class="p-sm bg-main">Item 3</div>
</div>

How it works

Space utilities apply margin-inline-end or margin-block-end to every direct child except the last via a :not(:last-child) child selector. The selector is wrapped in :where() for zero specificity, so individual children can be overridden with standard margin utilities.

CSS
:where(.space-x-md > :not(:last-child)) {
  margin-inline-end: 1rem;
}
:where(.space-y-md > :not(:last-child)) {
  margin-block-end: 1rem;
}

CSS

Space utilities are generated via the utilities API.

Reference

The table lists all space utilities and their CSS properties.

ClassProperties
.space-x-zeromargin-inline-end: var(--cx-space-zero);
.space-x-4xsmargin-inline-end: var(--cx-space-4xs);
.space-x-3xsmargin-inline-end: var(--cx-space-3xs);
.space-x-2xsmargin-inline-end: var(--cx-space-2xs);
.space-x-xsmargin-inline-end: var(--cx-space-xs);
.space-x-smmargin-inline-end: var(--cx-space-sm);
.space-x-mdmargin-inline-end: var(--cx-space-md);
.space-x-lgmargin-inline-end: var(--cx-space-lg);
.space-x-xlmargin-inline-end: var(--cx-space-xl);
.space-x-2xlmargin-inline-end: var(--cx-space-2xl);
.space-x-3xlmargin-inline-end: var(--cx-space-3xl);
.space-x-4xlmargin-inline-end: var(--cx-space-4xl);
.space-x-5xlmargin-inline-end: var(--cx-space-5xl);
.space-x-6xlmargin-inline-end: var(--cx-space-6xl);
.space-x-0margin-inline-end: 0;
.space-y-zeromargin-block-end: var(--cx-space-zero);
.space-y-4xsmargin-block-end: var(--cx-space-4xs);
.space-y-3xsmargin-block-end: var(--cx-space-3xs);
.space-y-2xsmargin-block-end: var(--cx-space-2xs);
.space-y-xsmargin-block-end: var(--cx-space-xs);
.space-y-smmargin-block-end: var(--cx-space-sm);
.space-y-mdmargin-block-end: var(--cx-space-md);
.space-y-lgmargin-block-end: var(--cx-space-lg);
.space-y-xlmargin-block-end: var(--cx-space-xl);
.space-y-2xlmargin-block-end: var(--cx-space-2xl);
.space-y-3xlmargin-block-end: var(--cx-space-3xl);
.space-y-4xlmargin-block-end: var(--cx-space-4xl);
.space-y-5xlmargin-block-end: var(--cx-space-5xl);
.space-y-6xlmargin-block-end: var(--cx-space-6xl);
.space-y-0margin-block-end: 0;

Utilities API

Space utilities are declared in scss/utilities/_index.scss using the utilities API.

"space-x": (
  responsive: true,
  property: margin-inline-end,
  class: space-x,
  child-selector: "> :not(:last-child)",
  values: map.merge(map-loop($spaces, varify, "$key", "space"), (0: 0))
),
"space-y": (
  responsive: true,
  property: margin-block-end,
  class: space-y,
  child-selector: "> :not(:last-child)",
  values: map.merge(map-loop($spaces, varify, "$key", "space"), (0: 0))
),