Zum Inhalt springen
Core Web Vitals & Messung

Aktionsbanner zur Black Week ohne Layoutsprung einbauen

Hinweisleiste, Countdown, Pop-up und Badges zur Black Week ohne Sprung einbauen: Platz reservieren, serverseitig ausliefern, CLS bei höchstens 0,1 halten.

20 Min. Lesezeit CLSBlack WeekCore Web VitalsAktionsbannerINP

Kurz und einfach erklärt

Zur Black Week bekommen manche Shops neue Teile. Etwa eine Leiste oben, einen Countdown oder ein Gutschein-Fenster.

Oft erscheinen diese Teile erst nach dem Laden. Dann rutscht die Seite nach unten.

Der Beitrag zeigt, wie es ohne Sprung geht. Der Platz wird vorher frei gehalten. Der Server liefert die Leiste gleich mit aus.

Nach der Aktion nimmt der Server die Teile heraus. So bleibt keine Lücke. Messen Sie vor und während der Aktion.

Wir helfen Ihnen dabei.

Zur Black Week bekommt fast jeder Shop zusätzliche Elemente: eine Hinweisleiste über dem Kopfbereich, einen Countdown bis zum Aktionsende, ein Gutschein-Pop-up und Aktionsbadges auf den Produktkacheln. Meist kommen sie kurz vor dem Start über ein Skript, einen Tag-Manager oder ein Plugin dazu – also genau dann, wenn niemand mehr Zeit hat, ihre Wirkung auf die Core Web Vitals zu messen. Das Ergebnis kennt jeder vom Smartphone: Die Seite steht, das Produktbild ist sichtbar, und einen Augenblick später rutscht alles um eine Leistenhöhe nach unten. Dieser Beitrag zeigt, wie Sie saisonale Aktionselemente so einbauen, dass der Cumulative Layout Shift im grünen Bereich bleibt – mit reserviertem Platz, serverseitiger Auslieferung, einem Countdown ohne Dauerlast im Hauptthread, Badges ohne nachgeladene Bilder und einem Rückbau nach Aktionsende, der keinen Leerraum hinterlässt. Black Friday fällt 2026 auf den 27. November, Cyber Monday auf den 30. November. Die Wochen bis dahin reichen, um die Elemente vorher zu bauen und mit eingeschalteter Aktion zu messen.

Das Wichtigste in Kürze

  • Als guter CLS gilt ein Wert von 0,1 (web.dev) oder weniger, gemessen am 75. Perzentil (web.dev) der Seitenaufrufe. Eine Aktionsleiste, die oben nachträglich eingefügt wird, kann diesen Spielraum auf dem Smartphone allein aufbrauchen.
  • Platz für Leiste, Countdown und Badges wird im CSS reserviert, etwa mit min-height oder aspect-ratio. Ein Element, das in einem bereits reservierten Bereich erscheint, verschiebt nichts und zählt nicht als Layoutverschiebung.
  • Die Leiste kommt mit dem HTML vom Server, nicht per Skript nach dem Rendern. Ob die Aktion läuft, entscheidet der Server anhand von Start- und Endzeitpunkt mit Zeitzone – so stimmt schon der erste Frame.
  • Ein Countdown berechnet die Restzeit aus einem festen Endzeitpunkt, schreibt nur seinen Text und nutzt tabular-nums. Aufgaben über 50 Millisekunden (web.dev) im Hauptthread verzögern sonst die Reaktion auf Klicks.
  • Gutschein-Pop-ups liegen als Überlagerung mit position: fixed über dem Inhalt. Verschiebungen beim Scrollen zählen als unerwartet, auch wenn sie innerhalb von 500 Millisekunden (web.dev) nach der Geste auftreten.
  • Nach Aktionsende lässt der Server Elemente und Reserve aus dem HTML weg. Wer den Platz im Browser zuklappt, erzeugt denselben Sprung in Gegenrichtung, und CrUX zeigt ihn über ein Fenster von 28 Tagen (Chrome for Developers).

Warum Aktionselemente den Inhalt verschieben

Saisonale Elemente entstehen anders als der Rest einer Shopseite. Kopfbereich, Produktkacheln und Warenkorb werden einmal gebaut, getestet und danach gepflegt. Die Hinweisleiste zur Black Week, der Countdown und das Gutschein-Pop-up kommen dagegen für wenige Wochen dazu, oft kurzfristig und an der normalen Entwicklung vorbei: über ein Skript im Tag-Manager, ein Plugin mit eigener Oberfläche oder ein Schnipsel, das die Marketingabteilung selbst einfügt. Technisch läuft das meist gleich ab. Das Skript lädt nach dem HTML, wartet auf das Dokument und schreibt die Leiste dann an den Anfang des Body. Zu diesem Zeitpunkt hat der Browser die Seite längst gerendert – Logo, Navigation, Produktbild und Titel stehen schon. Die Leiste drückt alles darunter nach unten, und wer gerade auf das Produktbild tippen wollte, trifft etwas anderes.

Genau diese Bewegung misst der Cumulative Layout Shift. CLS erfasst den größten Schub an unerwarteten Layoutverschiebungen während der gesamten Lebensdauer einer Seite (web.dev). Ein solcher Schub, das Sitzungsfenster, umfasst Verschiebungen mit weniger als 1 Sekunde (web.dev) Abstand zueinander und dauert höchstens 5 Sekunden (web.dev). Als gut gilt ein Wert von 0,1 (web.dev) oder weniger, als schlecht ein Wert über 0,25 (web.dev). Gemessen wird am 75. Perzentil (web.dev) der Seitenaufrufe, getrennt nach Mobilgeräten und Desktop. Es reicht also nicht, wenn der Durchschnitt passt: Drei von vier Seitenaufrufen dürfen die Schwelle nicht überschreiten. Eine Leiste, die nur bei langsamer Verbindung spät erscheint, trifft genau die langsameren Besuche, die den Wert am 75. Perzentil bestimmen.

Im Web insgesamt ist die Lage besser als ihr Ruf: 81 Prozent (HTTP Archive Web Almanac 2025) der mobilen und 72 Prozent (HTTP Archive Web Almanac 2025) der Desktop-Seiten erreichen 2025 einen guten CLS. Aufschlussreich ist der Unterschied zwischen Seitentypen. Mobil schaffen es 79 Prozent (HTTP Archive Web Almanac 2025) der Startseiten, aber 81 Prozent (HTTP Archive Web Almanac 2025) der Unterseiten. Die Autoren werten das als Hinweis, dass Startseiten mit ihrem oft dynamischeren Inhalt – Hero-Medien, Bannern und Aktionselementen – anfälliger für Verschiebungen bleiben (HTTP Archive Web Almanac 2025). Genau dort landen die Black-Week-Elemente zuerst. Wie CLS grundsätzlich entsteht, etwa durch Bilder ohne Maße, Webschriften oder Werbeflächen, beschreibt der Beitrag Cumulative Layout Shift im Shop vermeiden. Hier geht es nur um Elemente, die für eine Aktion kommen und danach wieder gehen.

Warum der Zeitpunkt zählt

Für Black Friday und Cyber Monday 2025 rechnete der Handelsverband Deutschland mit einem Umsatz von 5,8 Milliarden Euro (HDE). In einer Umfrage, für die das IFH Köln im Auftrag des Verbands im Oktober 2025 über 1.000 (HDE) Online-Shopper befragte, wollten 48 Prozent (HDE) der Befragten am Black Friday auf Schnäppchenjagd gehen. Wer an diesen Tagen ein springendes Produktbild ausliefert, tut es vor einem besonders großen Publikum – und bei Besuchern, die schnell vergleichen und schnell tippen.

Was eine Leiste am CLS kostet

Jede einzelne Verschiebung bekommt einen Wert, der sich aus zwei Faktoren zusammensetzt: Impact Fraction mal Distance Fraction (web.dev). Die Impact Fraction ist die Fläche, die alle verschobenen Elemente vorher und nachher zusammen im Viewport einnehmen, als Anteil an der Viewport-Fläche. Die Distance Fraction ist die größte Strecke, um die sich ein Element bewegt hat, geteilt durch die größte Abmessung des Viewports (web.dev). Auf dem Smartphone im Hochformat ist das die Höhe, am Desktop die Breite. Neue Elemente zählen dabei nicht als verschoben, wohl aber alles, was sie aus seiner Position drängen.

Für eine Leiste, die ganz oben über allem eingefügt wird, lässt sich der Wert gut abschätzen. Sie schiebt den gesamten sichtbaren Inhalt nach unten, die Impact Fraction liegt damit nahe bei eins. Der Layout-Shift-Wert entspricht dann höchstens der Leistenhöhe geteilt durch die größte Viewport-Abmessung. Die Tabelle zeigt ein Rechenbeispiel nach dieser Formel für ein Smartphone mit 844 Pixeln Viewport-Höhe und einen Desktop mit 1440 × 900 Pixeln. Die Höhen sind typische Größen für Aktionsleisten, keine Messwerte eines bestimmten Shops.

Aktionselement, oben eingefügtVerschiebungViewportLayout-Shift-Wert, höchstens
Einzeilige Hinweisleiste40 pxSmartphone, 844 px hoch0,047
Zweizeilige Leiste auf dem Smartphone64 pxSmartphone, 844 px hoch0,076
Leiste mit eigener Countdown-Zeile90 pxSmartphone, 844 px hoch0,107
Einzeilige Hinweisleiste40 pxDesktop, 1440 × 900 px0,028

Zwei Dinge fallen auf. Erstens braucht es keine große Fläche: Eine Leiste mit eigener Countdown-Zeile überschreitet den Grenzwert im Rechenbeispiel allein. Zweitens addieren sich Verschiebungen im selben Sitzungsfenster. Kommen Leiste, Countdown-Text und ein nachgeladenes Badge-Bild kurz nacheinander, zählt die Summe. Am Desktop wirkt dieselbe Leiste schwächer, weil die Distance Fraction durch die Breite geteilt wird. Wer die Aktion nur am großen Bildschirm abnimmt, unterschätzt das Problem deshalb systematisch. Gemessen wird auf dem Smartphone, mit dem Text, der in der Black Week tatsächlich in der Leiste steht.

Im Labor oft unsichtbar

Laborwerkzeuge laden eine Seite in einer künstlichen Umgebung und erfassen in der Regel nur Verschiebungen während des Ladens; ihre CLS-Werte können deshalb niedriger ausfallen als bei echten Besuchern (web.dev). Ein Pop-up, das nach einigen Sekunden erscheint, oder ein Countdown, der beim Scrollen umbricht, fehlt im Laborbericht deshalb häufig. Im Feld zählt er voll. Nach Nutzungsdaten von Chrome entfallen 90 Prozent (web.dev) der Zeit, die Nutzer auf einer Seite verbringen, auf die Phase nach dem Laden.

Platz reservieren: Leiste, Countdown, Badge

Der erste Hebel ist unspektakulär: Der Platz, den ein Aktionselement braucht, steht schon im ersten Layout fest. web.dev empfiehlt für spät geladene Inhalte im Dokumentfluss genau das – Raum mit einer min-height-Regel reservieren oder bei responsiven Inhalten mit aspect-ratio (web.dev). Erscheint ein neues Element in diesem Raum, ist das keine Layoutverschiebung, solange sich dadurch kein anderes sichtbares Element bewegt (web.dev). Die Leiste darf also später kommen, wenn ihr Platz schon da ist. Sie darf nur nichts verdrängen.

Die Höhe muss zum Text passen. Eine Leiste, die mobil auf zwei Zeilen umbricht, sprengt eine Reserve für eine Zeile, und der Sprung kommt durch die Hintertür zurück. Legen Sie den Text deshalb vorab für die schmalste unterstützte Breite fest und planen Sie die Reserve je Breakpoint: eine Zeile am Desktop, zwei Zeilen auf dem Smartphone, wenn der Text es verlangt. min-height ist dabei nur eine Untergrenze: Ein zu langer Text lässt die Leiste trotzdem wachsen, auch mit overflow: hidden. Der Text muss also in die Reserve passen, und die Absätze darin brauchen margin: 0, sonst ist die Leiste schon durch den Standardabstand höher als geplant. Für die Schrift gilt dasselbe wie überall auf der Seite: Lädt die Webschrift spät und läuft breiter als die Ersatzschrift, kann aus einer Zeile eine zweite werden.

promo-elements.css
/* Reserve für die Aktionsleiste, je Breakpoint fest */
.promo-bar {
  min-height: 40px;
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  justify-content: center;
  column-gap: 0.5em;
}
.promo-bar p { margin: 0; }
@media (max-width: 480px) {
  .promo-bar { min-height: 64px; }
}

/* Countdown: alle Ziffern gleich breit, Rahmen fest */
.promo-countdown {
  display: inline-block;
  min-width: 12ch;
  font-variant-numeric: tabular-nums;
}

/* Badge auf der Produktkachel: über dem Bild, nicht im Fluss */
.product-card { position: relative; }
.product-card .promo-badge {
  position: absolute;
  top: 8px;
  left: 8px;
}

Beim Countdown entsteht eine zweite, leicht übersehene Verschiebung. In vielen Schriften sind die Ziffern unterschiedlich breit; eine Eins ist schmaler als eine Acht. Wechselt die Anzeige jede Sekunde, ändert sich die Textbreite mit, und in einer zentrierten Leiste rücken die Nachbarn hin und her. font-variant-numeric: tabular-nums aktiviert Ziffern gleicher Breite, die sich wie in Tabellen ausrichten lassen (MDN Web Docs). Eine Mindestbreite in ch hält den Rahmen zusätzlich stabil, auch wenn die Tagesangabe von zwei Stellen auf eine wechselt.

Aktionsbadges auf Produktkacheln gehören in den Rahmen der Kachel, nicht in deren Fluss: absolut positioniert über dem Bild oder in einer Zeile, die es auf jeder Kachel ohnehin gibt. Wird das Badge als Bild ausgeliefert, braucht es width und height, sonst legt der Browser es zunächst ohne Höhe an und schiebt den Text darunter, sobald die Datei da ist. Das ist im Web noch verbreitet: Auf 62 Prozent (HTTP Archive Web Almanac 2025) der mobilen Seiten fehlen bei mindestens einem Bild die Abmessungen. Am einfachsten ist ein Badge aus Text und CSS. Es braucht keinen zusätzlichen Abruf, hat keine Abmessungen, die jemand vergessen kann, und lässt sich übersetzen. Wer Aktionsgrafiken trotzdem als Bild braucht, findet im Beitrag JPEG XL im Browser die Frage nach dem passenden Format.

Hinweisleiste

Feste Höhe je Breakpoint am Element selbst, Text für die schmalste Breite geschrieben, Schrift vorab geladen. Die Leiste füllt ihren Platz, sie schafft ihn nicht.

Countdown

Ziffern gleicher Breite über tabular-nums, Mindestbreite in ch, Startwert vom Server. Die Anzeige ändert ihren Inhalt, aber nicht ihre Größe.

Aktionsbadge

Text und CSS statt Bilddatei, absolut über dem Produktbild positioniert. Wo doch ein Bild nötig ist, tragen width und height die Maße.

Serverseitig ausliefern statt nachträglich einfügen

Reservierter Platz hilft nur, wenn er zur Aktion passt. Entscheidet ein Skript im Browser, ob die Leiste erscheint, braucht das CSS eine Reserve auch dann, wenn keine Aktion läuft – oder es hat keine und der Sprung kommt zurück. Sauberer ist es, das Aktionselement mit dem HTML auszuliefern. Der Server kennt Start- und Endzeitpunkt und rendert Leiste, Countdown-Startwert und Badges nur in diesem Zeitraum. Der Browser sieht die Leiste dann im ersten Frame, und es gibt nichts, was sich verschieben könnte. In einer Shopware-Storefront heißt das: Die Leiste ist ein Template-Block mit eigener Bedingung, kein Skript, das nach dem Laden in den Body schreibt.

Der übliche Gegenentwurf ist eine Leiste, die ein Tag-Manager oder ein Plugin per JavaScript einfügt. Sie hängt an Skriptladezeiten, die von Besuch zu Besuch schwanken, und erscheint damit mal früh, mal spät. web.dev nennt Banner und Formulare, die oben oder unten im Viewport aufpoppen und den restlichen Inhalt verschieben, ausdrücklich als typische Ursache. Die Empfehlung lautet, vorab ausreichend Platz zu reservieren oder das Element als Überlagerung aus dem Dokumentfluss zu nehmen (web.dev). Muss ein Skript die Leiste doch einfügen, dann in einen Container, der schon im HTML steht und seine Höhe trägt.

promo-bar.html
<!-- Nur im Aktionszeitraum vom Server ausgeliefert, sonst fehlt der Block ganz -->
<div class="promo-bar" data-promo-end="2026-12-01T00:00:00+01:00">
  <p>Black Week: Aktionspreise bis Montag, 24 Uhr</p>
  <p>Noch <span class="promo-countdown">2 T 05:14:09</span></p>
</div>

Mit serverseitiger Auslieferung verschiebt sich die Frage auf den Cache. Ein HTML-Cache oder ein CDN, das die Startseite für Stunden vorhält, liefert die Leiste womöglich zu spät aus oder nach dem Ende noch. Planen Sie Start und Ende deshalb als Ereignisse: Cache zum Umschaltzeitpunkt gezielt leeren oder die Lebensdauer der betroffenen Seiten rund um diesen Zeitpunkt verkürzen. Wie sich Seiten-Cache und Aktualität vertragen, behandelt die Seite zu Caching-Strategien. Die zweite Falle sind Zeitzonen: „bis Montag, 24 Uhr“ heißt für einen Shop in Deutschland Europe/Berlin, nicht die Serverzeit in UTC. Der Endzeitpunkt gehört mit Zeitzone in die Konfiguration, nicht als Text ins Template.

Der Grundsatz in einem Satz

Der Platz für ein Aktionselement steht im ersten Frame fest – das Element füllt ihn, es schafft ihn nicht, und es nimmt ihn beim Gehen wieder mit.

Countdown ohne Dauerlast im Hauptthread

Ein Countdown ist kleine Logik, kann aber an zwei Stellen teuer werden: im Hauptthread und bei der Genauigkeit. Interaction to Next Paint misst, wie schnell eine Seite auf Klicks, Tipps und Tastendrücke reagiert. Ein INP bis 200 Millisekunden (web.dev) gilt als gut. Jede Aufgabe, die länger als 50 Millisekunden (web.dev) läuft, ist eine lange Aufgabe, und solange sie läuft, wartet jede Eingabe. Ein Countdown, der jede Sekunde eine ganze Komponente neu rendert, bei jedem Schritt Layout abfragt oder mehrere Zeitzonen formatiert, kann zu einer solchen Aufgabe beitragen – und er läuft genau dann, wenn Besucher auf „In den Warenkorb“ tippen.

Drei Regeln halten ihn klein. Er schreibt nur den Text eines einzelnen Knotens. Er liest dabei kein Layout. Und er rechnet die Restzeit bei jedem Schritt aus dem festen Endzeitpunkt neu, statt einen Zähler herunterzuzählen. Die letzte Regel hat mit Zeitgebern im Hintergrund zu tun. Browser drosseln sie in inaktiven Tabs: Chrome prüft verkettete Zeitgeber, wenn die Seite länger als 5 Minuten (MDN Web Docs) unsichtbar ist und weitere Bedingungen erfüllt sind, nur noch einmal pro Minute (MDN Web Docs). Firefox für Android setzt für inaktive Tabs eine Mindestverzögerung von 15 Minuten (MDN Web Docs). Ein Countdown, der Ticks zählt, zeigt nach der Rückkehr in den Tab eine falsche Zeit. Einer, der aus dem Endzeitpunkt rechnet, stimmt beim nächsten Schritt wieder.

promo-countdown.js
// Countdown: rechnet aus dem Endzeitpunkt und schreibt nur Text
const el = document.querySelector('.promo-countdown');
const bar = el && el.closest('[data-promo-end]');
if (el && bar) {
  const end = Date.parse(bar.dataset.promoEnd);
  const pad = (n) => String(n).padStart(2, '0');
  let timer;
  const render = () => {
    const rest = Math.max(0, end - Date.now());
    const s = Math.floor(rest / 1000);
    const text = `${Math.floor(s / 86400)} T ${pad(Math.floor(s / 3600) % 24)}:` +
      `${pad(Math.floor(s / 60) % 60)}:${pad(s % 60)}`;
    if (el.textContent !== text) el.textContent = text;
    if (rest === 0) clearInterval(timer);
  };
  timer = setInterval(render, 1000);
  render();
  // Nach der Rückkehr in den Tab sofort neu rechnen
  document.addEventListener('visibilitychange', () => {
    if (!document.hidden) render();
  });
}

Den Startwert schreibt der Server ins HTML, damit die Anzeige schon vor dem Skript eine plausible Zeit zeigt und das Skript nur noch korrigiert. Ob eine Sekundenanzeige überhaupt nötig ist, lohnt eine Rückfrage an das Marketing: Eine Anzeige in Stunden und Minuten ändert sich seltener und genügt für eine Aktion, die Tage dauert, in der Regel. In Shop-Frontends mit Komponentenframework bekommt der Countdown einen eigenen, kleinen Zustand und nicht den der ganzen Kopfzeile – sonst rendert jede Sekunde die Navigation mit. Wie sich lange Aufgaben finden und zerlegen lassen, zeigt der Beitrag INP optimieren.

Gutschein-Pop-ups: überlagern statt verschieben

Das Gutschein-Pop-up ist besonders anfällig für Sprünge, weil es selten mit der Seite erscheint, sondern meist verzögert: nach einigen Sekunden, beim Scrollen oder wenn der Mauszeiger das Fenster verlässt. Als Überlagerung mit position: fixed liegt es außerhalb des Dokumentflusses und verschiebt nichts. web.dev beschreibt das Muster am Beispiel von Cookie-Hinweisen: Ein Hinweis oben im Dokument, der nach dem Rendern eingefügt wird, schiebt die Elemente darunter nach unten; eine Fußleiste oder ein Modal liegt als Überlagerung über der Seite und sollte beim Laden keine Verschiebung auslösen (web.dev). Für Gutscheinfenster gilt dieselbe Logik. Wie Consent-Dialoge selbst die Kennzahlen beeinflussen, behandelt der Beitrag Cookie-Banner und Core Web Vitals.

Verlassen Sie sich nicht auf die Ausnahme für Nutzereingaben. Verschiebungen innerhalb von 500 Millisekunden (web.dev) nach einem Klick, Tipp oder Tastendruck werden zwar aus der Berechnung ausgenommen. Scrollen, Ziehen und Zoomen gelten aber nicht als solche Eingabe. web.dev formuliert es für Inhalte, die beim Scrollen oder Überfahren mit dem Mauszeiger nachkommen, unmissverständlich: Jede Verschiebung während dieser Interaktionen zählt als unerwartet, auch innerhalb von 500 Millisekunden (web.dev). Ein Pop-up oder Hinweisblock, der beim Scrollen in den Fluss geschoben wird, zählt also voll.

Fährt das Pop-up oder die Leiste animiert herein, dann über transform und opacity. web.dev rät, statt height und width die Eigenschaft transform: scale() zu verwenden und Elemente nicht über top, right, bottom oder left zu bewegen, sondern über transform: translate() (web.dev). Animationen auf Layout-Eigenschaften sind verbreitet: Nicht zusammengesetzte Animationen finden sich auf 40 Prozent (HTTP Archive Web Almanac 2025) der mobilen Seiten. Ein Aktionsfenster, das über margin-top von oben hereinrutscht, verschiebt bei jedem Frame die Seite darunter.

Erst schließen, dann aufräumen

Für INP zählt beim Pop-up der Moment des Schließens: Der Tipp auf das Kreuz ist eine Interaktion. Startet er Tracking, eine Gutscheinprüfung und das Nachladen weiterer Skripte zugleich, wird die Rückmeldung träge. Blenden Sie das Fenster zuerst sichtbar aus und verschieben Sie alles Übrige auf die Zeit danach. Das Skript des Pop-ups selbst muss nicht mit der Seite laden; es reicht, wenn es bereitsteht, bevor das Fenster erscheinen soll.

Nach Aktionsende: abbauen ohne Leerraum

Der Rückbau ist der Teil, der in der Planung meist fehlt. Endet die Aktion um Mitternacht, laufen zwei Varianten schief. Entweder bleibt die Reserve im CSS stehen und zeigt eine leere Fläche über dem Kopfbereich – kein Layoutsprung, aber ein sichtbarer Rest, der bis zum nächsten Release bleibt. Oder ein Skript blendet die abgelaufene Leiste im Browser aus und klappt den Platz zusammen. web.dev warnt ausdrücklich davor, den reservierten Platz einklappen zu lassen: Das Entfernen von zurückgehaltenem Raum kann genauso viel CLS verursachen wie das Einfügen von Inhalt (web.dev).

Die Lösung liegt wieder beim Server. Ab dem Endzeitpunkt rendert er weder Leiste noch Reserve noch Badges. Wer die Seite nach dem Ende lädt, bekommt ein Layout ohne Aktionselemente. Wer sie davor geladen hat, behält die Leiste bis zum nächsten Seitenwechsel – mit einem Countdown, der bei null stehen bleibt. Soll der Text dort auf „Aktion beendet“ wechseln, muss er in dieselbe Höhe passen. Entscheidend ist, dass im Browser nichts zusammenklappt, während jemand liest.

Damit das funktioniert, gehört die Reserve an das Element und nicht an das globale Layout. Steht min-height an der Klasse der Leiste und fehlt das Element im HTML, fehlt auch die Reserve. Steht sie dagegen als Innenabstand am body oder am Kopfbereich, bleibt sie nach der Aktion stehen. Dasselbe gilt für Badges: Sie verschwinden mit dem nächsten Rendern der Kachel, nicht durch ein Skript, das sie aus fertigen Seiten entfernt. Ein sauberer Ablauf für die Umschaltung sieht so aus:

  1. Start- und Endzeitpunkt mit Zeitzone in der Konfiguration hinterlegen, nicht als Text im Template.
  2. Für beide Zeitpunkte festlegen, wie der HTML-Cache reagiert: gezielt leeren oder die Lebensdauer vorher verkürzen.
  3. Die Reserve ausschließlich an den Klassen der Aktionselemente definieren, nicht am Seitenrahmen.
  4. Nach dem Ende Startseite, eine Kategorie und eine Produktseite auf dem Smartphone neu laden und prüfen, dass Leiste, Reserve und Badges fehlen.
  5. Am Folgetag die eigene Feldmessung prüfen, ob die Werte auf das Niveau vor der Aktion zurückgehen.

Messen vor und während der Aktion

Vor dem Start messen Sie die Seite so, wie sie in der Black Week aussieht, also mit eingeschalteter Aktion. Dafür braucht es einen Weg, die Elemente vorab sichtbar zu machen: einen Vorschauparameter, einen Testkanal oder ein vorgezogenes Startdatum auf der Testumgebung. Im Performance-Panel der Chrome-Entwicklerwerkzeuge zeigt nach einer Aufzeichnung die Spur „Layout Shifts“ jede Verschiebung; ein Klick darauf spielt sie ab und nennt die Details (web.dev). Messen Sie mit Smartphone-Profil, gedrosselter Verbindung und leerem Cache, und bedienen Sie die Seite während der Aufzeichnung: scrollen, Pop-up abwarten, schließen. Auf dem Entwicklungsrechner liegt das Skript des Tag-Managers sonst schon im Cache und erscheint zu früh, um aufzufallen. Für eine strukturierte Bestandsaufnahme vor der Aktion bietet sich eine technische Analyse an.

Während der Aktion zählen Felddaten. Der Chrome UX Report bildet einen rollierenden Durchschnitt über 28 Tage (Chrome for Developers). Ein Sprung, der am ersten Tag der Black Week live geht, ist dort erst nach und nach zu sehen und bleibt bis in den Dezember im Fenster. Für eine schnelle Reaktion brauchen Sie eine eigene Messung im Browser. Die Layout Instability API meldet jede Verschiebung mit den Elementen, die sich dabei bewegt haben (MDN Web Docs) – also mit dem verdrängten Inhalt, nicht mit der eingefügten Leiste selbst. Bei einer oben eingefügten Leiste stehen deshalb Kopfbereich oder Produktbild in der Liste, und der Auslöser sitzt direkt darüber. MDN führt die Schnittstelle allerdings nicht als Baseline, weil sie in einigen der meistgenutzten Browser nicht funktioniert (MDN Web Docs); die Werte decken also nicht jeden Besuch ab. Für die Frage, welches Element springt, reicht das.

layout-shift-log.js
// Layoutverschiebungen mit dem ersten verschobenen Element protokollieren (Chromium-Browser)
new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    if (entry.hadRecentInput) continue;
    const node = entry.sources && entry.sources[0] && entry.sources[0].node;
    const target = (node && node.className) || (node && node.nodeName) || 'unbekannt';
    console.log(entry.value.toFixed(4), target, Math.round(entry.startTime));
  }
}).observe({ type: 'layout-shift', buffered: true });

Im Betrieb schicken Sie statt der Konsolenausgabe den größten Wert je Seitenaufruf an die eigene Auswertung, zusammen mit dem Seitentyp und einer Kennung, ob die Aktion aktiv war. So sehen Sie den Unterschied zwischen Seiten mit und ohne Aktionselemente am selben Tag, ohne auf das CrUX-Fenster zu warten. Wie sich eigene Felddaten und CrUX ergänzen, beschreibt der Beitrag RUM oder CrUX. Welche Messungen ohne Einwilligung zulässig sind, klärt der Beitrag zur Performance-Messung ohne Einwilligung.

Prüfliste für die Black Week

  • Leiste, Countdown, Pop-up und Badges stehen auf der Testumgebung mit dem echten Text, der echten Schrift und dem echten Startdatum.
  • Jedes Aktionselement im Dokumentfluss hat eine reservierte Höhe je Breakpoint, definiert an seiner eigenen Klasse.
  • Gutschein-Pop-ups und Hinweisfenster liegen mit position: fixed über dem Inhalt und animieren nur transform und opacity.
  • Die Leiste kommt mit dem HTML vom Server; Start und Ende sind mit Zeitzone konfiguriert, der Cache ist für beide Zeitpunkte geplant.
  • Der Countdown rechnet aus dem Endzeitpunkt, nutzt tabular-nums, schreibt nur einen Textknoten und rechnet nach der Rückkehr in den Tab neu.
  • Badges sind Text und CSS oder Bilder mit width und height, positioniert über dem Produktbild.
  • Eine Aufzeichnung im Performance-Panel mit Smartphone-Profil, gedrosselter Verbindung und leerem Cache zeigt keine Verschiebung durch Aktionselemente.
  • Die eigene Feldmessung kennzeichnet Seitenaufrufe mit aktiver Aktion, damit Abweichungen am selben Tag auffallen.

Den Vorlauf bis zur Black Week nutzen

Aktionselemente sind selten einmalig. Die Leiste zur Black Week kehrt zu Ostern, zum Sommerschlussverkauf und zu Weihnachten wieder, der Countdown ebenso. Wer sie einmal als Komponente mit reservierter Höhe, serverseitigem Zeitfenster und schlankem Countdown baut, kann sie für jede folgende Aktion wiederverwenden. Die Black Week ist dafür ein guter Anlass, weil dort viel auf dem Spiel steht – und zugleich ein denkbar ungünstiger Zeitpunkt für eine Korrektur im laufenden Betrieb. Neben der Stabilität des Layouts gehört in diese Vorbereitung auch die Frage, ob Server und Shop den Andrang tragen; der Beitrag zu Lasttests für die Hochsaison beschreibt das Vorgehen. Sitzt oben auf der Startseite zusätzlich ein Karussell, lohnt der Blick in den Beitrag Slider im Kopfbereich.

Für Shops auf Shopware-Basis lassen sich Leiste und Badges als Template-Blöcke mit Zeitbedingung umsetzen; Hinweise zur Storefront gibt die Seite zur Shopware-Performance. Wenn Sie die Aktionselemente nicht selbst prüfen wollen, messen wir sie im Rahmen der Core-Web-Vitals-Optimierung mit eingeschalteter Aktion auf dem Smartphone, ordnen jede Verschiebung ihrem Element zu und bauen die Elemente so um, dass sie Platz reservieren, vom Server kommen und nach dem Ende ohne Rest verschwinden. Wo das Frontend dafür grundsätzlich umgebaut werden muss, setzt die Frontend-Optimierung an.

Quellen und Studien

Dieser Artikel basiert auf Daten aus: web.dev (Cumulative Layout Shift; Optimize Cumulative Layout Shift; Interaction to Next Paint; Optimize long tasks; Best practices for cookie notices); Chrome for Developers (CrUX API, The rolling average); HTTP Archive Web Almanac 2025 (Kapitel Performance); MDN Web Docs (Window: setTimeout(), LayoutShift, font-variant-numeric); Handelsverband Deutschland HDE (Pressemitteilung vom 17.11.2025 zu Black Friday und Cyber Monday).

Verwandte Artikel

Core Web Vitals & Messung

Lange Tasks aufteilen: INP mit scheduler.yield senken

Lange JavaScript-Tasks über 50 ms mit scheduler.yield() in Häppchen zerlegen, den Hauptthread zwischen den Chunks freigeben und den INP unter 200 ms halten.

12 Min. Lesezeit
Core Web Vitals & Messung

Long Animation Frames: INP-Bremsen im Frame aufspüren

Die Long-Animation-Frames-API zeigt seit Chrome 123 genau, welches Skript eine langsame INP-Interaktion verursacht – so optimieren Sie gezielt statt blind.

13 Min. Lesezeit
Core Web Vitals & Messung

Cookie-Banner und Core Web Vitals: LCP-Falle lösen

Cookie-Banner verschieben LCP, INP und CLS: So messen Sie den Einfluss des Consent-Layers im Feld und holen ihn technisch sauber aus dem kritischen Pfad.

13 Min. Lesezeit