Open demo

CSS code

HTML
<button type="button" class="bb bb-green">Sign up free</button>
<button type="button" class="bb bb-pink">See pricing</button>
<button type="button" class="bb bb-sky">Read the docs</button>
<button type="button" class="bb">Maybe later</button>
<button type="button" class="bb bb-yellow">Buy now!</button>
<button type="button" class="bb bb-dark">Start building</button>
CSS
/* Neobrutalist buttons: 3px black border and a hard offset shadow; hover and press slide the button onto its shadow. */
.bb{--bb-bg:#fff;--bb-ink:#111;--bb-edge:#111;--bb-shadow:5px 5px 0 var(--bb-edge);
  display:inline-block;border:3px solid #111;border-radius:11px;padding:13px 26px;background:var(--bb-bg);color:var(--bb-ink);
  font:inherit;font-size:.92rem;font-weight:900;line-height:1.25;cursor:pointer;box-shadow:var(--bb-shadow);transition:transform .12s,box-shadow .12s}
.bb:hover{transform:translate(2px,2px);--bb-shadow:3px 3px 0 var(--bb-edge)}
.bb:active{transform:translate(5px,5px);--bb-shadow:0 0 0 var(--bb-edge)}
.bb:focus-visible{outline:3px solid #111;outline-offset:4px}
.bb-green{--bb-bg:#4ade80}
.bb-pink{--bb-bg:#ff90e8}
.bb-sky{--bb-bg:#7dd3fc}
.bb-yellow{--bb-bg:#fde047;text-transform:uppercase;letter-spacing:.05em}
.bb-dark{--bb-bg:#111;--bb-ink:#fde047;--bb-edge:#f97316}
@media (prefers-reduced-motion:reduce){.bb{transition:none}}

Bootstrap 5 code

Requires: Bootstrap 5.3.8 CSS

HTML
<button type="button" class="btn btn-brutal btn-brutal-green">Sign up free</button>
<button type="button" class="btn btn-brutal btn-brutal-pink">See pricing</button>
<button type="button" class="btn btn-brutal btn-brutal-sky">Read the docs</button>
<button type="button" class="btn btn-brutal">Maybe later</button>
<button type="button" class="btn btn-brutal btn-brutal-yellow">Buy now!</button>
<button type="button" class="btn btn-brutal btn-brutal-dark">Start building</button>
CSS
/* .btn with a 3px border and every state pinned to one fill; the hard shadow is --bb-shadow, reused as the focus shadow. */
.btn-brutal{--bb-bg:#fff;--bb-ink:#111;--bb-edge:#111;--bb-shadow:5px 5px 0 var(--bb-edge);
  --bs-btn-padding-x:26px;--bs-btn-padding-y:13px;--bs-btn-font-size:.92rem;--bs-btn-font-weight:900;--bs-btn-line-height:1.25;
  --bs-btn-border-width:3px;--bs-btn-border-radius:11px;--bs-btn-border-color:#111;--bs-btn-hover-border-color:#111;--bs-btn-active-border-color:#111;
  --bs-btn-color:var(--bb-ink);--bs-btn-hover-color:var(--bb-ink);--bs-btn-active-color:var(--bb-ink);
  --bs-btn-bg:var(--bb-bg);--bs-btn-hover-bg:var(--bb-bg);--bs-btn-active-bg:var(--bb-bg);
  --bs-btn-focus-box-shadow:var(--bb-shadow);box-shadow:var(--bb-shadow);transition:transform .12s,box-shadow .12s}
.btn-brutal:hover{transform:translate(2px,2px);--bb-shadow:3px 3px 0 var(--bb-edge)}
.btn-brutal:active{transform:translate(5px,5px);--bb-shadow:0 0 0 var(--bb-edge)}
.btn-brutal:focus-visible{outline:3px solid #111;outline-offset:4px}
.btn-brutal-green{--bb-bg:#4ade80}
.btn-brutal-pink{--bb-bg:#ff90e8}
.btn-brutal-sky{--bb-bg:#7dd3fc}
.btn-brutal-yellow{--bb-bg:#fde047;text-transform:uppercase;letter-spacing:.05em}
.btn-brutal-dark{--bb-bg:#111;--bb-ink:#fde047;--bb-edge:#f97316}
@media (prefers-reduced-motion:reduce){.btn-brutal{transition:none}}

Tailwind 4 code

Requires: Tailwind CSS 4

HTML
<button type="button" class="cursor-pointer rounded-[11px] border-[3px] border-[#111] px-[26px] py-[13px] text-[.92rem] leading-[1.25] font-black transition-[translate,box-shadow] duration-[120ms] hover:translate-x-0.5 hover:translate-y-0.5 active:translate-x-[5px] active:translate-y-[5px] focus-visible:outline-[3px] focus-visible:outline-offset-4 focus-visible:outline-[#111] motion-reduce:transition-none shadow-[5px_5px_0_#111] hover:shadow-[3px_3px_0_#111] active:shadow-[0_0_0_#111] bg-[#4ade80] text-[#111]">Sign up free</button>
<button type="button" class="cursor-pointer rounded-[11px] border-[3px] border-[#111] px-[26px] py-[13px] text-[.92rem] leading-[1.25] font-black transition-[translate,box-shadow] duration-[120ms] hover:translate-x-0.5 hover:translate-y-0.5 active:translate-x-[5px] active:translate-y-[5px] focus-visible:outline-[3px] focus-visible:outline-offset-4 focus-visible:outline-[#111] motion-reduce:transition-none shadow-[5px_5px_0_#111] hover:shadow-[3px_3px_0_#111] active:shadow-[0_0_0_#111] bg-[#ff90e8] text-[#111]">See pricing</button>
<button type="button" class="cursor-pointer rounded-[11px] border-[3px] border-[#111] px-[26px] py-[13px] text-[.92rem] leading-[1.25] font-black transition-[translate,box-shadow] duration-[120ms] hover:translate-x-0.5 hover:translate-y-0.5 active:translate-x-[5px] active:translate-y-[5px] focus-visible:outline-[3px] focus-visible:outline-offset-4 focus-visible:outline-[#111] motion-reduce:transition-none shadow-[5px_5px_0_#111] hover:shadow-[3px_3px_0_#111] active:shadow-[0_0_0_#111] bg-[#7dd3fc] text-[#111]">Read the docs</button>
<button type="button" class="cursor-pointer rounded-[11px] border-[3px] border-[#111] px-[26px] py-[13px] text-[.92rem] leading-[1.25] font-black transition-[translate,box-shadow] duration-[120ms] hover:translate-x-0.5 hover:translate-y-0.5 active:translate-x-[5px] active:translate-y-[5px] focus-visible:outline-[3px] focus-visible:outline-offset-4 focus-visible:outline-[#111] motion-reduce:transition-none shadow-[5px_5px_0_#111] hover:shadow-[3px_3px_0_#111] active:shadow-[0_0_0_#111] bg-white text-[#111]">Maybe later</button>
<button type="button" class="cursor-pointer rounded-[11px] border-[3px] border-[#111] px-[26px] py-[13px] text-[.92rem] leading-[1.25] font-black transition-[translate,box-shadow] duration-[120ms] hover:translate-x-0.5 hover:translate-y-0.5 active:translate-x-[5px] active:translate-y-[5px] focus-visible:outline-[3px] focus-visible:outline-offset-4 focus-visible:outline-[#111] motion-reduce:transition-none shadow-[5px_5px_0_#111] hover:shadow-[3px_3px_0_#111] active:shadow-[0_0_0_#111] bg-[#fde047] tracking-[.05em] text-[#111] uppercase">Buy now!</button>
<button type="button" class="cursor-pointer rounded-[11px] border-[3px] border-[#111] px-[26px] py-[13px] text-[.92rem] leading-[1.25] font-black transition-[translate,box-shadow] duration-[120ms] hover:translate-x-0.5 hover:translate-y-0.5 active:translate-x-[5px] active:translate-y-[5px] focus-visible:outline-[3px] focus-visible:outline-offset-4 focus-visible:outline-[#111] motion-reduce:transition-none bg-[#111] text-[#fde047] shadow-[5px_5px_0_#f97316] hover:shadow-[3px_3px_0_#f97316] active:shadow-[0_0_0_#f97316]">Start building</button>

About this set

Flat, loud buttons in the neobrutalist style: a 3 pixel black border, heavy 900 weight labels, bright flat fills and a hard 5 pixel offset shadow with no blur. Hovering slides the button 2 pixels towards its shadow, and pressing slides it the full 5 pixels so the shadow disappears, which reads as a physical click. The set has green Sign up free, pink See pricing, sky Read the docs, a white Maybe later, an uppercase yellow Buy now and a black Start building button whose shadow is orange instead of black. Use them on landing pages, portfolios and indie product sites that already use thick outlines and saturated colour; they clash with soft, shadowed interfaces. The shadow lives in a –bb-shadow custom property that the hover and active states rewrite, so changing the edge colour is one variable, and in the Bootstrap version the same property feeds –bs-btn-focus-box-shadow so the offset shadow stays visible while a button has focus. Black labels on every light fill reach well over 4.5:1, and yellow on black does too.

What’s included

  • 3px border and hard offset shadow with no blur
  • Hover and press slide the button onto its shadow
  • Six fills including an uppercase and a dark variant
  • Edge colour set by one custom property
  • Transitions removed under prefers-reduced-motion

Accessibility

Every button is a native button element with a text label, reachable with Tab and activated with Enter or Space. Focus draws a 3px black outline 4px outside the border, which stays clear of the offset shadow. With prefers-reduced-motion set, hover and press positions change without animating.

Customise it

Set --bb-bg, --bb-ink and --bb-edge on .bb modifiers in plain CSS or on .btn-brutal-* in Bootstrap; the border width is in .bb and --bs-btn-border-width. In Tailwind edit the bg-, text- and shadow-[5px_5px_0_...] utilities.