Design · Bausteine-Dossier

Kategorie

Hover-Effekte

Spürbar, aber edel — nie nur ein Standard-Hover. Jeder Baustein ist in sich abgeschlossen (eigenes scoped CSS) und direkt einsetzbar.

Karte: Hintergrund dunkel → hell

Pol 1 · Craft Anlass: Leistungs-/Feature-Karten

Dezent genug auch für Kundenseiten. Vorbild: animate-ui, Sektion „Other animated distributions". Reagiert auch auf Tastatur-Fokus eines Links in der Karte (:focus-within).

Möbelmontage

Schrank, Bett, Regal – fachgerecht aufgebaut.

<div class="fx-fade-card">
  <h3>Möbelmontage</h3>
  <p>Schrank, Bett, Regal – fachgerecht aufgebaut.</p>
</div>

<style>
.fx-fade-card{background:#17171b;color:#e7e7ea;padding:1.5rem 1.75rem;border-radius:14px;
  border:1px solid #26262c;width:240px;cursor:pointer;
  transition:background .3s ease,border-color .3s ease,transform .3s ease}
.fx-fade-card:hover,.fx-fade-card:focus-within{background:#f4f4f5;color:#17171b;border-color:#f4f4f5;transform:translateY(-2px)}
.fx-fade-card h3{margin:0 0 .4rem;font-size:1.05rem}
.fx-fade-card p{margin:0;font-size:.9rem;color:#a1a1aa;transition:color .3s ease}
.fx-fade-card:hover p,.fx-fade-card:focus-within p{color:#52525b}
@media (prefers-reduced-motion:reduce){.fx-fade-card{transition:none}}
</style>

Glas-Overlay über Bild/Karte

Pol 1 · Craft Anlass: Projekt-/Referenz-Galerie

Mattglas legt sich beim Hover über die Kachel. Sparsam einsetzen. Vorbild: aceternity, Sektion „Projects". (Hintergrund hier als Verlauf statt echtem Bild — DSGVO/offline-sicher.)

Projekt ansehen
<div class="fx-glass-card">
  <!-- statt Verlauf hier ein <img> einsetzen -->
  <div class="fx-glass-overlay"><span>Projekt ansehen</span></div>
</div>

<style>
.fx-glass-card{position:relative;width:260px;height:170px;border-radius:16px;overflow:hidden;
  cursor:pointer;background:linear-gradient(135deg,#3b3b52,#1c1c2b)}
.fx-glass-overlay{position:absolute;inset:0;display:grid;place-items:center;color:#fff;
  font-weight:600;letter-spacing:.02em;background:rgba(255,255,255,.08);
  -webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);
  opacity:0;transition:opacity .35s ease}
.fx-glass-card:hover .fx-glass-overlay,.fx-glass-card:focus-within .fx-glass-overlay{opacity:1}
@media (prefers-reduced-motion:reduce){.fx-glass-overlay{transition:none}}
</style>

Info-Ausklappen beim Hover

Pol 1 · Craft Anlass: FAQ, Leistungs-Teaser, Specs

Sanftes Aufklappen über den grid-rows-Trick (animierbare Höhe ohne JS). Vorbild: aceternity „Always Pushing the Boundaries…". Hinweis: am Handy gibt es kein Hover — dort besser per Klick/Akkordeon lösen.

Küchenmontage

Anschluss von Spüle, Geräten und Arbeitsplatte inklusive.

<div class="fx-reveal-card">
  <h3>Küchenmontage</h3>
  <div class="fx-reveal-more"><div>
    <p>Anschluss von Spüle, Geräten und Arbeitsplatte inklusive.</p>
  </div></div>
</div>

<style>
.fx-reveal-card{width:260px;background:#17171b;border:1px solid #26262c;border-radius:14px;
  padding:1.25rem 1.5rem;color:#e7e7ea;cursor:pointer}
.fx-reveal-card h3{margin:0;font-size:1.05rem}
.fx-reveal-more{display:grid;grid-template-rows:0fr;transition:grid-template-rows .35s ease}
.fx-reveal-more > div{overflow:hidden}
.fx-reveal-card:hover .fx-reveal-more,.fx-reveal-card:focus-within .fx-reveal-more{grid-template-rows:1fr}
.fx-reveal-more p{margin:.75rem 0 0;font-size:.88rem;color:#a1a1aa}
@media (prefers-reduced-motion:reduce){.fx-reveal-more{transition:none}}
</style>

Shine-Sweep (Lichtschleier)

Pol 1 · Craft Anlass: Primary-CTA, Highlight-Karte

Elementunabhängige Utility-Klasse: ein diagonaler Lichtschleier wandert einmal über das Element. Per ::before + overflow:hidden + isolation sauber gekapselt — funktioniert auf Buttons wie auf Karten. Vorbild: NDS (systemweite Hover-Utilities).

<a href="#" class="fx-shine fx-shine-btn"><span>Termin anfragen</span></a>

<style>
/* Utility — auf beliebiges Element legbar */
.fx-shine{position:relative;overflow:hidden;isolation:isolate}
.fx-shine::before{content:"";position:absolute;top:0;bottom:0;left:-140%;width:130%;
  z-index:1;pointer-events:none;
  background:linear-gradient(110deg,transparent 0%,transparent 30%,
    rgba(255,255,255,.08) 42%,rgba(255,255,255,.16) 50%,rgba(255,255,255,.08) 58%,
    transparent 70%,transparent 100%)}
.fx-shine:hover::before,.fx-shine:focus-visible::before{animation:fxShine 1.1s ease-out forwards}
.fx-shine > *{position:relative;z-index:2}
@keyframes fxShine{0%{left:-140%;opacity:0}12%{opacity:1}88%{opacity:1}100%{left:150%;opacity:0}}

/* Demo-Hülle */
.fx-shine-btn{display:inline-block;padding:.85rem 1.6rem;border-radius:10px;cursor:pointer;
  border:1px solid #26262c;background:#17171b;color:#f4f4f5;font-size:.95rem;font-weight:600;
  letter-spacing:.01em;text-decoration:none}
.fx-shine-btn:focus-visible{outline:2px solid var(--akzent,#7c87ff);outline-offset:2px}
@media (prefers-reduced-motion:reduce){.fx-shine::before{animation:none}}
</style>

Puls-Glow (Lift + atmender Schein)

Pol 1 · Craft Anlass: Aufmerksamkeits-CTA, Aktions-Button

Utility-Klasse .fx-blink: beim Hover hebt sich das Element leicht an und ein eng anliegender Glow pulsiert in der Akzentfarbe. Bewusst sparsam einsetzen — höchstens ein Element pro Ansicht. Vorbild: NDS (systemweite Hover-Utilities).

<a href="#" class="fx-blink fx-blink-btn">Jetzt sichern</a>

<style>
/* Utility — auf beliebiges Element legbar */
.fx-blink{transition:transform .28s ease,border-color .28s ease}
.fx-blink:hover,.fx-blink:focus-visible{transform:translateY(-3px);
  border-color:var(--akzent,#7c87ff);animation:fxBlink 2s ease-in-out infinite}
@keyframes fxBlink{
  0%,100%{box-shadow:0 0 0 1px rgba(124,135,255,.18),0 0 6px 1px rgba(124,135,255,.16),
    inset 0 1px 0 rgba(255,255,255,.05)}
  50%{box-shadow:0 0 0 1px rgba(124,135,255,.40),0 0 14px 2px rgba(124,135,255,.32),
    inset 0 1px 0 rgba(255,255,255,.12)}}

/* Demo-Hülle */
.fx-blink-btn{display:inline-block;padding:.85rem 1.6rem;border-radius:10px;cursor:pointer;
  border:1px solid #26262c;background:#17171b;color:#f4f4f5;font-size:.95rem;font-weight:600;
  text-decoration:none}
@media (prefers-reduced-motion:reduce){
  .fx-blink:hover,.fx-blink:focus-visible{transform:none;animation:none}}
</style>

Feature-Box: Scale-Hover

Pol 2 · Klarheit Anlass: Leistungs-/Feature-Raster

Ruhiger Vergrößerungs-Hover (scale(1.03)) mit Border-Wechsel zur Akzentfarbe. Der Effekt ist in @media (hover:hover) gekapselt (kein „Hängenbleiben" auf Touch) und in prefers-reduced-motion neutralisiert. Vorbild: Hauszeit (Feature-Karten).

Festpreis-Garantie

Kein Stundenlohn-Risiko – der Preis steht vorab.

<div class="fx-feature" tabindex="0">
  <span class="fx-feature-ic" aria-hidden="true"><!-- Icon-SVG --></span>
  <div>
    <h3>Festpreis-Garantie</h3>
    <p>Kein Stundenlohn-Risiko – der Preis steht vorab.</p>
  </div>
</div>

<style>
.fx-feature{display:flex;gap:14px;width:300px;padding:22px;border-radius:14px;cursor:pointer;
  background:#16161a;border:1px solid #26262c;
  transition:transform .28s ease,box-shadow .28s ease,border-color .28s ease;will-change:transform}
.fx-feature h3{margin:0 0 .3rem;font-size:1rem;color:#f4f4f5}
.fx-feature p{margin:0;font-size:.88rem;color:#a1a1aa}
.fx-feature-ic{flex:0 0 auto;width:38px;height:38px;border-radius:10px;display:grid;place-items:center;
  background:rgba(124,135,255,.12);color:var(--akzent,#7c87ff)}
@media (hover:hover){
  .fx-feature:hover{transform:scale(1.03);border-color:var(--akzent,#7c87ff);
    box-shadow:0 12px 28px rgba(0,0,0,.35);z-index:2}}
.fx-feature:focus-visible{transform:scale(1.03);border-color:var(--akzent,#7c87ff);
  box-shadow:0 12px 28px rgba(0,0,0,.35);outline:none}
@media (prefers-reduced-motion:reduce){
  .fx-feature{transition:none}
  .fx-feature:hover,.fx-feature:focus-visible{transform:none}}
</style>

Rotations-Hover (runder Button)

Pol 2 · Klarheit Anlass: Schließen-Button, Icon-Aktion

Runder Icon-Button, der beim Hover um 90° dreht und aufhellt — klassisch für Modal-Schließen oder Toggle-Aktionen. Vorbild: Silver Mountain (Event-Modal-Close).

<button type="button" class="fx-rotate" aria-label="Schließen">
  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
       stroke-linecap="round" stroke-linejoin="round"><path d="M18 6 6 18M6 6l12 12"/></svg>
</button>

<style>
.fx-rotate{width:40px;height:40px;border-radius:50%;cursor:pointer;
  display:inline-flex;align-items:center;justify-content:center;
  background:rgba(255,255,255,.06);border:1px solid #26262c;color:#a1a1aa;
  transition:background .2s ease,border-color .2s ease,color .2s ease,transform .2s ease}
.fx-rotate svg{width:18px;height:18px;display:block}
.fx-rotate:hover,.fx-rotate:focus-visible{background:rgba(124,135,255,.14);
  border-color:var(--akzent,#7c87ff);color:#f4f4f5;transform:rotate(90deg);outline:none}
@media (prefers-reduced-motion:reduce){
  .fx-rotate{transition:none}
  .fx-rotate:hover,.fx-rotate:focus-visible{transform:none}}
</style>

Tooltip mit Pfeil (reines CSS)

Pol 1 · Craft Anlass: Hilfe-Hinweis, Icon-Erklärung

Beim Hover oder Tastatur-Fokus erscheint über dem Auslöser ein Tooltip mit kleinem Pfeil — sanft einblendend und leicht aufsteigend. Kein JS. A11y: Auslöser ist fokussierbar, das Tooltip-Element trägt role="tooltip" und ist per aria-describedby verknüpft; es reagiert auf :hover und :focus-visible. Vorbild: animate-ui „Tooltip".

Kurzer Hinweis, der den Auslöser erklärt.
<span class="fx-tip">
  <button type="button" class="fx-tip-trigger" aria-describedby="tip-hilfe">Was ist das?</button>
  <span class="fx-tip-bubble" role="tooltip" id="tip-hilfe">Kurzer Hinweis, der den Auslöser erklärt.</span>
</span>

<style>
.fx-tip{position:relative;display:inline-block}
.fx-tip-trigger{display:inline-flex;align-items:center;gap:.5rem;cursor:pointer;
  padding:.7rem 1.3rem;border-radius:10px;border:1px solid #26262c;background:#17171b;
  color:#f4f4f5;font:inherit;font-size:.95rem;font-weight:600}
.fx-tip-trigger:focus-visible{outline:2px solid var(--akzent,#7c87ff);outline-offset:2px}
.fx-tip-bubble{position:absolute;left:50%;bottom:calc(100% + 10px);transform:translate(-50%,4px);
  width:max-content;max-width:220px;padding:.55rem .8rem;border-radius:8px;
  background:#26262c;border:1px solid #3a3a42;color:#f4f4f5;font-size:.82rem;line-height:1.4;
  text-align:center;box-shadow:0 8px 20px rgba(0,0,0,.4);pointer-events:none;z-index:5;
  opacity:0;transition:opacity .2s ease,transform .2s ease}
.fx-tip-bubble::after{content:"";position:absolute;left:50%;top:100%;width:9px;height:9px;
  margin-left:-4.5px;margin-top:-5px;background:#26262c;border-right:1px solid #3a3a42;
  border-bottom:1px solid #3a3a42;transform:rotate(45deg)}
.fx-tip-trigger:hover + .fx-tip-bubble,
.fx-tip-trigger:focus-visible + .fx-tip-bubble{opacity:1;transform:translate(-50%,0)}
@media (prefers-reduced-motion:reduce){
  .fx-tip-bubble{transition:opacity .2s ease;transform:translate(-50%,0)}
  .fx-tip-trigger:hover + .fx-tip-bubble,
  .fx-tip-trigger:focus-visible + .fx-tip-bubble{transform:translate(-50%,0)}}
</style>

Tooltip in vier Richtungen

Pol 1 · Craft Anlass: kompakte UI-Hinweise, Toolbars

Dieselbe Mechanik wie oben, aber die Position wird per Modifier-Klasse umgestellt: --top, --right, --bottom, --left. Pfeil und Einblende-Richtung passen sich jeweils an. Gleiche A11y-Regeln (role="tooltip" + aria-describedby, :hover und :focus-visible), reduced-motion neutralisiert die Bewegung. Reines CSS.

Tooltip oben Tooltip rechts Tooltip unten Tooltip links
<span class="fx-tip4 fx-tip4--top">
  <button type="button" class="fx-tip4-trigger" aria-describedby="tip4-o">oben</button>
  <span class="fx-tip4-bubble" role="tooltip" id="tip4-o">Tooltip oben</span>
</span>
<!-- Richtung per Modifier: fx-tip4--top | --right | --bottom | --left -->

<style>
.fx-tip4{position:relative;display:inline-block}
.fx-tip4-trigger{display:inline-flex;align-items:center;justify-content:center;cursor:pointer;
  width:44px;height:44px;border-radius:10px;border:1px solid #26262c;background:#17171b;
  color:#f4f4f5;font:inherit;font-size:.85rem;font-weight:600}
.fx-tip4-trigger:focus-visible{outline:2px solid var(--akzent,#7c87ff);outline-offset:2px}
.fx-tip4-bubble{position:absolute;width:max-content;max-width:180px;padding:.5rem .7rem;
  border-radius:8px;background:#26262c;border:1px solid #3a3a42;color:#f4f4f5;font-size:.8rem;
  line-height:1.4;text-align:center;box-shadow:0 8px 20px rgba(0,0,0,.4);pointer-events:none;
  z-index:5;opacity:0;transition:opacity .2s ease,transform .2s ease}
.fx-tip4-bubble::after{content:"";position:absolute;width:9px;height:9px;background:#26262c;
  border:1px solid #3a3a42;border-top:none;border-left:none}
/* oben */
.fx-tip4--top .fx-tip4-bubble{left:50%;bottom:calc(100% + 10px);transform:translate(-50%,4px)}
.fx-tip4--top .fx-tip4-bubble::after{left:50%;top:100%;margin-left:-4.5px;margin-top:-5px;transform:rotate(45deg)}
.fx-tip4--top .fx-tip4-trigger:hover + .fx-tip4-bubble,
.fx-tip4--top .fx-tip4-trigger:focus-visible + .fx-tip4-bubble{opacity:1;transform:translate(-50%,0)}
/* rechts */
.fx-tip4--right .fx-tip4-bubble{top:50%;left:calc(100% + 10px);transform:translate(-4px,-50%)}
.fx-tip4--right .fx-tip4-bubble::after{top:50%;left:0;margin-top:-4.5px;margin-left:-5px;transform:rotate(135deg)}
.fx-tip4--right .fx-tip4-trigger:hover + .fx-tip4-bubble,
.fx-tip4--right .fx-tip4-trigger:focus-visible + .fx-tip4-bubble{opacity:1;transform:translate(0,-50%)}
/* unten */
.fx-tip4--bottom .fx-tip4-bubble{left:50%;top:calc(100% + 10px);transform:translate(-50%,-4px)}
.fx-tip4--bottom .fx-tip4-bubble::after{left:50%;bottom:100%;margin-left:-4.5px;margin-bottom:-5px;transform:rotate(225deg)}
.fx-tip4--bottom .fx-tip4-trigger:hover + .fx-tip4-bubble,
.fx-tip4--bottom .fx-tip4-trigger:focus-visible + .fx-tip4-bubble{opacity:1;transform:translate(-50%,0)}
/* links */
.fx-tip4--left .fx-tip4-bubble{top:50%;right:calc(100% + 10px);transform:translate(4px,-50%)}
.fx-tip4--left .fx-tip4-bubble::after{top:50%;right:0;margin-top:-4.5px;margin-right:-5px;transform:rotate(315deg)}
.fx-tip4--left .fx-tip4-trigger:hover + .fx-tip4-bubble,
.fx-tip4--left .fx-tip4-trigger:focus-visible + .fx-tip4-bubble{opacity:1;transform:translate(0,-50%)}
@media (prefers-reduced-motion:reduce){
  .fx-tip4-bubble{transition:opacity .2s ease}
  .fx-tip4--top .fx-tip4-bubble{transform:translate(-50%,0)}
  .fx-tip4--right .fx-tip4-bubble,.fx-tip4--left .fx-tip4-bubble{transform:translate(0,-50%)}
  .fx-tip4--bottom .fx-tip4-bubble{transform:translate(-50%,0)}}
</style>

Bild-Zoom im Rahmen (Ken-Burns)

Pol 1 · Craft Anlass: Referenz-Galerie, Blog-Teaser

Das Bild zoomt beim Hover/Fokus sanft heran, während der Rahmen es sauber beschneidet (overflow:hidden) — die Beschriftung rückt leicht hoch. Nur das innere Element bewegt sich, der Rahmen bleibt fest. Hintergrund hier als CSS-Verlauf statt echtem Bild (offline-/DSGVO-sicher); für Live ein <img> mit width/height:100%;object-fit:cover einsetzen.

<a href="#" class="fx-zoom">
  <!-- statt Verlauf hier ein <img> mit object-fit:cover einsetzen -->
  <span class="fx-zoom-img" aria-hidden="true"></span>
  <span class="fx-zoom-cap">Altbau-Sanierung<small>Referenzprojekt ansehen</small></span>
</a>

<style>
.fx-zoom{position:relative;display:block;width:100%;max-width:280px;height:180px;border-radius:14px;
  overflow:hidden;cursor:pointer;border:1px solid #26262c;text-decoration:none}
.fx-zoom-img{position:absolute;inset:0;transform:scale(1);transform-origin:center;
  background:linear-gradient(135deg,#2c2c3e 0%,#1a1a24 60%,#101014 100%);
  transition:transform .5s cubic-bezier(.2,.6,.2,1),filter .5s ease}
.fx-zoom-cap{position:absolute;left:0;right:0;bottom:0;z-index:2;padding:.85rem 1rem;
  color:#f4f4f5;font-weight:600;font-size:.95rem;letter-spacing:.01em;
  background:linear-gradient(to top,rgba(13,13,16,.82),transparent);
  transform:translateY(0);transition:transform .4s ease}
.fx-zoom-cap small{display:block;font-weight:400;font-size:.78rem;color:#a1a1aa;margin-top:2px}
.fx-zoom:hover .fx-zoom-img,.fx-zoom:focus-visible .fx-zoom-img{transform:scale(1.09);filter:brightness(1.08)}
.fx-zoom:hover .fx-zoom-cap,.fx-zoom:focus-visible .fx-zoom-cap{transform:translateY(-4px)}
.fx-zoom:focus-visible{outline:2px solid var(--akzent,#7c87ff);outline-offset:3px}
@media (prefers-reduced-motion:reduce){
  .fx-zoom-img,.fx-zoom-cap{transition:none}
  .fx-zoom:hover .fx-zoom-img,.fx-zoom:focus-visible .fx-zoom-img{transform:none;filter:none}
  .fx-zoom:hover .fx-zoom-cap,.fx-zoom:focus-visible .fx-zoom-cap{transform:none}}
</style>

Unterstrich-Galerie (drei Varianten)

Pol 2 · Klarheit Anlass: Navigation, Text-Links

Drei ruhige Link-Unterstriche als Modifier einer .fx-ul-Basis: --center läuft aus der Mitte auf, --wipe von links ein, --swap tauscht eine graue Ruhelinie gegen die Akzentlinie. Reines CSS über ::after (bzw. zwei Ebenen bei Swap), animiert wird nur die Breite/Skalierung. Reagiert auf :hover und Tastatur-Fokus.

<a href="#" class="fx-ul fx-ul--center">Aus der Mitte</a>
<a href="#" class="fx-ul fx-ul--wipe">Von links</a>
<a href="#" class="fx-ul fx-ul--swap">Linie tauschen</a>

<style>
.fx-ul{position:relative;color:#e9e9ee;text-decoration:none;font-weight:600;font-size:.98rem;padding:2px 1px}
.fx-ul:focus-visible{outline:2px solid var(--akzent,#7c87ff);outline-offset:4px;border-radius:3px}
/* A: aus der Mitte auf */
.fx-ul--center::after{content:"";position:absolute;left:50%;right:50%;bottom:-2px;height:2px;
  background:var(--akzent,#7c87ff);transition:left .3s ease,right .3s ease}
.fx-ul--center:hover::after,.fx-ul--center:focus-visible::after{left:0;right:0}
/* B: von links einlaufend */
.fx-ul--wipe::after{content:"";position:absolute;left:0;right:0;bottom:-2px;height:2px;
  background:var(--akzent,#7c87ff);transform:scaleX(0);transform-origin:left;transition:transform .3s ease}
.fx-ul--wipe:hover::after,.fx-ul--wipe:focus-visible::after{transform:scaleX(1)}
/* C: alte Linie raus, neue rein */
.fx-ul--swap::before,.fx-ul--swap::after{content:"";position:absolute;left:0;right:0;bottom:-2px;height:2px}
.fx-ul--swap::before{background:#3a3a42}
.fx-ul--swap::after{background:var(--akzent,#7c87ff);transform:scaleX(0);transform-origin:right;transition:transform .3s ease}
.fx-ul--swap:hover::after,.fx-ul--swap:focus-visible::after{transform:scaleX(1);transform-origin:left}
@media (prefers-reduced-motion:reduce){
  .fx-ul--center::after,.fx-ul--wipe::after,.fx-ul--swap::after{transition:none}}
</style>

Karte: Lift + Akzent-Glow

Pol 1 · Craft Anlass: Leistungs-Karten, Preis-Karten

Die Karte hebt sich beim Hover/Fokus deutlich an und bekommt einen weichen Schein in der Akzentfarbe (Rand-Highlight + farbiger Schatten). Der Hover-Anteil ist in @media (hover:hover) gekapselt, damit auf Touch nichts hängen bleibt; Tastatur-Fokus löst denselben Zustand aus.

<a href="#" class="fx-lift">
  <span class="fx-lift-tag">Beliebt</span>
  <h3>Komplett-Paket</h3>
  <p>Planung, Material und Montage aus einer Hand — zum Festpreis.</p>
</a>

<style>
.fx-lift{display:block;width:100%;max-width:280px;text-decoration:none;
  background:#16161a;border:1px solid #26262c;border-radius:16px;padding:1.4rem 1.5rem;color:#e9e9ee;
  transition:transform .3s cubic-bezier(.2,.6,.2,1),box-shadow .3s ease,border-color .3s ease}
.fx-lift h3{margin:0 0 .45rem;font-size:1.05rem;color:#f4f4f5}
.fx-lift p{margin:0;font-size:.9rem;color:#a1a1aa;line-height:1.5}
.fx-lift-tag{display:inline-block;margin-bottom:.7rem;padding:.2rem .6rem;border-radius:99px;
  font-size:.74rem;font-weight:600;letter-spacing:.03em;
  background:rgba(124,135,255,.14);color:var(--akzent,#7c87ff)}
@media (hover:hover){
  .fx-lift:hover{transform:translateY(-6px);border-color:var(--akzent,#7c87ff);
    box-shadow:0 18px 40px -18px rgba(0,0,0,.7),0 0 0 1px rgba(124,135,255,.25),
      0 0 26px -6px rgba(124,135,255,.45)}}
.fx-lift:focus-visible{transform:translateY(-6px);border-color:var(--akzent,#7c87ff);
  box-shadow:0 18px 40px -18px rgba(0,0,0,.7),0 0 26px -6px rgba(124,135,255,.45);outline:none}
@media (prefers-reduced-motion:reduce){
  .fx-lift{transition:none}
  .fx-lift:hover,.fx-lift:focus-visible{transform:none}}
</style>

Text-Swap (Zeile schiebt hoch)

Pol 1 · Craft Anlass: Text-Link, Menü-Punkt

Beim Hover/Fokus schiebt der sichtbare Text nach oben aus dem Sichtfeld, ein zweiter (in der Akzentfarbe) rückt von unten nach — zwei Ebenen in einem overflow:hidden-Element per translateY. Beide Zeilen tragen denselben Text, das zweite <span> ist rein dekorativ (aria-hidden), damit Screenreader nur einmal vorlesen.

<a href="#" class="fx-swap">
  <span class="fx-swap-in">
    <span>Zum Angebot</span>
    <span aria-hidden="true">Zum Angebot</span>
  </span>
</a>

<style>
.fx-swap{position:relative;display:inline-block;overflow:hidden;cursor:pointer;
  color:#e9e9ee;text-decoration:none;font-weight:600;font-size:1rem;line-height:1.3;vertical-align:bottom}
.fx-swap-in{display:block;position:relative;transition:transform .35s cubic-bezier(.4,0,.2,1)}
.fx-swap-in span{display:block}
.fx-swap-in span:last-child{position:absolute;top:100%;left:0;width:100%;color:var(--akzent,#7c87ff)}
.fx-swap:hover .fx-swap-in,.fx-swap:focus-visible .fx-swap-in{transform:translateY(-100%)}
.fx-swap:focus-visible{outline:2px solid var(--akzent,#7c87ff);outline-offset:4px;border-radius:3px}
@media (prefers-reduced-motion:reduce){
  .fx-swap-in{transition:none}
  .fx-swap:hover .fx-swap-in,.fx-swap:focus-visible .fx-swap-in{transform:none}}
</style>

Rand-Verlauf bei Hover (Gradient-Border)

Pol 1 · Craft Anlass: Highlight-Karte, Premium-Tarif

In Ruhe hat die Karte einen neutralen Rahmen; beim Hover/Fokus blendet ein diagonaler Akzent-Verlauf als Rand ein. Umsetzung ohne Bild: der Verlauf liegt als ::before unter einer inneren Fläche, die padding-Lücke von 1px wird zum sichtbaren Rand. Der Verlauf nutzt color-mix, passt sich also an --akzent an.

<a href="#" class="fx-gborder">
  <span class="fx-gborder-inner">
    <h3>Premium-Tarif</h3>
    <p>Priorisierter Termin, verlängerte Garantie, persönlicher Ansprechpartner.</p>
  </span>
</a>

<style>
.fx-gborder{position:relative;display:block;width:100%;max-width:280px;text-decoration:none;
  border-radius:16px;padding:1px;background:#26262c;isolation:isolate;transition:transform .3s ease}
.fx-gborder::before{content:"";position:absolute;inset:0;border-radius:inherit;z-index:-1;
  opacity:0;transition:opacity .35s ease;
  background:linear-gradient(135deg,var(--akzent,#7c87ff),
    color-mix(in srgb,var(--akzent,#7c87ff) 40%,#101014) 55%,var(--akzent,#7c87ff))}
.fx-gborder-inner{display:block;border-radius:15px;background:#16161a;padding:1.35rem 1.5rem;color:#e9e9ee}
.fx-gborder-inner h3{margin:0 0 .4rem;font-size:1.02rem;color:#f4f4f5}
.fx-gborder-inner p{margin:0;font-size:.88rem;color:#a1a1aa;line-height:1.5}
.fx-gborder:hover,.fx-gborder:focus-visible{transform:translateY(-2px)}
.fx-gborder:hover::before,.fx-gborder:focus-visible::before{opacity:1}
.fx-gborder:focus-visible{outline:2px solid var(--akzent,#7c87ff);outline-offset:3px}
@media (prefers-reduced-motion:reduce){
  .fx-gborder,.fx-gborder::before{transition:none}
  .fx-gborder:hover,.fx-gborder:focus-visible{transform:none}}
</style>