Opent in een nieuw tabblad

CSS-lab · Knoppen

Roterende gradient-rand

Een donkere knop met een rand van sunset-violet, cobalt en acid lime die continu rond blijft draaien. Werkt zonder @property.

  • Gemiddeld
  • Pure CSS
  • MIT-licentie
  • conic-gradient
  • ::before/::after
  • @keyframes rotate
  • aspect-ratio
  • isolation
HTML
<button type="button" class="gb-btn">Ontdek het lab</button>
CSS
/* Roterende gradient-rand - prefix .gb- */
.gb-btn {
  --c1: #9B5CFF;
  --c2: #2E5BFF;
  --c3: #C6FF3D;
  --bg: #0C0C0D;
  --ink: #F9F8F6;
  --border: 2px;
  --radius: 14px;
  --speed: 4s;
  position: relative;
  isolation: isolate;
  overflow: hidden;
  padding: 20px 42px;
  font: 600 1.05rem/1 system-ui, sans-serif;
  letter-spacing: 0.02em;
  color: var(--ink);
  background: var(--bg);
  border: 0;
  border-radius: var(--radius);
  cursor: pointer;
}

/* Groot draaiend vlak met de conic-gradient */
.gb-btn::before {
  content: "";
  position: absolute;
  z-index: -2;
  top: 50%;
  left: 50%;
  width: 200%;
  aspect-ratio: 1;
  background: conic-gradient(var(--c1), var(--c2), var(--c3), var(--c1));
  transform: translate(-50%, -50%) rotate(0turn);
  animation: gb-spin var(--speed) linear infinite;
}

/* Masker: laat alleen de rand zien */
.gb-btn::after {
  content: "";
  position: absolute;
  z-index: -1;
  inset: var(--border);
  border-radius: calc(var(--radius) - var(--border));
  background: var(--bg);
  transition: opacity 0.35s ease;
}

/* Hover: gradient schijnt door */
.gb-btn:hover::after {
  opacity: 0.82;
}

.gb-btn:focus-visible {
  outline: 2px solid var(--c3);
  outline-offset: 4px;
}

@keyframes gb-spin {
  to {
    transform: translate(-50%, -50%) rotate(1turn);
  }
}

@media (prefers-reduced-motion: reduce) {
  .gb-btn::before {
    animation: none;
  }

  .gb-btn::after {
    transition: none;
  }
}

Wat het is en waar je het gebruikt

Deze knop heeft een rand die nooit stilstaat. Een conic-gradient van sunset violet via cobalt naar acid lime draait rustig rond de knop, alsof er licht langs de rand loopt. Bij hover wordt de binnenkant iets doorschijnend, zodat de kleuren erdoorheen gloeien en de knop oplicht.

Je gebruikt hem als blikvanger in een donkere hero, voor een lancering of aanmelding, of als ‘nieuw’-actie in een dashboard. Omdat de beweging continu is, valt de knop ook op zonder dat iemand eroverheen beweegt.

Zo werkt het

  • Een draaiende rand maak je meestal door de hoek van een conic-gradient te animeren via @property. Dat werkt niet in elke context, onder andere niet in shadow DOM. Daarom draait hier niet de gradient maar het element zelf.
  • .gb-btn::before is een groot vierkant (width: 200%, aspect-ratio: 1) met een conic-gradient, gecentreerd met translate(-50%, -50%). De keyframes gb-spin roteren het met rotate(1turn).
  • .gb-btn::after ligt daarboven met inset: var(--border) en de achtergrondkleur. Het werkt als masker: alleen een smalle rand van de draaiende gradient blijft zichtbaar.
  • overflow: hidden en border-radius op de knop knippen het vierkant af. isolation: isolate houdt de negatieve z-index van beide lagen binnen de knop, onder het label.
  • Bij :hover wordt het masker iets transparanter, zodat de gradient zacht door de knop heen schijnt.

Aanpassen

Op .gb-btn stel je met --c1, --c2 en --c3 de drie kleuren van de rand in. --bg is de binnenkleur van de knop en --ink de tekstkleur. Met --border bepaal je de dikte van de rand en met --radius de afronding. Het masker rekent zijn eigen radius automatisch uit. --speed is de tijd voor één volledige omwenteling. Wil je een ‘komeet’ in plaats van een volle regenboog, zet dan een paar stops in de gradient op transparent.

Toegankelijkheid en browsersupport

Het is een echte <button> met off-white tekst op bijna-zwart, dus het contrast is hoog. Ook bij de doorschijnende hover blijft het label goed leesbaar. Focus krijgt een outline in acid lime. Met prefers-reduced-motion stopt de rotatie en blijft er een statische, kleurrijke rand over. Omdat de truc met een geroteerd pseudo-element werkt in plaats van met @property, draait de rand in alle actuele versies van Chrome, Edge, Firefox en Safari.

Verder lezen

Meer knoppen met karakter vind je in ons artikel over CSS-knoppen en hover-effecten. Wil je bewegende details in je eigen site? Bekijk onze aanpak voor interactief webdesign en animaties.