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-heightoderaspect-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
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ügt | Verschiebung | Viewport | Layout-Shift-Wert, höchstens |
|---|---|---|---|
| Einzeilige Hinweisleiste | 40 px | Smartphone, 844 px hoch | 0,047 |
| Zweizeilige Leiste auf dem Smartphone | 64 px | Smartphone, 844 px hoch | 0,076 |
| Leiste mit eigener Countdown-Zeile | 90 px | Smartphone, 844 px hoch | 0,107 |
| Einzeilige Hinweisleiste | 40 px | Desktop, 1440 × 900 px | 0,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
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.
/* 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.
<!-- 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
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.
// 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
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:
- Start- und Endzeitpunkt mit Zeitzone in der Konfiguration hinterlegen, nicht als Text im Template.
- Für beide Zeitpunkte festlegen, wie der HTML-Cache reagiert: gezielt leeren oder die Lebensdauer vorher verkürzen.
- Die Reserve ausschließlich an den Klassen der Aktionselemente definieren, nicht am Seitenrahmen.
- Nach dem Ende Startseite, eine Kategorie und eine Produktseite auf dem Smartphone neu laden und prüfen, dass Leiste, Reserve und Badges fehlen.
- 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.
// 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 nurtransformundopacity. - 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
widthundheight, 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
Verwandte Artikel
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.
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.
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.