ohne horizontales Scrollen, ohne abgeschnittene Inhalte
Wenn Nutzerinnen und Nutzer die Browserschrift auf 200 Prozent vergrößern, muss ein Shop weiterhin vollständig lesbar und bedienbar bleiben, ohne dass Inhalte abgeschnitten werden oder seitliches Scrollen nötig wird. Dieser Artikel zeigt praxisnah, wie rem-basierte Einheiten, reflowende Layouts, ein offener Viewport und gezielte Zoom-Tests genau das in Magento- und Hyvä-Shops zuverlässig sicherstellen, ohne aufwendige Sonderlösungen.
Inhaltsverzeichnis
- 1. Warum 200-Prozent-Zoom eine WCAG-Pflicht ist
- 2. rem und em statt fester Pixelwerte
- 3. Reflow: Layout ohne horizontales Scrollen
- 4. Viewport-Meta und Zoom-Sperren vermeiden
- 5. Tailwind CSS und rem-basierte Utility-Klassen
- 6. Navigation und Header bei hohem Zoom
- 7. Formulare, Buttons und Touch-Targets im Zoom
- 8. Zoom-Tests systematisch durchführen
- 9. Typische Layoutbrüche im Vergleich
- 10. Zusammenfassung
- 11. FAQ
1. Warum 200-Prozent-Zoom eine WCAG-Pflicht ist
Das Erfolgskriterium 1.4.4 Resize Text der WCAG 2.1 verlangt, dass Text bis zu 200 Prozent vergrößert werden kann, ohne dass Inhalt oder Funktionalität verloren gehen. Das ist keine Kür-Anforderung für Sehbehinderte im engeren Sinn, sondern betrifft eine deutlich größere Gruppe: ältere Nutzerinnen und Nutzer, Menschen mit vorübergehender Sehschwäche nach einer Augenoperation, alle die auf kleinen Laptop-Displays mit hoher Auflösung arbeiten und die Systemschrift vergrößern. Wer die Anforderung ignoriert, schließt nicht nur eine Randgruppe aus, sondern einen relevanten Teil der Zielgruppe eines jeden Online-Shops.
Technisch bedeutet 200 Prozent Zoom entweder eine Browser-Zoom-Funktion (Strg und Plus) oder eine erhöhte Basisschriftgröße im Betriebssystem, die sich auf die rem-Einheit im Browser auswirkt. Beide Wege müssen funktionieren. Ergänzend fordert das Kriterium 1.4.10 Reflow, dass Inhalte bei einer Viewport-Breite von 320 CSS-Pixeln, was einem 1280-Pixel-Bildschirm bei 400 Prozent Zoom entspricht, ohne horizontales Scrollen nutzbar bleiben, mit Ausnahme von Elementen, die zweidimensional bleiben müssen, etwa Tabellen, Karten oder Diagramme. Diese beiden Kriterien zusammen sind die technische Grundlage für alles, was in diesem Artikel folgt.
Wichtig ist der Unterschied zwischen Browser-Zoom und Textgrößen-Zoom im Betriebssystem. Browser-Zoom skaliert die gesamte Seite inklusive Layout und Bilder proportional, während reine Textgrößen-Änderungen in manchen Browsern nur Text betreffen und Container-Breiten unverändert lassen. Ein robustes Layout muss beide Fälle abfangen, denn Nutzerinnen und Nutzer wechseln je nach Gerät zwischen beiden Methoden.
2. rem und em statt fester Pixelwerte
Der häufigste Grund für gebrochenes Zoom-Verhalten ist Text, der in festen Pixelwerten gesetzt ist. Eine font-size: 16px-Deklaration ignoriert die vom Nutzer im Browser eingestellte Standardschriftgröße vollständig, während font-size: 1rem relativ zur Root-Schriftgröße skaliert, die typischerweise bei 16 Pixeln liegt, aber vom Nutzer auf 20, 24 oder mehr Pixel gesetzt werden kann. Der Effekt betrifft nicht nur Fließtext: auch Überschriften, Buttons, Formularfelder und Icon-Beschriftungen müssen relativ skalieren, sonst entsteht ein visuell inkonsistentes Layout, bei dem der Fließtext wächst, aber Navigation und Buttons stehen bleiben.
em und rem unterscheiden sich in der Referenz: em bezieht sich auf die Schriftgröße des Elternelements und kumuliert sich bei Verschachtelung, während rem immer relativ zur Root-Schriftgröße des html-Elements berechnet wird. Für Abstände innerhalb einer Komponente, die proportional zur Textgröße mitwachsen sollen, etwa Padding in einem Button, ist em oft die richtige Wahl. Für globale Größen wie Überschriften-Hierarchien und Container-Breiten ist rem vorzuziehen, weil es unabhängig von der Verschachtelungstiefe berechenbar bleibt.
/* WRONG: fixed pixel values ignore the user's browser font-size setting */
.product-title {
font-size: 24px;
line-height: 32px;
margin-bottom: 16px;
}
.btn-primary {
font-size: 14px;
padding: 8px 16px;
}
/* RIGHT: rem for global sizing, scales with the user's root font-size */
:root {
font-size: 100%; /* respects browser/OS default, usually 16px */
}
.product-title {
font-size: 1.5rem; /* 24px at default, scales with zoom */
line-height: 1.35; /* unitless line-height also scales correctly */
margin-bottom: 1rem;
}
/* em for component-internal spacing that should track the local font-size */
.btn-primary {
font-size: 0.875rem;
padding: 0.6em 1.2em; /* grows proportionally if btn font-size changes */
}
Ein Sonderfall betrifft Bilder mit fest gesetzten Pixel-Höhen für Icon-Text-Kombinationen. Wenn ein SVG-Icon mit height: 16px neben einem Text steht, der mit rem auf 24 Pixel wächst, entsteht bei hohem Zoom ein optisch unproportioniertes Icon. Icons in solchen Kontexten sollten mit em oder 1lh (line-height unit) skaliert werden, damit sie mit dem umgebenden Text mitwachsen, statt starr zu bleiben.
3. Reflow: Layout ohne horizontales Scrollen
Reflow bedeutet, dass sich der Seiteninhalt bei zunehmender Zoomstufe umbricht, statt eine feste Breite beizubehalten und horizontales Scrollen zu erzwingen. Die häufigste Ursache für gebrochenen Reflow sind feste Pixel-Breiten auf Containern, etwa width: 1200px statt max-width: 75rem. Bei 200 Prozent Zoom auf einem 1280-Pixel-Viewport verbleibt effektiv nur eine Breite von 640 CSS-Pixeln, und ein starr auf 1200 Pixel gesetzter Container erzwingt dann horizontales Scrollen über die gesamte Seite, was in WCAG 1.4.10 explizit als Verstoß gilt.
Die Lösung liegt in Flexbox- und Grid-Layouts mit relativen Einheiten und flex-wrap beziehungsweise responsiven Grid-Templates, die bei kleineren effektiven Viewport-Breiten automatisch von mehrspaltig auf einspaltig umschalten. CSS Grid mit grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr)) erledigt diesen Umbruch ohne zusätzliche Media Queries, weil minmax die Mindestbreite in rem definiert und damit ebenfalls mit dem Zoom skaliert.
Ein weiterer Stolperstein sind lange, ununterbrochene Zeichenketten wie Produkt-SKUs, lange URLs oder E-Mail-Adressen in Tabellenzellen. Ohne overflow-wrap: break-word oder word-break: break-word sprengen solche Strings die Zellbreite und erzwingen horizontales Scrollen, selbst wenn der Rest des Layouts korrekt reflowt. Diese Eigenschaft sollte projektweit auf Textcontainer angewendet werden, die Nutzereingaben oder variable Datenlängen darstellen.
/* WRONG: fixed pixel container width breaks reflow at 200% zoom */
.page-wrapper {
width: 1200px;
margin: 0 auto;
}
.product-grid {
display: flex;
width: 1200px; /* forces horizontal scroll once effective viewport shrinks */
}
/* RIGHT: max-width in rem plus a reflowing grid */
.page-wrapper {
max-width: 75rem; /* 1200px at default root font-size, but scales with zoom */
margin: 0 auto;
padding-inline: 1rem;
}
.product-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
gap: 1.5rem;
}
/* Prevent long unbreakable strings from forcing horizontal scroll */
.sku, .product-url, .customer-email {
overflow-wrap: break-word;
word-break: break-word;
}
4. Viewport-Meta und Zoom-Sperren vermeiden
Ein direkter WCAG-Verstoß, der in älteren Projekten immer wieder auftaucht, ist das Deaktivieren von Zoom im Viewport-Meta-Tag: <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">. Die Attribute maximum-scale=1.0 und user-scalable=no verhindern, dass mobile Nutzerinnen und Nutzer per Pinch-to-Zoom vergrößern können, und verletzen damit WCAG 1.4.4 direkt und unmittelbar messbar. Diese Einstellung wurde früher gewählt, um versehentliches Verschieben bei Formularen zu vermeiden, ist aber aus Accessibility-Sicht nicht akzeptabel.
Der korrekte Viewport-Tag für ein Hyvä-Theme lautet schlicht <meta name="viewport" content="width=device-width, initial-scale=1.0">, ohne maximum-scale und ohne user-scalable=no. Falls das Standard-Theme diese Einschränkungen enthält, sollte der entsprechende .phtml-Block im Layout-XML überschrieben werden, statt das Meta-Tag per JavaScript nachträglich zu manipulieren, was zu Race Conditions beim ersten Rendering führen kann.
5. Tailwind CSS und rem-basierte Utility-Klassen
Tailwind CSS setzt standardmäßig auf rem für nahezu alle Größen-Utilities, einschließlich Schriftgrößen (text-sm, text-lg), Abstände (p-4, gap-6) und Breiten (max-w-3xl). Das ist ein struktureller Vorteil gegenüber handgeschriebenem CSS, weil Entwickler in einem Hyvä-Theme selten versehentlich feste Pixelwerte einführen, solange sie bei den Standard-Utilities bleiben. Problematisch wird es erst, wenn arbitrary values mit expliziten Pixelangaben verwendet werden, etwa text-[16px] oder w-[320px], was die rem-Basis umgeht und dieselben Zoom-Probleme wie handgeschriebenes CSS reproduziert.
Bei der Tailwind-v4-Konfiguration im CSS-first-Ansatz lohnt sich eine projektweite Regel im Code-Review: arbitrary Pixelwerte für Typografie und Layout-Breiten sind grundsätzlich zu vermeiden und durch die vordefinierte Skala oder rem-basierte arbitrary values wie text-[1rem] zu ersetzen. Für Icon-Größen, die visuell immer gleich groß wirken sollen unabhängig vom Zoom, etwa Statusicons in einer Toolbar mit fixierter Höhe, ist ein bewusster Pixelwert manchmal vertretbar, sollte aber als Ausnahme dokumentiert werden.
<!-- WRONG: arbitrary pixel values bypass Tailwind's rem-based scale -->
<h3 class="text-[18px] leading-[24px] mb-[12px]">Produktdetails</h3>
<div class="w-[960px] mx-auto">...</div>
<!-- RIGHT: default Tailwind scale, rem-based and zoom-safe -->
<h3 class="text-lg leading-6 mb-3">Produktdetails</h3>
<div class="max-w-5xl mx-auto px-4">...</div>
<!-- Acceptable exception: rem-based arbitrary value when the scale doesn't fit -->
<span class="text-[1.375rem] font-bold">CHF 249.00</span>
6. Navigation und Header bei hohem Zoom
Sticky Header und Mega-Menü sind die Komponenten, die bei 200 Prozent Zoom am häufigsten brechen, weil sie oft mit fester Pixel-Höhe implementiert sind, um Layout Shift zu vermeiden. Ein Header mit height: 64px schneidet bei starker Textvergrößerung Logo, Suchfeld oder Warenkorb-Icon ab, sobald der Inhalt mehr vertikalen Platz braucht als die feste Höhe erlaubt. Die robuste Alternative ist eine min-height in rem statt einer starren height, kombiniert mit flex-wrap für die Kindelemente, sodass Suchfeld und Icons bei Bedarf in eine zweite Zeile umbrechen können.
Bei Mega-Menüs mit horizontaler Anordnung vieler Kategorien führt Zoom häufig dazu, dass Menüpunkte abgeschnitten werden oder übereinander liegen. Ein Alpine.js-gesteuertes Dropdown-Menü, wie es in Hyvä-Themes üblich ist, sollte bei der Breitenberechnung nicht auf feste Pixelwerte für max-width zurückgreifen, sondern auf vw-Einheiten mit Fallback oder rem-basierte Breiten, die sich am tatsächlich verfügbaren Platz orientieren. In der Praxis bewährt sich, das Mega-Menü ab einer bestimmten effektiven Viewport-Breite, gemessen mit einer matchMedia-Abfrage, automatisch auf eine mobile Akkordeon-Darstellung umzuschalten, statt zu versuchen, das Desktop-Layout gequetscht darzustellen.
// Alpine.js component: switch mega-menu to accordion layout
// when the *effective* viewport (post-zoom) drops below the desktop breakpoint
document.addEventListener('alpine:init', () => {
Alpine.data('megaMenu', () => ({
isCompact: false,
init() {
const mq = window.matchMedia('(max-width: 64rem)'); // rem-based, zoom-aware
this.isCompact = mq.matches;
mq.addEventListener('change', (e) => {
this.isCompact = e.matches;
});
},
}));
});
7. Formulare, Buttons und Touch-Targets im Zoom
Formulare sind bei Zoom-Tests besonders fehleranfällig, weil Eingabefelder, Labels und Fehlermeldungen gleichzeitig wachsen und dabei leicht die Ausrichtung zueinander verlieren. Ein Label, das per position: absolute mit festem Pixel-Offset über einem Input platziert ist, überlappt bei 200 Prozent Zoom häufig den Eingabetext, weil sich Label und Input nicht proportional zueinander verschieben. Die robuste Lösung ist ein natürlicher Dokumentfluss mit flex flex-col gap-2 statt absoluter Positionierung, sodass Label und Feld immer den korrekten Abstand behalten, unabhängig von der Textgröße.
Touch-Targets müssen laut WCAG 2.5.5 mindestens 44 mal 44 CSS-Pixel groß sein, und diese Anforderung darf bei Zoom nicht unterschritten werden. Ein Button, dessen Höhe über height: 32px fest definiert ist, bleibt bei Zoom optisch klein, während der umgebende Text wächst, was zu einem unproportionalen und schwer treffbaren Button führt. Mit min-height: 2.75rem (44 Pixel bei Standardgröße) und padding in em wachsen Buttons mit dem Zoom mit und bleiben stets komfortabel bedienbar. Konkret bedeutet das: statt <label class="absolute -top-2 left-3"> mit festem Pixel-Offset ein einfaches <div class="flex flex-col gap-2"> mit Label und Input im natürlichen Fluss, und statt class="h-8" ein class="min-h-[2.75rem]" auf dem Input-Feld.
8. Zoom-Tests systematisch durchführen
Zoom-Tests gehören in jede Accessibility-Prüfung und lassen sich mit wenigen Handgriffen reproduzierbar durchführen. In Chrome und Firefox setzt Strg und + beziehungsweise Strg und - die Zoomstufe in 10-Prozent-Schritten, während die Chrome DevTools über das Command Menu (Strg Umschalt P, dann "zoom") eine direkte Eingabe von 200 Prozent erlauben. Wichtig ist, den Test nicht nur bei 200 Prozent durchzuführen, sondern auch bei 100, 150 und 400 Prozent, um zu sehen, an welcher Stufe genau ein Layout zu brechen beginnt.
Für den Reflow-Test nach WCAG 1.4.10 simulieren die DevTools über den Responsive-Modus eine Viewport-Breite von 320 Pixeln bei gleichzeitig aktivem 100-Prozent-Zoom, was dem Effekt von 400 Prozent Zoom auf einem Standardbildschirm entspricht. Automatisierte Tools wie axe DevTools oder Lighthouse prüfen zwar Kontrast und semantische Struktur, erkennen aber keine gebrochenen Zoom-Layouts zuverlässig, weshalb der manuelle visuelle Test durch eine echte Person unverzichtbar bleibt.
In der CI-Pipeline lässt sich ein automatisierter Basis-Check ergänzen, der mit Playwright den Viewport auf 320 mal 640 Pixel setzt und per Vergleich prüft, ob horizontales Scrollen auftritt, indem document.documentElement.scrollWidth mit document.documentElement.clientWidth verglichen wird. Das ersetzt keinen vollständigen manuellen Zoom-Test, fängt aber grobe Regressionen früh ab, bevor sie in die Produktion gelangen.
// Playwright: basic reflow regression check for CI
const { test, expect } = require('@playwright/test');
test('no horizontal scroll at 320px viewport (WCAG 1.4.10 reflow)', async ({ page }) => {
await page.setViewportSize({ width: 320, height: 640 });
await page.goto('https://shop.example.com/product/example-sku');
const hasHorizontalScroll = await page.evaluate(() => {
return document.documentElement.scrollWidth > document.documentElement.clientWidth;
});
expect(hasHorizontalScroll).toBe(false);
});
9. Typische Layoutbrüche im Vergleich
Die folgende Tabelle fasst die häufigsten Fehlerquellen zusammen, die in Zoom-Audits von Magento- und Hyvä-Shops immer wieder auftauchen, zusammen mit der jeweils robusten Alternative.
| Bereich | Bricht bei Zoom | Robuste Lösung | WCAG-Bezug |
|---|---|---|---|
| Schriftgrößen | font-size: 14px |
font-size: 0.875rem |
1.4.4 Resize Text |
| Container-Breite | width: 1200px |
max-width: 75rem |
1.4.10 Reflow |
| Viewport-Meta | user-scalable=no |
kein maximum-scale, kein user-scalable | 1.4.4 Resize Text |
| Header-Höhe | height: 64px |
min-height: 4rem + flex-wrap |
1.4.10 Reflow |
| Buttons / Touch-Targets | height: 32px |
min-height: 2.75rem |
2.5.5 Target Size |
| Lange Strings (SKU, URL) | kein Umbruch, sprengt Zelle | overflow-wrap: break-word |
1.4.10 Reflow |
Auffällig ist, dass fast alle Probleme auf dieselbe Ursache zurückgehen: feste Pixelwerte an Stellen, an denen relative Einheiten das Layout proportional mitwachsen ließen. Ein einziges konsequent durchgehaltenes Pattern, rem und em statt px für alles außer Border-Breiten und wenigen bewussten Ausnahmen, verhindert die meisten dieser Fehler bereits im Ansatz.
Mironsoft
Barrierefreiheit, WCAG-Audits und zugängliche Magento-Frontends
Hält euer Shop einem 200-Prozent-Zoom-Test stand?
Wir prüfen Magento- und Hyvä-Frontends auf Reflow, rem-basierte Typografie und Zoom-Verhalten nach WCAG 1.4.4 und 1.4.10 und liefern konkrete Fixes für Layout, Navigation und Formulare, statt allgemeiner Checklisten.
Zoom-Audit
Manuelle Prüfung bei 100, 150, 200 und 400 Prozent Zoom auf allen Kernseiten
rem-Refactoring
Fixe Pixelwerte in Tailwind- und Hyvä-Templates gegen rem und em ersetzen
CI-Integration
Playwright-Reflow-Checks in die Deploy-Pipeline integrieren
10. Zusammenfassung
Responsive Text und Zoom-Unterstützung bis 200 Prozent sind keine Kür, sondern eine explizite WCAG-Anforderung, die eine große und wachsende Nutzergruppe betrifft. Die technische Grundlage ist einfach zu benennen, auch wenn die konsequente Umsetzung Disziplin erfordert: rem und em statt fester Pixelwerte für Schrift, Abstände und Container-Breiten, ein unverändertes Viewport-Meta-Tag ohne Zoom-Sperren, sowie Flexbox- und Grid-Layouts, die bei sinkender effektiver Viewport-Breite automatisch reflowen statt horizontal zu scrollen.
Tailwind CSS erleichtert die Umsetzung, weil die Standard-Utility-Skala bereits auf rem basiert. Die größte verbleibende Fehlerquelle sind arbitrary Pixelwerte und handgeschriebenes CSS mit festen Größen für Header, Buttons und absolut positionierte Formularlabels. Systematische Zoom-Tests bei mehreren Zoomstufen, ergänzt durch automatisierte Reflow-Checks in der CI-Pipeline, decken die meisten Regressionen auf, bevor sie live gehen.
Responsive Text und Zoom-Unterstützung bis 200 Prozent: Das Wichtigste auf einen Blick
WCAG-Grundlage
1.4.4 Resize Text fordert 200 Prozent Zoom ohne Funktionsverlust, 1.4.10 Reflow fordert kein horizontales Scrollen bei 320 CSS-Pixeln Breite.
rem statt px
Schriftgrößen, Abstände und Container-Breiten in rem und em definieren, damit sie mit dem Nutzer-Zoom mitwachsen.
Viewport-Meta
Niemals maximum-scale oder user-scalable=no setzen. Pinch-to-Zoom muss auf allen Geräten funktionieren.
Testing
Manuell bei 100, 150, 200 und 400 Prozent testen, automatisierte Reflow-Checks mit Playwright in die CI-Pipeline integrieren.