Opent in een nieuw tabblad

CSS-lab · Kaarten

Prijs-kaart met acid accent

Een uitgelichte pricing-kaart in carbon met een schuine Populair-ribbon, een checklist met acid vinkjes en een hover-lift met lichtgevende rand.

  • Beginner
  • Pure CSS
  • MIT-licentie
  • position: absolute
  • transform: rotate
  • overflow: hidden
  • ::before
  • box-shadow
HTML
<article class="pk-card">
  <span class="pk-ribbon">Populair</span>
  <p class="pk-plan">Groei</p>
  <p class="pk-price"><span class="pk-from">Vanaf</span> €—<span class="pk-per">/maand</span></p>
  <ul class="pk-list">
    <li>Maatwerk webdesign</li>
    <li>Animaties & microinteracties</li>
    <li>Technische SEO-basis</li>
  </ul>
  <a class="pk-btn" href="#">Plan een gesprek</a>
</article>
CSS
/* Prijs-kaart — prefix .pk- */
.pk-card {
  --ink: #0C0C0D;
  --paper: #F9F8F6;
  --accent: #C6FF3D;
  --lift: 6px;
  --speed: 240ms;
  position: relative;
  overflow: hidden;
  width: min(100%, 320px);
  padding: 26px 26px 24px;
  border: 2px solid var(--ink);
  border-radius: 14px;
  background: var(--ink);
  color: var(--paper);
  font-family: system-ui, sans-serif;
  transition:
    transform var(--speed) cubic-bezier(.2, .8, .2, 1),
    box-shadow var(--speed) ease;
}

/* lift + acid ring */
.pk-card:hover,
.pk-card:focus-within {
  transform: translateY(calc(var(--lift) * -1));
  box-shadow:
    0 0 0 4px var(--accent),
    0 26px 40px -20px rgba(12, 12, 13, .55);
}

/* schuine ribbon in de hoek */
.pk-ribbon {
  position: absolute;
  top: 22px;
  right: -46px;
  width: 170px;
  padding: 6px 0;
  background: var(--accent);
  color: #0C0C0D;
  text-align: center;
  font: 800 12px/1 ui-monospace, Menlo, Consolas, monospace;
  letter-spacing: .12em;
  text-transform: uppercase;
  transform: rotate(40deg);
}

.pk-plan {
  margin: 0 0 6px;
  font: 700 13px/1 ui-monospace, Menlo, Consolas, monospace;
  letter-spacing: .1em;
  text-transform: uppercase;
  opacity: .75;
}

.pk-price {
  margin: 0 0 18px;
  font: 900 40px/1 "Arial Black", "Helvetica Neue", Impact, system-ui, sans-serif;
  font-variant-numeric: tabular-nums;
}

.pk-from,
.pk-per {
  font: 500 14px/1 system-ui, sans-serif;
  opacity: .75;
}

.pk-list {
  display: grid;
  gap: 10px;
  margin: 0 0 22px;
  padding: 0;
  list-style: none;
  font-size: 15px;
}

.pk-list li {
  position: relative;
  padding-left: 26px;
}

/* vinkje uit twee randen */
.pk-list li::before {
  content: "";
  position: absolute;
  left: 4px;
  top: 2px;
  width: 6px;
  height: 12px;
  border-right: 3px solid var(--accent);
  border-bottom: 3px solid var(--accent);
  transform: rotate(45deg);
}

.pk-btn {
  display: block;
  padding: 13px 16px;
  border-radius: 8px;
  background: var(--accent);
  color: #0C0C0D;
  text-align: center;
  font-weight: 800;
  text-decoration: none;
  transition: background-color var(--speed) ease;
}

.pk-btn:hover {
  background: #F9F8F6;
}

.pk-btn:focus-visible {
  outline: 3px solid var(--accent);
  outline-offset: 3px;
}

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

Wat het is en waar je het gebruikt

Op een prijspagina wil je dat één pakket opvalt. Deze prijs-kaart doet dat zonder schreeuwerige gradients: een donkere carbon kaart op een lichte achtergrond, een schuine acid ribbon met “Populair” in de hoek en een checklist met zelfgetekende vinkjes. Bij hover of focus komt de kaart een stukje omhoog en krijgt hij een acid ring, zodat duidelijk is welk pakket je bekijkt.

Zet hem tussen twee lichtere kaarten in een prijsoverzicht, of gebruik hem los als één duidelijke offerte-CTA. In de demo staat bewust “Vanaf €—”: vul je eigen bedrag in.

Zo werkt het

  • De ribbon: .pk-ribbon staat absoluut in de rechterbovenhoek, is 170px breed en draait met transform: rotate(40deg). Omdat de kaart overflow: hidden heeft, worden de uiteinden netjes afgesneden en lijkt het een lint om de hoek.
  • Custom bullets: de lijst heeft list-style: none. Elk li::before is een klein vlak met alleen een rechter- en onderrand in --accent, gedraaid met rotate(45deg). Zo ontstaat een vinkje zonder icoonfont of afbeelding.
  • Hover-lift: .pk-card:hover en .pk-card:focus-within combineren translateY() met twee schaduwen: een ring van 4px in acid en een zachte drop-shadow. Een transition op transform en box-shadow maakt het vloeiend.
  • De prijs: het grote getal gebruikt een display-stack en font-variant-numeric: tabular-nums, zodat bedragen in naast elkaar staande kaarten gelijk uitlijnen.

Aanpassen

Op .pk-card staan --ink (kaartkleur), --paper (tekst), --accent (ribbon, vinkjes, knop en ring) en --lift voor hoe hoog de kaart opkomt. --speed regelt de duur van de beweging. Voor een lichte variant draai je --ink en --paper om; de ribbon houdt dan vanzelf zijn donkere tekst op acid.

Toegankelijkheid en browsersupport

De ribbon is echte tekst en wordt dus voorgelezen; zo weet ook een screenreadergebruiker welk pakket wordt aanbevolen. De vinkjes zijn pseudo-elementen en worden niet voorgelezen; de lijst blijft een echte <ul>. De knop is een echte link met een acid :focus-visible-ring op de donkere kaart. Off-white op carbon en carbon op acid halen ruim voldoende contrast. Met prefers-reduced-motion blijft alleen de ring over, zonder lift. Werkt in alle actuele browsers.

Verder lezen

Zet je meerdere van deze kaarten naast elkaar, dan zijn container queries handig om de layout per kaartbreedte te regelen. Lees hoe dat werkt in container queries uitgelegd. Een prijspagina die echt overtuigt, maken we graag samen met je via webdesign.