Opent in een nieuw tabblad

CSS-lab · Kaarten

Brutalist kaart

Een kaart met dikke rand, harde offset-schaduw, nummerlabel en tags. Bij hover schuift hij diagonaal omhoog en groeit de schaduw mee.

  • Beginner
  • Pure CSS
  • MIT-licentie
  • box-shadow
  • transform
  • calc()
  • transition
  • ::after
HTML
<article class="bkr-card">
  <span class="bkr-num" aria-hidden="true">01</span>
  <div class="bkr-tags">
    <span class="bkr-tag">Strategie</span>
    <span class="bkr-tag">Branding</span>
  </div>
  <h3 class="bkr-title"><a class="bkr-link" href="#">Een merk dat niet fluistert</a></h3>
  <p class="bkr-text">Van positionering tot beeldtaal: één systeem dat op elk scherm hetzelfde verhaal vertelt.</p>
  <span class="bkr-cta" aria-hidden="true">Lees case <span class="bkr-arrow">→</span></span>
</article>
CSS
/* Brutalist kaart — prefix .bkr- */
.bkr-card {
  --ink: #0C0C0D;
  --surface: #FFFFFF;
  --accent: #C6FF3D;
  --focus: #2E5BFF;
  --shift: 6px;
  --speed: 220ms;
  position: relative;
  width: min(100%, 340px);
  padding: 22px 24px 24px;
  background: var(--surface);
  color: var(--ink);
  border: 3px solid var(--ink);
  /* harde schaduw zonder blur */
  box-shadow: var(--shift) var(--shift) 0 var(--ink);
  font-family: system-ui, sans-serif;
  transition:
    transform var(--speed) cubic-bezier(.2, .8, .2, 1),
    box-shadow var(--speed) cubic-bezier(.2, .8, .2, 1);
}

/* kaart rijst op, schaduw groeit mee */
.bkr-card:hover,
.bkr-card:focus-within {
  transform: translate(-4px, -4px);
  box-shadow: calc(var(--shift) + 6px) calc(var(--shift) + 6px) 0 var(--ink);
}

/* vastgeniet nummerlabel */
.bkr-num {
  position: absolute;
  top: -3px;
  right: -3px;
  padding: 6px 10px;
  background: var(--accent);
  border: 3px solid var(--ink);
  font: 700 14px/1 ui-monospace, Menlo, Consolas, monospace;
}

.bkr-tags {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-bottom: 14px;
}

.bkr-tag {
  padding: 3px 8px;
  border: 2px solid var(--ink);
  font: 700 11px/1.2 ui-monospace, Menlo, Consolas, monospace;
  letter-spacing: .06em;
  text-transform: uppercase;
}

.bkr-title {
  margin: 0 0 8px;
  font-family: "Arial Black", "Helvetica Neue", Impact, system-ui, sans-serif;
  font-size: 22px;
  line-height: 1.05;
  text-transform: uppercase;
}

.bkr-link {
  color: inherit;
  text-decoration: none;
}

/* hele kaart klikbaar */
.bkr-link::after {
  content: "";
  position: absolute;
  inset: 0;
}

.bkr-link:focus-visible {
  outline: none;
}

.bkr-link:focus-visible::after {
  outline: 3px solid var(--focus);
  outline-offset: 6px;
}

.bkr-text {
  margin: 0 0 16px;
  font-size: 15px;
  line-height: 1.5;
  color: #2A2A2D;
}

/* marker-CTA die volloopt */
.bkr-cta {
  display: inline-flex;
  gap: 6px;
  padding: 2px 4px;
  background: linear-gradient(var(--accent), var(--accent)) 0 100% / 100% 35% no-repeat;
  font: 700 13px/1.4 ui-monospace, Menlo, Consolas, monospace;
  text-transform: uppercase;
  transition: background-size var(--speed) ease;
}

.bkr-arrow {
  transition: transform var(--speed) ease;
}

.bkr-card:hover .bkr-cta,
.bkr-card:focus-within .bkr-cta {
  background-size: 100% 100%;
}

.bkr-card:hover .bkr-arrow,
.bkr-card:focus-within .bkr-arrow {
  transform: translateX(4px);
}

@media (prefers-reduced-motion: reduce) {
  .bkr-card,
  .bkr-cta,
  .bkr-arrow {
    transition: none;
  }
  .bkr-card:hover,
  .bkr-card:focus-within {
    transform: none;
  }
  .bkr-card:hover .bkr-arrow,
  .bkr-card:focus-within .bkr-arrow {
    transform: none;
  }
}

Wat het is en waar je het gebruikt

Deze brutalist kaart is een contentblok dat niet probeert te verdwijnen in de achtergrond. Een rand van 3px, een harde schaduw zonder blur, een nummer in een acid-label en een rij tags in monospace: alles is zichtbaar opgebouwd uit rechte lijnen en vlakke kleur. Bij hover of toetsenbordfocus schuift de kaart een paar pixels diagonaal omhoog terwijl de schaduw dieper wordt, waardoor hij letterlijk van de pagina loskomt.

Je gebruikt hem voor cases, diensten, blogoverzichten of een featured item in een raster. Omdat de hele kaart klikbaar is via één echte link, werkt hij prettig in grids met drie of vier kolommen.

Zo werkt het

  • Harde schaduw: box-shadow: var(--shift) var(--shift) 0 var(--ink) heeft geen blur, dus je krijgt een massief blok achter de kaart. Bij :hover en :focus-within tellen we er met calc() 6px bij op en verschuift transform: translate(-4px, -4px) de kaart zelf. Samen lijkt het alsof de kaart oprijst.
  • Volledig klikbare kaart: de link in de titel krijgt een ::after met position: absolute; inset: 0. Zo is het hele vlak aanklikbaar, maar leest een screenreader maar één linktekst.
  • Nummerlabel: .bkr-num staat absoluut op de rechterbovenhoek en overlapt de rand met een negatieve offset, zodat het lijkt vastgeniet.
  • Marker-CTA: de tekst “Lees case” heeft een linear-gradient als achtergrond van 35% hoog. Bij hover groeit background-size naar 100% en schuift de pijl op.

Aanpassen

Op .bkr-card staan de variabelen. Met --ink wijzig je rand, schaduw en tekst, met --surface de kaartkleur en met --accent het nummerlabel en de marker. --shift bepaalt hoe diep de ruststand-schaduw is en --speed de duur van de beweging. Wil je meer drama, zet dan --shift op 10px en maak de rand 4px.

Toegankelijkheid en browsersupport

De kaart is een <article> met een echte kop en een echte <a href>. Het nummer is decoratief en heeft aria-hidden="true", net als de CTA-tekst, omdat de titel al de link is. De focusring staat via :focus-visible op het hele kaartvlak in cobalt. Met prefers-reduced-motion: reduce blijft de kaart op zijn plek en verandert alleen de schaduw. Alles werkt in alle actuele browsers; er zit niets experimenteels in.

Verder lezen

Benieuwd waarom deze rauwe stijl zo goed werkt? Lees ons artikel over brutalistisch webdesign. Wil je zo’n eigenwijze uitstraling voor je hele site, kijk dan wat we doen in webdesign.