Design · Bausteine-Dossier

Kategorie

Header

Dezent, minimalistisch, marken-spezifisch — ein Header darf beim Scrollen leiser werden, das Logo darf atmen. Akzentfarbe über --akzent in einer Zeile anpassbar.

Sticky-Header mit Scroll-Verdichtung (Glas)

Pol 1 · Craft Anlass: Header über Hero/Bild

Beim Scrollen schaltet JS die Klasse .scrolled (ab ~12 px) und der Header verdichtet sich zu Milchglas: Blur + Saturate, feine Linie, weicher Schatten. In der Bühne ist die Demo in eine kleine scrollbare Box gepackt — einfach im Kasten nach unten scrollen. Vorbild: Bernstein, Hauszeit.

Im Kasten nach unten scrollen — der Header wird zu Milchglas.

Inhalt …

Inhalt …

Inhalt …

<div class="fx-scrollbox">
  <div class="fx-glashead">
    <strong>Marke</strong>
    <nav aria-label="Beispiel"><a href="#">Start</a><a href="#">Leistungen</a><a href="#">Kontakt</a></nav>
  </div>
  <div class="fx-filler"><p>Inhalt …</p></div>
</div>

<style>
/* In echten Projekten: position:fixed/sticky am echten <header>, kein Scrollbox-Wrapper. */
.fx-scrollbox{height:200px;overflow-y:auto;position:relative}
.fx-glashead{position:sticky;top:0;z-index:2;display:flex;align-items:center;justify-content:space-between;
  padding:.85rem 1.1rem;background:transparent;border-bottom:1px solid transparent;
  transition:background .3s ease,border-color .3s ease,box-shadow .3s ease,
    -webkit-backdrop-filter .3s ease,backdrop-filter .3s ease}
.fx-glashead.scrolled{background:rgba(22,22,26,.55);
  -webkit-backdrop-filter:saturate(160%) blur(14px);backdrop-filter:saturate(160%) blur(14px);
  border-bottom-color:#2c2c34;box-shadow:0 8px 24px -18px rgba(0,0,0,.8)}
@media (prefers-reduced-motion:reduce){.fx-glashead{transition:none}}
</style>

<script>
/* Togglet .scrolled ab ~12 px. Im Projekt auf window scrollen statt auf die Box. */
document.querySelectorAll('.fx-scrollbox').forEach(function(box){
  var head=box.querySelector('.fx-glashead');
  box.addEventListener('scroll',function(){head.classList.toggle('scrolled',box.scrollTop>12);},{passive:true});
});
</script>

Sticky-Header solid + Scroll-Schatten

Pol 2 · Klarheit Anlass: Marken-Header ohne Glas

Die ruhige Variante: feste Markenfläche, keine Transparenz. Beim Scrollen kommt nur ein dezenter Schatten dazu, damit sich der Header vom Inhalt löst — sonst unverändert. Vorbild: Nördlicht.

Im Kasten nach unten scrollen — der Header bekommt einen Schatten.

Inhalt …

Inhalt …

Inhalt …

<div class="fx-solidbox">
  <div class="fx-solidhead">
    <strong>Marke</strong>
    <nav aria-label="Beispiel"><a href="#">Start</a><a href="#">Leistungen</a><a href="#">Kontakt</a></nav>
  </div>
  <div class="fx-filler"><p>Inhalt …</p></div>
</div>

<style>
/* In echten Projekten: position:fixed/sticky am echten <header>, kein Scrollbox-Wrapper. */
.fx-solidbox{height:200px;overflow-y:auto;position:relative}
.fx-solidhead{position:sticky;top:0;z-index:2;display:flex;align-items:center;justify-content:space-between;
  padding:.85rem 1.1rem;background:#1c1c22;border-bottom:1px solid #26262c;
  transition:box-shadow .3s ease}
.fx-solidhead.scrolled{box-shadow:0 6px 22px rgba(0,0,0,.55)}
@media (prefers-reduced-motion:reduce){.fx-solidhead{transition:none}}
</style>

<script>
/* Togglet .scrolled ab ~30 px. Im Projekt auf window scrollen statt auf die Box. */
document.querySelectorAll('.fx-solidbox').forEach(function(box){
  var head=box.querySelector('.fx-solidhead');
  box.addEventListener('scroll',function(){head.classList.toggle('scrolled',box.scrollTop>30);},{passive:true});
});
</script>

Brand-Mark mit :has(img)-Auto-Switch

Pol 2 · Klarheit Anlass: Logo-Platzhalter bis Lieferung

Solange noch kein Logo da ist, steht eine Glas-Kachel mit Platzhalter-Symbol. Sobald ein echtes <img> in die Kachel kommt, schaltet :has(img) Glas und Schatten automatisch ab — kein CSS-Umbau nötig. Links: Platzhalter, rechts: mit (angedeutetem) Logo. Vorbild: Hauszeit.

Marke Marke Logo Marke
<!-- Platzhalter: Glas-Kachel mit Symbol -->
<span class="fx-brand">
  <span class="fx-brand-mark">
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
      <path d="M4 20V9l8-5 8 5v11" stroke-linecap="round" stroke-linejoin="round"/>
      <path d="M9 20v-6h6v6" stroke-linecap="round" stroke-linejoin="round"/>
    </svg>
  </span>
  Marke
</span>

<!-- Sobald Logo da ist: einfach <img> einsetzen — Glas schaltet sich selbst ab -->
<span class="fx-brand">
  <span class="fx-brand-mark"><img src="logo.svg" alt="Marke Logo"></span>
  Marke
</span>

<style>
.fx-brand{display:inline-flex;align-items:center;gap:.7rem;color:#f4f4f5;font-weight:600}
.fx-brand-mark{width:42px;height:42px;border-radius:12px;flex:0 0 auto;display:grid;place-items:center;overflow:hidden;
  background:linear-gradient(180deg,rgba(255,255,255,.22) 0%,rgba(255,255,255,.04) 50%,rgba(0,0,0,.16) 100%),
    var(--akzent, #7c87ff);
  border:1px solid rgba(255,255,255,.22);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.34),inset 0 -1px 0 rgba(0,0,0,.18),0 4px 12px rgba(0,0,0,.35)}
.fx-brand-mark svg{width:22px;height:22px;color:#fff}
.fx-brand-mark img{width:100%;height:100%;object-fit:contain;display:block;padding:4px}
/* sobald ein echtes <img> drinsteckt: Glas-Kachel weg, nur Logo */
.fx-brand-mark:has(img){background:none;box-shadow:none;border-color:transparent}
</style>

Brand-Mark mit Glow-Hover

Pol 1 · Craft Anlass: Logo mit Charakter

Das Logo trägt dauerhaft einen leichten farbigen drop-shadow; beim Hover/Fokus skaliert es minimal und der Glow wird intensiver. Reagiert auch auf Tastatur-Fokus. Vorbild: Silver Mountain.

<a href="#" class="fx-glowbrand">
  <span class="mark" aria-hidden="true">
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
      <path d="M3 20 9 7l4 7 3-5 5 11Z" stroke-linejoin="round"/>
    </svg>
  </span>
  Marke
</a>

<style>
.fx-glowbrand{display:inline-flex;align-items:center;gap:.7rem;color:#f4f4f5;font-weight:600}
.fx-glowbrand .mark{width:44px;height:44px;display:grid;place-items:center;
  transition:transform .25s ease,filter .25s ease;
  filter:drop-shadow(0 0 16px color-mix(in srgb,var(--akzent, #7c87ff) 28%,transparent))}
.fx-glowbrand .mark svg{width:34px;height:34px;color:var(--akzent, #7c87ff)}
.fx-glowbrand:hover .mark,.fx-glowbrand:focus-visible .mark{transform:scale(1.08);
  filter:drop-shadow(0 0 26px color-mix(in srgb,var(--akzent, #7c87ff) 55%,transparent))}
@media (prefers-reduced-motion:reduce){.fx-glowbrand .mark{transition:none}.fx-glowbrand:hover .mark{transform:none}}
</style>

Logo-Lockup mit Untertitel

Pol 2 · Klarheit Anlass: Marke + Tätigkeit

Logo-Fläche neben zweizeiligem Text: Markenname kräftig, darunter ein dezenter Untertitel (Branche/Tätigkeit). Ordnet die Marke ein, ohne den Header zu überladen. Vorbild: NDS.

<a href="#" class="fx-lockup">
  <span class="lock-mark" aria-hidden="true">MA</span>
  <span class="lock-text">
    <strong>Marke GmbH</strong>
    <span>Leistung &amp; Beratung</span>
  </span>
</a>

<style>
.fx-lockup{display:inline-flex;align-items:center;gap:.7rem;color:#f4f4f5}
.fx-lockup .lock-mark{width:40px;height:40px;border-radius:10px;flex:0 0 auto;display:grid;place-items:center;
  background:#1c1c22;border:1px solid #2c2c34;color:var(--akzent, #7c87ff);font-weight:700;font-size:.8rem;letter-spacing:.04em}
.fx-lockup .lock-text{display:flex;flex-direction:column;line-height:1.15;justify-content:center}
.fx-lockup .lock-text strong{font-size:.95rem;font-weight:700;letter-spacing:-.005em;color:#f4f4f5}
.fx-lockup .lock-text span{font-size:.72rem;font-weight:500;color:#a1a1aa;letter-spacing:.01em}
</style>

Sternen-Layer im Header

Pol 1 · Craft Anlass: thematische Marke (Nische)

Thematischer Effekt für die passende Nische (z. B. Nacht/Himmel/Polarstern): Inline-SVG-Sterne liegen unsichtbar (opacity:0) über der Leiste und erscheinen beim Hover/Fokus, einzelne pulsieren leicht. Per @media (hover:none) auf Touch und per prefers-reduced-motion abgeschaltet. Vorbild: Nördlicht.

<div class="fx-starhead" tabindex="0">
  <svg class="fx-stars" viewBox="0 0 520 70" preserveAspectRatio="none" aria-hidden="true">
    <circle class="twinkle" cx="60" cy="18" r="1.6"/>
    <circle cx="130" cy="42" r="1"/>
    <circle class="twinkle-2" cx="210" cy="22" r="1.8"/>
    <circle cx="270" cy="50" r="1.2"/>
    <circle class="twinkle-3" cx="350" cy="16" r="1.5"/>
    <circle cx="410" cy="40" r="1"/>
    <circle class="twinkle" cx="470" cy="26" r="1.7"/>
    <circle cx="500" cy="52" r="1.1"/>
  </svg>
  <strong>Marke</strong>
  <nav aria-label="Beispiel"><a href="#">Start</a><a href="#">Leistungen</a><a href="#">Kontakt</a></nav>
</div>

<style>
.fx-starhead{position:relative;overflow:hidden;display:flex;align-items:center;justify-content:space-between;
  padding:.95rem 1.2rem;border-radius:12px;background:#17171b;border:1px solid #26262c}
.fx-starhead .fx-stars{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;z-index:0;
  opacity:0;transition:opacity .45s ease}
.fx-starhead:hover .fx-stars,.fx-starhead:focus-within .fx-stars{opacity:.95}
.fx-starhead .fx-stars circle{fill:var(--akzent, #7c87ff)}
.fx-starhead .fx-stars .twinkle{animation:fxStarTwinkle 3.4s ease-in-out infinite}
.fx-starhead .fx-stars .twinkle-2{animation:fxStarTwinkle 4.6s ease-in-out infinite;animation-delay:1.2s}
.fx-starhead .fx-stars .twinkle-3{animation:fxStarTwinkle 5.2s ease-in-out infinite;animation-delay:2.1s}
@keyframes fxStarTwinkle{0%,100%{opacity:.35}50%{opacity:.95}}
.fx-starhead strong,.fx-starhead nav{position:relative;z-index:1}
@media (hover:none){.fx-starhead .fx-stars{display:none}}
@media (prefers-reduced-motion:reduce){
  .fx-starhead .fx-stars .twinkle,.fx-starhead .fx-stars .twinkle-2,.fx-starhead .fx-stars .twinkle-3{animation:none}
}
</style>

Ankündigungs-Leiste über dem Header (schließbar)

Pol 2 · Klarheit Anlass: Aktion, Hinweis, Öffnungszeiten

Eine schmale Akzent-Leiste sitzt über dem eigentlichen Header und trägt einen kurzen Hinweis mit einem Link. Ein Schließen-Knopf klappt sie sauber ein (Höhe + Deckkraft animiert); im Projekt kann ein Flag im localStorage das Wiederkehren verhindern. Der Header selbst bleibt unverändert darunter.

Neu: kostenlose Erstberatung im Juli — jetzt Termin sichern
<div class="fx-annbar" role="region" aria-label="Ankündigung">
  <span class="fx-annbar__text">Neu: kostenlose Erstberatung im Juli — <a href="#">jetzt Termin sichern</a></span>
  <button type="button" class="fx-annbar__close" aria-label="Hinweis schließen">
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" aria-hidden="true"><path d="M6 6l12 12M18 6L6 18"/></svg>
  </button>
</div>
<header>…dein Header…</header>

<style>
.fx-annbar{display:flex;align-items:center;gap:.8rem;padding:.55rem 1rem;font-size:.82rem;color:#0d0d10;
  background:linear-gradient(90deg,var(--akzent, #7c87ff),color-mix(in srgb,var(--akzent, #7c87ff) 62%,#fff));
  transition:opacity .3s ease,max-height .3s ease,padding .3s ease}
.fx-annbar__text{flex:1;min-width:0;font-weight:600}
.fx-annbar__text a{color:#0d0d10;text-decoration:underline;text-underline-offset:2px;font-weight:700}
.fx-annbar__close{flex:0 0 auto;width:26px;height:26px;display:grid;place-items:center;border:0;cursor:pointer;
  border-radius:7px;background:rgba(13,13,16,.12);color:#0d0d10;transition:background .2s ease}
.fx-annbar__close:hover,.fx-annbar__close:focus-visible{background:rgba(13,13,16,.24);outline:none}
.fx-annbar__close:focus-visible{outline:2px solid #0d0d10;outline-offset:2px}
.fx-annbar__close svg{width:15px;height:15px}
.fx-annbar.is-hidden{max-height:0;padding-top:0;padding-bottom:0;opacity:0;overflow:hidden}
@media (prefers-reduced-motion:reduce){.fx-annbar{transition:none}}
</style>

<script>
document.querySelectorAll('.fx-annbar__close').forEach(function(btn){
  btn.addEventListener('click',function(){
    var bar=btn.closest('.fx-annbar');
    if(bar) bar.classList.add('is-hidden');
    /* Im Projekt merken: localStorage.setItem('annbar-dismissed','1'); */
  });
});
</script>

Zentriertes Logo mit geteilter Navigation

Pol 2 · Klarheit Anlass: symmetrischer Marken-Header

Drei-Spalten-Raster (1fr auto 1fr): Navigation links, Logo mittig, Navigation rechts — der symmetrische, ruhige Auftritt für Marken, bei denen das Logo im Zentrum stehen soll. Die Links tragen eine Akzent-Unterstreichung, die beim Hover/Fokus von links aufzieht. Am Handy klappt alles zentriert untereinander.

<header class="fx-splithead">
  <nav class="split-nav" aria-label="links"><a href="#">Leistungen</a><a href="#">Referenzen</a></nav>
  <a href="#" class="split-brand"><span class="split-dot" aria-hidden="true"></span>Marke</a>
  <nav class="split-nav split-nav--right" aria-label="rechts"><a href="#">Über uns</a><a href="#">Kontakt</a></nav>
</header>

<style>
.fx-splithead{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:1rem;
  padding:.85rem 1.3rem;border-radius:12px;background:#17171b;border:1px solid #26262c}
.fx-splithead .split-nav{display:inline-flex;gap:1.2rem;font-size:.82rem;color:#a1a1aa}
.fx-splithead .split-nav--right{justify-content:flex-end}
.fx-splithead .split-nav a{position:relative;padding-bottom:2px;transition:color .2s ease}
.fx-splithead .split-nav a::after{content:"";position:absolute;left:0;bottom:0;width:100%;height:1px;
  background:var(--akzent, #7c87ff);transform:scaleX(0);transform-origin:left;transition:transform .28s ease}
.fx-splithead .split-nav a:hover,.fx-splithead .split-nav a:focus-visible{color:#f4f4f5;outline:none}
.fx-splithead .split-nav a:hover::after,.fx-splithead .split-nav a:focus-visible::after{transform:scaleX(1)}
.fx-splithead .split-brand{display:inline-flex;align-items:center;gap:.5rem;justify-self:center;
  color:#f4f4f5;font-weight:700;font-size:1rem;letter-spacing:.02em;white-space:nowrap}
.fx-splithead .split-brand .split-dot{width:9px;height:9px;border-radius:50%;background:var(--akzent, #7c87ff);
  box-shadow:0 0 12px color-mix(in srgb,var(--akzent, #7c87ff) 60%,transparent)}
@media (max-width:560px){
  .fx-splithead{grid-template-columns:1fr;justify-items:center;gap:.6rem;text-align:center}
  .fx-splithead .split-nav--right{justify-content:center}
}
@media (prefers-reduced-motion:reduce){
  .fx-splithead .split-nav a,.fx-splithead .split-nav a::after{transition:none}
}
</style>

Header mit ausklappendem Suchfeld

Pol 1 · Craft Anlass: Shop-/Magazin-Header

Das Suchfeld startet als reines Lupen-Icon und schiebt sich beim Klick oder Fokus zur vollen Breite auf (nur width animiert). Beim Verlassen zieht es sich wieder ein, sofern nichts eingetippt wurde. Der Fokusring liegt auf dem ganzen Feld (:focus-within). Klicken oder mit Tab ins Icon springen zum Testen.

Marke
<header class="fx-srchhead">
  <strong>Marke</strong>
  <div class="srch-right">
    <nav aria-label="Beispiel"><a href="#">Shop</a><a href="#">Magazin</a></nav>
    <form class="fx-search" role="search" action="#">
      <button type="submit" class="fx-search__btn" aria-label="Suche öffnen">
        <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="11" cy="11" r="7"/><path d="M21 21l-4.3-4.3"/></svg>
      </button>
      <input type="search" class="fx-search__field" placeholder="Suchen …" aria-label="Suchbegriff">
    </form>
  </div>
</header>

<style>
.fx-search{display:flex;align-items:center;height:38px;border-radius:99px;overflow:hidden;
  background:#101014;border:1px solid #26262c;transition:border-color .25s ease,box-shadow .25s ease}
.fx-search:focus-within{border-color:var(--akzent, #7c87ff);
  box-shadow:0 0 0 3px color-mix(in srgb,var(--akzent, #7c87ff) 22%,transparent)}
.fx-search__btn{flex:0 0 38px;width:38px;height:38px;display:grid;place-items:center;border:0;cursor:pointer;
  background:transparent;color:#a1a1aa;transition:color .2s ease}
.fx-search__btn:hover,.fx-search__btn:focus-visible{color:#f4f4f5;outline:none}
.fx-search__btn:focus-visible{color:var(--akzent, #7c87ff)}
.fx-search__btn svg{width:17px;height:17px}
.fx-search__field{width:0;min-width:0;padding:0;border:0;background:transparent;color:#f4f4f5;font-size:.88rem;
  font-family:inherit;transition:width .32s cubic-bezier(.4,0,.2,1),padding .32s ease}
.fx-search__field::placeholder{color:#a1a1aa}
.fx-search__field:focus{outline:none}
.fx-search.is-open .fx-search__field{width:170px;padding-right:.9rem}
@media (prefers-reduced-motion:reduce){.fx-search,.fx-search__field,.fx-search__btn{transition:none}}
</style>

<script>
document.querySelectorAll('.fx-search').forEach(function(form){
  var field=form.querySelector('.fx-search__field');
  var btn=form.querySelector('.fx-search__btn');
  if(!field||!btn) return;
  // Icon-Klick öffnet und fokussiert (statt sofort abzuschicken), solange leer
  btn.addEventListener('click',function(e){
    if(!form.classList.contains('is-open') && field.value==='') {
      e.preventDefault();
      form.classList.add('is-open');
      field.focus();
    }
  });
  field.addEventListener('focus',function(){form.classList.add('is-open');});
  field.addEventListener('blur',function(){ if(field.value==='') form.classList.remove('is-open'); });
});
</script>