Opent in een nieuw tabblad

CSS-lab · Kaarten

Glas-kaart (glassmorphism)

Een frosted glass kaart die boven langzaam drijvende kleurblobs zweeft, met een lichte rand en een glansstreep die bij hover over het glas veegt.

  • Gemiddeld
  • Pure CSS
  • MIT-licentie
  • backdrop-filter
  • @supports
  • @keyframes
  • ::before
  • transform
HTML
<div class="gk-scene">
  <span class="gk-blob gk-blob--a" aria-hidden="true"></span>
  <span class="gk-blob gk-blob--b" aria-hidden="true"></span>
  <span class="gk-blob gk-blob--c" aria-hidden="true"></span>
  <article class="gk-card">
    <p class="gk-kicker">Live dashboard</p>
    <h3 class="gk-title">Inzicht zonder ruis</h3>
    <p class="gk-text">Een rustig paneel dat boven kleur zweeft. De achtergrond blijft zichtbaar, de tekst blijft leesbaar.</p>
    <a class="gk-btn" href="#">Bekijk details</a>
  </article>
</div>
CSS
/* Glas-kaart — prefix .gk- */
.gk-scene {
  --blob-a: #2E5BFF;
  --blob-b: #9B5CFF;
  --blob-c: #C6FF3D;
  --speed: 14s;
  position: relative;
  display: grid;
  place-items: center;
  width: min(100%, 440px);
  padding: 28px;
  isolation: isolate;
}

/* kleurblobs achter het glas */
.gk-blob {
  position: absolute;
  z-index: -1;
  border-radius: 50%;
  animation: gk-drift var(--speed) ease-in-out infinite alternate;
}

.gk-blob--a {
  width: 170px;
  height: 170px;
  top: 0;
  left: 4%;
  background: var(--blob-a);
}

.gk-blob--b {
  width: 140px;
  height: 140px;
  bottom: 0;
  right: 6%;
  background: var(--blob-b);
  animation-duration: calc(var(--speed) * 1.3);
  animation-direction: alternate-reverse;
}

.gk-blob--c {
  width: 80px;
  height: 80px;
  top: 42%;
  right: 30%;
  background: var(--blob-c);
  animation-duration: calc(var(--speed) * .8);
}

@keyframes gk-drift {
  to { transform: translate(40px, 24px) scale(1.15); }
}

/* het glaspaneel */
.gk-card {
  --blur: 18px;
  --radius: 20px;
  --accent: #C6FF3D;
  position: relative;
  overflow: hidden;
  width: 100%;
  max-width: 340px;
  padding: 24px 26px 26px;
  border-radius: var(--radius);
  border: 1px solid rgba(255, 255, 255, .22);
  background: rgba(18, 18, 24, .35);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 20px 40px -20px rgba(0, 0, 0, .6);
  color: #F9F8F6;
  -webkit-backdrop-filter: blur(var(--blur)) saturate(160%);
  backdrop-filter: blur(var(--blur)) saturate(160%);
}

/* fallback zonder backdrop-filter */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .gk-card { background: rgba(18, 18, 24, .92); }
}

/* glansstreep */
.gk-card::before {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(115deg, transparent 35%, rgba(255, 255, 255, .28) 50%, transparent 65%);
  transform: translateX(-110%);
  transition: transform .8s cubic-bezier(.2, .7, .2, 1);
  pointer-events: none;
}

.gk-card:hover::before,
.gk-card:focus-within::before {
  transform: translateX(110%);
}

.gk-kicker {
  margin: 0 0 8px;
  font: 600 12px/1 ui-monospace, Menlo, Consolas, monospace;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--accent);
}

.gk-title {
  margin: 0 0 8px;
  font: 800 24px/1.1 "Arial Black", "Helvetica Neue", Impact, system-ui, sans-serif;
}

.gk-text {
  margin: 0 0 18px;
  font-size: 15px;
  line-height: 1.5;
  color: rgba(249, 248, 246, .88);
}

.gk-btn {
  display: inline-flex;
  padding: 10px 18px;
  border-radius: 999px;
  background: var(--accent);
  color: #0C0C0D;
  font-weight: 700;
  font-size: 14px;
  text-decoration: none;
  transition: transform .2s ease;
}

.gk-btn:hover {
  transform: translateY(-2px);
}

.gk-btn:focus-visible {
  outline: 2px solid #F9F8F6;
  outline-offset: 3px;
}

@media (prefers-reduced-motion: reduce) {
  .gk-blob { animation: none; }
  .gk-card::before {
    transform: none;
    opacity: 0;
    transition: opacity .3s ease;
  }
  .gk-card:hover::before,
  .gk-card:focus-within::before {
    transform: none;
    opacity: 1;
  }
  .gk-btn { transition: none; }
  .gk-btn:hover { transform: none; }
}

Wat het is en waar je het gebruikt

Glassmorphism is de stijl waarin een paneel eruitziet als mat glas: wat erachter ligt, schemert wazig door. Deze glas-kaart zweeft boven drie kleurblobs in cobalt, sunset violet en acid lime die heel langzaam bewegen. Daardoor verandert het glas subtiel van kleur, ook als niemand de kaart aanraakt. Bij hover of focus veegt er een lichtstreep over het oppervlak, alsof je het glas kantelt in het licht.

Gebruik hem voor een feature-blok, een dashboard-teaser, een nieuwsbrief-aanmelding of een uitgelichte quote op een donkere sectie. Hij werkt het best op een achtergrond met kleur; op een egale vlakte heeft glas niets om te vervormen.

Zo werkt het

  • Het glas: backdrop-filter: blur(var(--blur)) saturate(160%) vervaagt en verzadigt alles achter de kaart. Een halfdoorzichtige donkere tint (rgba(18, 18, 24, .35)) houdt de witte tekst leesbaar, ook als er een lichtgekleurde blob achter valt.
  • De rand: een 1px rand in wit met lage opacity plus een inset-schaduw aan de bovenkant geeft het effect van een geslepen glasrand.
  • De blobs: drie .gk-blob-elementen met border-radius: 50% en een eigen @keyframes gk-drift, elk met een andere duur en animation-direction. Zo lopen ze nooit synchroon.
  • De glans: .gk-card::before is een schuine linear-gradient die buiten de kaart wacht. Bij :hover en :focus-within schuift hij met transform: translateX() van links naar rechts; overflow: hidden houdt hem binnen de afgeronde hoeken.

Aanpassen

Op .gk-scene staan --blob-a, --blob-b en --blob-c voor de kleuren van de blobs en --speed voor hun tempo. Op de kaart zelf regel je met --blur hoe mat het glas is en met --radius de hoekafronding. --accent bepaalt de knop- en kickerkleur. Meer blur maakt het glas rustiger; minder blur laat de vormen herkenbaar doorschemeren.

Toegankelijkheid en browsersupport

backdrop-filter werkt in actuele Chrome, Edge, Firefox en Safari; voor oudere Safari staat -webkit-backdrop-filter erbij. Via @supports not krijgt een browser zonder ondersteuning een vrijwel dichte donkere kaart, zodat het contrast nooit wegvalt. De blobs zijn aria-hidden="true", de knop is een echte link met een duidelijke :focus-visible-ring. Met prefers-reduced-motion staan de blobs stil en verschijnt de glans als zachte fade in plaats van een veeg. Let op: veel grote blur-lagen op één pagina kosten rekenkracht op zwakke telefoons, dus gebruik dit effect gericht.

Verder lezen

Zo’n glansstreep is een klassieke microinteractie. In ons artikel over microinteracties in UX lees je wanneer zulke details helpen en wanneer ze afleiden. Wil je dit soort beweging in je eigen site, bekijk dan interactief webdesign en animaties.