Korrekturen zur Barrierefreiheit im Code Ihres Themes für Magento
Validiscan behebt Fehler der Barrierefreiheit in den .phtml-Templates, im Layout-XML und in den LESS- oder CSS-Stylesheets Ihres Magento-2-Themes. Nichts gelangt in Ihren Live-Shop, bevor Ihr Entwicklungsteam die Änderungen zusammenführt oder einspielt und das Theme bereitstellt.
Zuletzt aktualisiert:
Auf dieser Seite: 6 Antworten
Was ändert Validiscan in einem Magento-Theme?
Validiscan ändert nur die Dateien des Frontend-Themes Ihres Magento-2-Shops, des Ordners mit seiner theme.xml, meist unter app/design/frontend. Änderungen an anderen Dateien bestehen die Validierung nicht und werden nie ausgeliefert, und keine Korrektur installiert eine Extension oder fügt ein Skript hinzu, das Ihre Seiten im Browser der Besucherinnen und Besucher umschreibt.
Templates und Styles, die Ihr Theme nicht überschreibt, stammen aus seinem Parent-Theme, etwa Luma oder Blank, oder aus den Modulen von Magento. Die Rezepte kopieren diese Dateien nicht in Ihr Theme: Kommt ein Fehler aus einer Datei, die Ihr Theme nicht überschreibt, nimmt das Rezept keine Änderung vor, und der Befund bleibt einem Menschen überlassen. Inhalte und Einstellungen, die Sie im Magento-Adminbereich pflegen, etwa CMS-Seiten und -Blöcke, Page-Builder-Inhalte, das Locale einer Store View oder die HTML-Head-Einstellungen, sind keine Dateien des Themes, deshalb ändern die Korrekturen sie nicht. Eingebundene Dienste von Drittanbietern wie Zahlungs- oder Chat-Widgets sind in einem Projekt nicht enthalten.
Details: die Ordner, wie eine Änderung aussieht, und wo die Rezepte ihre Styles hinzufügen
Validiscan ändert nur die Dateien des Frontend-Themes Ihres Magento-2-Shops, des Ordners, der seine theme.xml enthält, meist unter app/design/frontend: die .phtml- und .html-Templates, das Layout-XML, die LESS-Quellen und kompilierten Stylesheets unter web/css, die Skripte unter web/js und die deutsche Übersetzungsdatei in i18n. Eine Änderung an jeder anderen Datei, etwa am eigenen Code von Magento, an einer Extension oder an Build-Ausgaben, besteht die Validierung nicht, und eine Änderung, die die Validierung nicht besteht, kann nicht freigegeben werden und wird deshalb nie ausgeliefert.
Jede Änderung ist eine gewöhnliche Bearbeitung einer Theme-Datei, die Ihr Entwicklungsteam Zeile für Zeile lesen kann. Neue Style-Regeln, die eine Korrektur hinzufügt, stehen in einem Block am Ende des Stylesheets, zwischen Kommentaren, die das Rezept nennen, zum Beispiel /* validiscan:. Kleinere Änderungen, etwa ein korrigierter Farbwert oder ein entferntes outline: none, werden dort vorgenommen, wo der Code schon steht. Worte, die eine Korrektur einem .phtml-Template hinzufügt, laufen durch die Übersetzungsfunktion __() von Magento und werden wie der eigene Text des Themes maskiert; in HTML-Dateien, die im Theme unter Magento_Cms/content liegen, verwenden die Rezepte stattdessen die Direktive trans von Magento. Magento verwaltet CMS-Seiten und -Blöcke im Magento-Adminbereich, deshalb gelangt eine Änderung an einer dieser Dateien nur dort in Ihren Shop, wo Ihr Projekt die Datei in seine CMS-Seiten oder -Blöcke lädt. Keine Korrektur installiert eine Extension oder fügt ein Skript hinzu, das Ihre Seiten im Browser der Besucherinnen und Besucher umschreibt, wie es ein Overlay tut.
Die Rezepte für den Fokusrahmen, die Touch-Ziele, den Skip-Link und neue Schaltflächen fügen ihre Style-Regeln am Ende des Haupt-Stylesheets des Themes hinzu: seiner _extend.less oder _theme.less unter web/css/source, mit einer neuen _extend.less, wo ein auf Luma oder Blank aufgebautes Theme keine von beiden hat, und außerdem in einer kompilierten web/css/styles-m.css, wo das Theme eine mitbringt. Bei einem Theme, das nicht auf Luma oder Blank aufbaut und dort weder LESS-Quellen noch diese kompilierte Datei hat, nehmen die Rezepte für den Fokusrahmen, die Touch-Ziele und die Schaltflächen keine Änderung vor, und das Rezept für den Skip-Link fügt den Link ohne Styles hinzu.
Wie erhält Validiscan Zugriff auf Ihr Magento-Theme?
Über ein GitHub-Repository oder als ZIP des Theme-Ordners, das im Kundenportal hochgeladen wird, denn Validiscan bereitet jede Korrektur an einer Kopie des Quellcodes Ihres Magento-Themes vor. Welcher Weg passt, hängt davon ab, wo der Code liegt: Ein Repository erhält einen Pull Request, ein ZIP ein Patch-Paket.
| Weg | Was Sie geben | Die Änderungen kommen zurück als |
|---|---|---|
| Über Ihr GitHub-Repository | Zugriff auf das Repository, das das Theme allein oder Ihr gesamtes Magento-Projekt enthalten kann, über die GitHub App von Validiscan oder ein Zugriffstoken | Ein Pull Request |
| Aus einem ZIP des Theme-Ordners | Ihren Theme-Ordner unter app/ als eine ZIP-Datei von bis zu 100 MB, im Kundenportal hochgeladen von einem Admin Ihrer Organisation | Ein Patch-Paket |
Über Ihr GitHub-Repository
Liegt der Code Ihres Themes in einem GitHub-Repository, geben Sie Validiscan Zugriff auf dieses Repository. Sie installieren die GitHub App von Validiscan darauf oder geben Validiscan ein Zugriffstoken dafür. Die Einrichtung von Validiscan legt die Berechtigungen der App fest: Lese- und Schreibzugriff auf die Inhalte und die Pull Requests des Repositorys, Lesezugriff auf seine Metadaten und sonst nichts.
Das Repository kann das Theme allein oder Ihr gesamtes Magento-Projekt enthalten. Die Rezepte finden das Theme anhand seiner theme.xml in app/ oder, in einem Repository, das nur das Theme enthält, auf oberster Ebene neben seiner registration.php. Enthält das Repository mehrere Frontend-Themes, arbeitet ein Rezept an dem Theme, in dem das fehlerhafte Element gefunden wurde, und ändert nichts, wenn es nicht feststellen kann, welches Theme das ist. Ein Theme, das an anderer Stelle in einem Projekt liegt, etwa als Composer-Paket unter vendor, liegt außerhalb der Pfade, die eine Korrektur ändern darf. Die Änderungen kommen als Pull Request.
Aus einem ZIP des Theme-Ordners
Ohne GitHub-Repository erstellt Ihr Entwicklungsteam ein ZIP des Themes. Das Kundenportal gibt diese Anleitung: „Bitten Sie Ihr Entwicklungsteam um ein ZIP Ihres Theme-Ordners unter app/design/frontend.“ Ein Admin Ihrer Organisation lädt die Datei anschließend im Kundenportal hoch, als eine einzige ZIP-Datei von bis zu 100 MB. Validiscan bereitet die Änderungen auf dieser Kopie Ihres Themes vor und schickt sie als Patch-Paket zurück.
Ohne einen der beiden Wege hat Validiscan keinen Code, den es ändern könnte, und es wird keine Korrektur vorbereitet.
Wie gelangen die Änderungen in Ihren Shop?
Auf Magento kommen die Änderungen als Pull Request oder als Patch-Paket, und Ihr Entwicklungsteam entscheidet, wann sie live gehen. Validiscan liefert nur Änderungen aus, die es geprüft und freigegeben hat, und ändert Ihren Live-Shop nicht; die Auslieferung als unveröffentlichte Kopie des Themes über die Theme-Bibliothek von Shopify gibt es nur für Shopify.
- Validiscan liefert die Änderungen aus, die es geprüft und freigegeben hat: einen Pull Request auf einem neuen Branch oder ein Patch-Paket für Ihr Entwicklungsteam.
- Ihr Entwicklungsteam prüft die Änderungen. Bei einem Pull Request bittet die Checkliste um eine Vorschau- oder Staging-Umgebung, nicht den Live-Shop, und um eine Prüfung der betroffenen Seiten, auch allein mit der Tastatur.
- Ihr Entwicklungsteam führt den Pull Request zusammen oder spielt das Patch-Paket ein.
- Ihr Entwicklungsteam kompiliert die Stylesheets und stellt das Theme bereit: Die LESS-Änderungen werden wirksam, sobald die statischen Dateien des Themes bereitgestellt sind.
- Sobald die Änderungen live sind, prüft ein Verifizierungsscan die betroffenen Seiten erneut.
Ein Pull Request
Mit Zugriff auf Ihr Repository legt Validiscan einen neuen Branch mit dem Namen validiscan/ an, committet jede Korrektur einzeln und öffnet einen Pull Request mit einer Übersichtstabelle, einer Erklärung jeder Änderung und einer Checkliste für die Prüfung. In Ihren Standard-Branch wird nichts übertragen. Die Checkliste bittet Ihr Entwicklungsteam, den Branch in einer Vorschau- oder Staging-Umgebung bereitzustellen, nicht im Live-Shop, und die betroffenen Seiten dort vor dem Zusammenführen zu prüfen, auch allein mit der Tastatur.
Ein Patch-Paket
Aus dem hochgeladenen ZIP bereitet Validiscan ein ZIP-Archiv vor und schickt es Ihrem Entwicklungsteam. Es enthält die PATCH.md mit jeder Änderung und der Anleitung, wie sie eingespielt wird, alle Änderungen in einer Patch-Datei, die sich mit git apply einspielen lässt, eine Patch-Datei je Korrektur, die vollständigen geänderten Dateien und eine README.md. Ihr Entwicklungsteam spielt die Änderungen ein, testet sie und stellt das Theme bereit. Was ein Pull Request und ein Patch-Paket enthalten
Die Styles kompilieren
Ein Theme auf Basis von Luma oder Blank legt seine Styles als LESS-Quellen ab, und Magento kompiliert sie zu dem CSS, das es ausliefert. Das Werkzeug von Magento für die Bereitstellung statischer Dateien, bin/, kompiliert die LESS-Dateien und veröffentlicht das Ergebnis, wie die Dokumentation von Adobe zur CSS- und LESS-Vorverarbeitung es beschreibt. Die LESS-Änderungen werden daher wirksam, sobald Ihr Entwicklungsteam die statischen Dateien des geänderten Themes bereitstellt. Bringt das Theme zusätzlich eine kompilierte web/css/styles-m.css mit, liefert Magento diese Datei unverändert aus; die Rezepte nehmen deshalb dieselbe Änderung auch dort vor, damit beide Dateien im Gleichschritt bleiben. Wohin Korrekturen in einem Magento-Theme gehören und was ein Theme-Update rückgängig machen kann
Was ändern die Rezepte in einem Magento-Theme?
Jedes der 20 Rezepte von Validiscan für Magento-Themes ist eine deterministische Änderung für eine Art von Fehler: Derselbe Code erhält immer dieselbe Änderung. Ein Rezept ändert nur dort etwas, wo der Code des Themes zeigt, welche Änderung die richtige ist; wo er es nicht zeigt, ändert es nichts.
Seitenstruktur und Navigation
-
Seitensprache aus dem Locale Ihres Stores html-lang Gibt die Überschreibung des Root-Templates in Ihrem Theme ein eigenes
langoder keines aus, gibt sie wieder die eigenen Attribute von Magento aus, sodass jede Seite ein gültigeslangerhält.Magento legt die Sprache einer Seite anhand des Locales ihrer Store View fest, etwa
enfür das Localeen_US, und gibt sie über sein Root-Template aus. Überschreibt Ihr Theme dieses Template und gibt ein eigeneslangaus, meist den Locale-Codeen_US, der kein gültiges Sprach-Tag ist, oder gar keinlang, gibt das Template wieder die eigenen Attribute von Magento aus, sodass jede Seite ein gültigeslangerhält. Einlang, das im Layout-XML in der Locale-Form gesetzt ist, etwade_DE, wird zude-DE. Eine Seite, deren Inhalt in einer anderen Sprache verfasst ist als ihre Store View, etwa eine deutsche Rechtsseite in einem englischen Store, bleibt Ihnen überlassen: Liefern Sie sie aus einer Store View in dieser Sprache aus, oder zeichnen Sie die Sprache im Inhalt selbst aus.- Abgedeckte Regeln
-
-
html-has-langAUTO geprüft durch vs-lang -
html-lang-validAUTO geprüft durch vs-lang -
vs-langAUTO
-
- Geänderte Dateitypen
-
.phtml
fixes the vs-lang finding in root.phtml and validates Beispieldaten app/design/frontend/Validiscan/fixture/Magento_Theme/templates/root.phtml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Theme/templates/root.phtml: 1 hinzugefügt, 1 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/Magento_Theme/templates/root.phtml: 1 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung Code 15 15 ?> 16 16 <!doctype html> 17 17 <!-- VALIDISCAN-SEEDED vs-lang: root.phtml prints the Magento locale code (en_US) instead of a BCP 47 language tag --> 18 Entfernt <html lang="<?= $block->escapeHtmlAttr($htmlLocale) ?>"> 18 Hinzugefügt <html <?= /* @noEscape */ $htmlAttributes ?>> 19 19 <head <?= /* @noEscape */ $headAttributes ?>> 20 20 <?= /* @noEscape */ $requireJs ?> 21 21 <?= /* @noEscape */ $headContent ?> -
Skip-Link, Hauptbereich und benannte Menüs skip-link-main Der Skip-Link von Luma und der
<main>-Bereich kehren zurück, wo Ihr Theme sie verloren hat, und unbenannte Navigationsbereiche erhalten einen Namen, sofern der Code ihren Zweck zeigt.Das Theme Luma von Magento hat oben auf jeder Seite einen Link „Skip to Content“, der zum Anfang des Hauptinhalts springt, und dieser Inhalt ist der
<main>-Bereich der Seite. Ein Theme kann beides verlieren. Hat das Theme den Link in seinem Layout-XML entfernt, macht das Rezept die Entfernung rückgängig. Gibt das eigene Header-Template des Themes den Link nie aus, fügt das Rezept ihn dort mit den Klassen von Luma hinzu; würden die Stylesheets des Themes ihn ungestaltet lassen, fügt das Rezept Styles hinzu, die ihn verborgen halten, bis er den Tastaturfokus erhält. Rendert das Layout-XML den Hauptinhalt als anderes Element, etwa als<div>, wird er wieder zu<main>. Navigationsbereiche ohne Namen erhalten einen, der sagt, was sie enthalten, etwa „Main menu“, „Footer links“ oder „Breadcrumbs“; ein Bereich, dessen Zweck der Code nicht zeigt oder der seinen Namen mit einem anderen teilen würde, bleibt einem Menschen überlassen. Inhalt außerhalb von Kopfbereich, Hauptbereich und Fußbereich, etwa eine Aktionsleiste, wird nicht verschoben: Das Verschieben ist eine Änderung an Ihrem Layout, die Ihr Entwicklungsteam im Layout-XML vornimmt.- Abgedeckte Regeln
-
-
bypassAUTO geprüft durch vs-headings-landmarks -
landmark-one-mainAUTO geprüft durch vs-headings-landmarks -
regionAUTO -
skip-linkAUTO -
vs-headings-landmarksAUTO -
landmark-uniqueASSISTED
-
- Geänderte Dateitypen
-
.css.less.phtml.xml
fixes the vs-headings-landmarks finding and validates Beispieldaten app/design/frontend/Validiscan/fixture/Magento_Cms/layout/cms_index_index.xml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Cms/layout/cms_index_index.xml: 1 hinzugefügt, 1 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/Magento_Cms/layout/cms_index_index.xml: 1 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung Code 6 6 <div>, so the home page has no <main> landmark (and, with the page title hidden by 7 7 display:none in _theme.less, no h1 either). 8 8 Fixed variant: keep htmlTag="main"; hide the title visually only (clip), not with display:none. --> 9 Entfernt <referenceContainer name="main.content" htmlTag="div" htmlId="maincontent" htmlClass="page-main"/> 9 Hinzugefügt <referenceContainer name="main.content" htmlTag="main" htmlId="maincontent" htmlClass="page-main"/> 10 10 <referenceBlock name="breadcrumbs" remove="true"/> 11 11 </body> 12 12 </page> app/design/frontend/Validiscan/fixture/Magento_Theme/templates/html/footer.phtml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Theme/templates/html/footer.phtml: 1 hinzugefügt, 1 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/Magento_Theme/templates/html/footer.phtml: 1 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung Code 19 19 ?> 20 20 <!-- VALIDISCAN-SEEDED list + landmark-unique: list items wrapped in a div inside the ul; second unlabelled nav --> 21 21 <?php /* Fixed variant: <nav class="footer-nav" aria-label="Footer links"> with the <li> elements directly in the <ul>. */ ?> 22 Entfernt <nav class="footer-nav"> 22 Hinzugefügt <nav class="footer-nav" aria-label="<?= $escaper->escapeHtmlAttr(__('Footer links')) ?>"> 23 23 <ul class="footer links"> 24 24 <div class="footer-col"> 25 25 <?php foreach ($links as $link): ?> app/design/frontend/Validiscan/fixture/Magento_Theme/templates/html/header.phtml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Theme/templates/html/header.phtml: 1 hinzugefügt, 0 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/Magento_Theme/templates/html/header.phtml: 1 hinzugefügt, 0 entfernt Zeile vorher Zeile nachher Änderung Code 13 13 <header class="page-header"> 14 14 <div class="panel wrapper"> 15 15 <div class="panel header"> 16 Hinzugefügt <a class="action skip contentarea" href="#contentarea"><span><?= $escaper->escapeHtml(__('Skip to Content')) ?></span></a> 16 17 <!-- VALIDISCAN-SEEDED vs-headings-landmarks: the skip link was removed from the header panel --> 17 18 <?php /* Fixed variant: <a class="action skip contentarea" href="#contentarea"><span>Skip to Content</span></a> */ ?> 18 19 <?php if ($linksMoved): ?> app/design/frontend/Validiscan/fixture/Magento_Theme/templates/html/topmenu.phtml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Theme/templates/html/topmenu.phtml: 1 hinzugefügt, 1 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/Magento_Theme/templates/html/topmenu.phtml: 1 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung Code 15 15 <div class="section-item-content nav-sections-item-content" id="store.menu" data-role="content"> 16 16 <!-- VALIDISCAN-SEEDED aria-required-children + landmark-unique: menubar whose children are plain list items; nav without a label --> 17 17 <?php /* Fixed variant: <nav ... aria-label="Main menu"> and a plain <ul> (no menubar role). */ ?> 18 Entfernt <nav class="navigation" data-action="navigation"> 18 Hinzugefügt <nav class="navigation" data-action="navigation" aria-label="<?= $escaper->escapeHtmlAttr(__('Main menu')) ?>"> 19 19 <ul role="menubar" data-mage-init='{"menu":{"responsive":true,"expanded":true,"position":{"my":"left top","at":"left bottom"}}}'> 20 20 <?php foreach ($items as $item): ?> 21 21 <li class="level0 <?= $escaper->escapeHtmlAttr($item['class']) ?> level-top"><a href="<?= $escaper->escapeUrl($item['url']) ?>" class="level-top"><span><?= $escaper->escapeHtml($item['label']) ?></span></a></li> app/design/frontend/Validiscan/fixture/web/css/source/_theme.less Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 24 hinzugefügt, 0 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 24 hinzugefügt, 0 entfernt Zeile vorher Zeile nachher Änderung Code 1264 1264 height: 18px; 1265 1265 stroke-width: 3; 1266 1266 } 1267 Hinzugefügt 1268 Hinzugefügt /* validiscan:skip-link-main */ 1269 Hinzugefügt .action.skip:not(:focus) { 1270 Hinzugefügt position: absolute; 1271 Hinzugefügt width: 1px; 1272 Hinzugefügt height: 1px; 1273 Hinzugefügt margin: -1px; 1274 Hinzugefügt padding: 0; 1275 Hinzugefügt overflow: hidden; 1276 Hinzugefügt clip: rect(0 0 0 0); 1277 Hinzugefügt white-space: nowrap; 1278 Hinzugefügt border: 0; 1279 Hinzugefügt } 1280 Hinzugefügt .action.skip:focus { 1281 Hinzugefügt position: absolute; 1282 Hinzugefügt top: 4px; 1283 Hinzugefügt left: 4px; 1284 Hinzugefügt z-index: 100; 1285 Hinzugefügt padding: 8px 12px; 1286 Hinzugefügt background: #fff; 1287 Hinzugefügt color: #1a1a1a; 1288 Hinzugefügt text-decoration: underline; 1289 Hinzugefügt } 1290 Hinzugefügt /* /validiscan:skip-link-main */ app/design/frontend/Validiscan/fixture/web/css/styles-m.css Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 24 hinzugefügt, 0 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 24 hinzugefügt, 0 entfernt Zeile vorher Zeile nachher Änderung Code 1232 1232 height: 18px; 1233 1233 stroke-width: 3; 1234 1234 } 1235 Hinzugefügt 1236 Hinzugefügt /* validiscan:skip-link-main */ 1237 Hinzugefügt .action.skip:not(:focus) { 1238 Hinzugefügt position: absolute; 1239 Hinzugefügt width: 1px; 1240 Hinzugefügt height: 1px; 1241 Hinzugefügt margin: -1px; 1242 Hinzugefügt padding: 0; 1243 Hinzugefügt overflow: hidden; 1244 Hinzugefügt clip: rect(0 0 0 0); 1245 Hinzugefügt white-space: nowrap; 1246 Hinzugefügt border: 0; 1247 Hinzugefügt } 1248 Hinzugefügt .action.skip:focus { 1249 Hinzugefügt position: absolute; 1250 Hinzugefügt top: 4px; 1251 Hinzugefügt left: 4px; 1252 Hinzugefügt z-index: 100; 1253 Hinzugefügt padding: 8px 12px; 1254 Hinzugefügt background: #fff; 1255 Hinzugefügt color: #1a1a1a; 1256 Hinzugefügt text-decoration: underline; 1257 Hinzugefügt } 1258 Hinzugefügt /* /validiscan:skip-link-main */ -
Ein Titel auf jeder Seite document-title-template Leere Titel, die Ihr Theme im Layout-XML setzt, werden entfernt, sodass der eigene Titel von Magento wieder gilt.
Magento gibt jeder Seite einen eigenen Titel, etwa den Namen des Produkts oder der Kategorie oder „Search results for:“ und den Suchbegriff, mit dem Präfix oder Suffix, das für Ihren Store festgelegt ist. Ein Theme kann ihn mit einem leeren
<title>im Layout-XML überschreiben, und die Seite hat dann keinen Titel. Das Rezept entfernt solche leeren Titel, sodass der eigene Titel von Magento wieder gilt. Titel mit Text sind Ihr Wortlaut und bleiben, wie sie sind. Leert keine Layout-Datei des Themes den Titel, ändert das Rezept nichts: Der Titel kommt dann von der Seite selbst und aus den HTML-Head-Einstellungen im Magento-Adminbereich.- Abgedeckte Regeln
-
-
document-titleAUTO
-
- Geänderte Dateitypen
-
.xml
removes the blank search results title and validates Beispieldaten app/design/frontend/Validiscan/fixture/Magento_CatalogSearch/layout/catalogsearch_result_index.xml Änderungen an app/design/frontend/Validiscan/fixture/Magento_CatalogSearch/layout/catalogsearch_result_index.xml: 0 hinzugefügt, 1 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/Magento_CatalogSearch/layout/catalogsearch_result_index.xml: 0 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung Code 4 4 <!-- VALIDISCAN-SEEDED document-title: a "hide the SEO title" customisation sets an empty page title, 5 5 so the rendered <title></title> is empty. The visible h1 is set separately by the page.main.title block. 6 6 Fixed variant: <title>Search results for: 'jacket'</title>. --> 7 Entfernt <title> </title> 8 7 </head> 9 8 <body> 10 9 <referenceBlock name="search_result_list" template="Magento_Catalog::product/list.phtml"/> -
Überschriften ohne übersprungene Ebenen heading-levels Eine Überschrift, die eine Ebene überspringt, rückt mit den folgenden Überschriften ihres Templates auf, sofern sich die Ebene davor ablesen lässt; ein mit
display: noneausgeblendeter Seitentitel wird stattdessen nur visuell ausgeblendet.Eine Überschrift, die eine Ebene überspringt, etwa ein h4 direkt nach einem h2, rückt zur nächsten Ebene auf, und die Überschriften, die ihr im selben Template auf ihrer Ebene oder tiefer folgen, rücken mit. Klassen bleiben erhalten, sodass Styles, die das Theme über Klassen setzt, weiter gelten; Styles, die das Theme über das Tag der Überschrift setzt, prüft Ihr Entwicklungsteam. Lässt sich die Ebene der vorangehenden Überschrift weder aus dem Scan noch aus demselben Template ablesen, bleibt die Überschrift einem Menschen überlassen. Magento gibt den Titel jeder Seite als h1 aus. Ein Theme, das den Titel auf einer Seite mit
display: noneausblendet, entfernt das einzige h1 der Seite; das Rezept blendet ihn deshalb stattdessen nur visuell aus, so wie die eigenen Styles von Magento Text ausblenden, und das h1 bleibt in der Gliederung, die Screenreader verwenden. Ein Titel, der im Layout-XML entfernt wurde, bleibt einem Menschen überlassen, weil ihn wiederherzustellen das Aussehen der Seite verändern würde.- Abgedeckte Regeln
-
-
heading-orderAUTO geprüft durch vs-headings-landmarks -
page-has-heading-oneAUTO geprüft durch vs-headings-landmarks -
vs-headings-landmarksAUTO
-
- Geänderte Dateitypen
-
.css.html.less
keeps the hidden home page title as the h1 and validates Beispieldaten app/design/frontend/Validiscan/fixture/web/css/source/_theme.less Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 6 hinzugefügt, 1 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 6 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung Code 1093 1093 1094 1094 // VALIDISCAN-SEEDED vs-headings-landmarks: the home page title is display:none, so the page has no h1. 1095 1095 .cms-index-index .page-title-wrapper { 1096 Entfernt display: none; 1096 Hinzugefügt position: absolute; 1097 Hinzugefügt width: 1px; 1098 Hinzugefügt height: 1px; 1099 Hinzugefügt overflow: hidden; 1100 Hinzugefügt clip: rect(0 0 0 0); 1101 Hinzugefügt white-space: nowrap; 1097 1102 } 1098 1103 1099 1104 // VALIDISCAN-SEEDED color-contrast: #929292 on white is 3.1:1. app/design/frontend/Validiscan/fixture/web/css/styles-m.css Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 6 hinzugefügt, 1 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 6 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung Code 1070 1070 } 1071 1071 1072 1072 .cms-index-index .page-title-wrapper { 1073 Entfernt display: none; 1073 Hinzugefügt position: absolute; 1074 Hinzugefügt width: 1px; 1075 Hinzugefügt height: 1px; 1076 Hinzugefügt overflow: hidden; 1077 Hinzugefügt clip: rect(0 0 0 0); 1078 Hinzugefügt white-space: nowrap; 1074 1079 } 1075 1080 1076 1081 .block-promo .info, moves the journal headings from h4 to h3 and validates Beispieldaten app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html Änderungen an app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html: 3 hinzugefügt, 3 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html: 3 hinzugefügt, 3 entfernt Zeile vorher Zeile nachher Änderung Code 152 152 <!-- VALIDISCAN-SEEDED vs-headings-landmarks (h2 followed by h4) + vs-link-purpose ("Read more" links to three different pages) --> 153 153 <div class="journal-items"> 154 154 <article class="journal-item"> 155 Entfernt <h4 class="journal-title">Layering for wet autumn days</h4> 155 Hinzugefügt <h3 class="journal-title">Layering for wet autumn days</h3> 156 156 <p>How a light shell over a warm mid-layer keeps you dry on the way to work.</p> 157 157 <a class="journal-link" href="/magento/juno-jacket.html">Read more</a> 158 158 </article> 159 159 <article class="journal-item"> 160 Entfernt <h4 class="journal-title">Caring for technical shells</h4> 160 Hinzugefügt <h3 class="journal-title">Caring for technical shells</h3> 161 161 <p>Washing, drying and re-proofing: three steps that keep a rain shell working for years.</p> 162 162 <a class="journal-link" href="/magento/nadia-elements-shell.html">Read more</a> 163 163 </article> 164 164 <article class="journal-item"> 165 Entfernt <h4 class="journal-title">Running through the dark season</h4> 165 Hinzugefügt <h3 class="journal-title">Running through the dark season</h3> 166 166 <p>Reflective details, lights and route planning for early morning runs.</p> 167 167 <a class="journal-link" href="/magento/ingrid-running-jacket.html">Read more</a> 168 168 </article>
Tastaturbedienung und Fokus
-
Ein sichtbarer Fokusrahmen focus-visible-styles Ein Fokusrahmen für die Tastaturbedienung in der Markenfarbe des Themes, angepasst auf einen Kontrast von mindestens 3:1 gegenüber dem Seitenhintergrund.
Das Stylesheet des Themes erhält einen Fokusrahmen für die Tastaturbedienung: 2 Pixel breit, durchgezogen und 2 Pixel vom Element entfernt, in der Markenfarbe des Themes. Die Farbe stammt aus einer Variablen für die Marken- oder Primärfarbe, sonst von der primären Schaltfläche, sonst von der Linkfarbe und wird angepasst, bis sie gegenüber dem Seitenhintergrund einen Kontrast von mindestens 3:1 hat. Flächen mit eigenem Hintergrund, etwa eine dunkle Kopfleiste, erhalten eine Farbe für den Fokusrahmen, die dort diesen Kontrast hat. Regeln des Themes, die den Fokusrahmen von Links, Schaltflächen und anderen Bedienelementen beim Fokussieren entfernen, werden herausgenommen, außer sie zeigen den Fokus auf andere Weise, etwa durch einen Rand oder einen Schatten.
- Abgedeckte Regeln
-
-
vs-focus-visibleAUTO
-
- Geänderte Dateitypen
-
.css.less
adds the outline, removes the outline: none rule and validates Beispieldaten app/design/frontend/Validiscan/fixture/web/css/source/_theme.less Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 10 hinzugefügt, 12 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 10 hinzugefügt, 12 entfernt Zeile vorher Zeile nachher Änderung Code 1079 1079 color: #fff; 1080 1080 } 1081 1081 1082 Entfernt // VALIDISCAN-SEEDED vs-focus-visible: the theme removes the focus ring from links and actions. 1083 Entfernt .navigation a:focus, 1084 Entfernt .header.links a:focus, 1085 Entfernt .product-item-link:focus, 1086 Entfernt .footer a:focus, 1087 Entfernt .action:focus, 1088 Entfernt .logo:focus, 1089 Entfernt .block-promo:focus, 1090 Entfernt .journal-link:focus { 1091 Entfernt outline: none; 1092 Entfernt } 1093 Entfernt 1094 1082 // VALIDISCAN-SEEDED vs-headings-landmarks: the home page title is display:none, so the page has no h1. 1095 1083 .cms-index-index .page-title-wrapper { 1096 1084 display: none; 1264 1252 height: 18px; 1265 1253 stroke-width: 3; 1266 1254 } 1255 Hinzugefügt 1256 Hinzugefügt /* validiscan:focus-visible-styles */ 1257 Hinzugefügt :focus-visible { 1258 Hinzugefügt outline: 2px solid #1979c3; 1259 Hinzugefügt outline-offset: 2px; 1260 Hinzugefügt } 1261 Hinzugefügt .panel.wrapper :focus-visible { 1262 Hinzugefügt outline-color: #a1d0f3; 1263 Hinzugefügt } 1264 Hinzugefügt /* /validiscan:focus-visible-styles */ app/design/frontend/Validiscan/fixture/web/css/styles-m.css Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 10 hinzugefügt, 11 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 10 hinzugefügt, 11 entfernt Zeile vorher Zeile nachher Änderung Code 1058 1058 color: #fff; 1059 1059 } 1060 1060 1061 Entfernt .navigation a:focus, 1062 Entfernt .header.links a:focus, 1063 Entfernt .product-item-link:focus, 1064 Entfernt .footer a:focus, 1065 Entfernt .action:focus, 1066 Entfernt .logo:focus, 1067 Entfernt .block-promo:focus, 1068 Entfernt .journal-link:focus { 1069 Entfernt outline: none; 1070 Entfernt } 1071 Entfernt 1072 1061 .cms-index-index .page-title-wrapper { 1073 1062 display: none; 1074 1063 } 1232 1221 height: 18px; 1233 1222 stroke-width: 3; 1234 1223 } 1224 Hinzugefügt 1225 Hinzugefügt /* validiscan:focus-visible-styles */ 1226 Hinzugefügt :focus-visible { 1227 Hinzugefügt outline: 2px solid #1979c3; 1228 Hinzugefügt outline-offset: 2px; 1229 Hinzugefügt } 1230 Hinzugefügt .panel.wrapper :focus-visible { 1231 Hinzugefügt outline-color: #a1d0f3; 1232 Hinzugefügt } 1233 Hinzugefügt /* /validiscan:focus-visible-styles */ -
Eine Tab-Reihenfolge, die der Seite folgt remove-positive-tabindex Trägt ein gemeldetes Element einen
tabindexgrößer als 0, wird jeder feste positivetabindexin den Templates des Themes entfernt oder auf 0 gesetzt.Ein
tabindexgrößer als 0 zieht ein Element an den Anfang der Tastaturreihenfolge. Solche Werte wirken nur relativ zueinander auf der ganzen Seite; sobald sich zeigt, dass ein gemeldetes Element in den Templates des Themes einen trägt, entfernt das Rezept jeden festen positiventabindexin den Templates des Themes, auch bei Elementen, die der Befund nicht aufgeführt hat. Links, Schaltflächen und Formularfelder verlieren das Attribut; andere Elemente erhaltentabindex="0", sodass sie erreichbar bleiben, während die Tab-Taste der Reihenfolge der Seite folgt. Eintabindex, den PHP-Code berechnet, bleibt einem Menschen überlassen. Die Prüfungvs-focus-ordervon Validiscan meldet auch einen Fokus, der aus anderen Gründen auf der Seite umherspringt, etwa weil Styles Inhalt an eine andere Stelle setzen; sie hat die Stufe MANUAL, sodass ihre Befunde mit einer Anleitung kommen, nicht mit dieser Änderung.- Abgedeckte Regeln
-
-
tabindexAUTO -
vs-focus-orderMANUAL
-
- Geänderte Dateitypen
-
.phtml
removes tabindex 1-4 from the login form and the CAPTCHA and validates Beispieldaten app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/captcha-math.phtml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/captcha-math.phtml: 1 hinzugefügt, 1 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/captcha-math.phtml: 1 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung Code 14 14 <div class="field captcha required" role="group" aria-labelledby="captcha-question" data-captcha-type="math"> 15 15 <label for="captcha_user_login" class="label" id="captcha-question"><span><?= $escaper->escapeHtml(__('Security question: what is %1 + %2?', $a, $b)) ?></span></label> 16 16 <div class="control captcha"> 17 Entfernt <input name="captcha[user_login]" type="text" class="input-text required-entry" id="captcha_user_login" autocomplete="off" inputmode="numeric" tabindex="3" data-captcha-answer-hash="<?= $escaper->escapeHtmlAttr(md5((string) ($a + $b))) ?>"> 17 Hinzugefügt <input name="captcha[user_login]" type="text" class="input-text required-entry" id="captcha_user_login" autocomplete="off" inputmode="numeric" data-captcha-answer-hash="<?= $escaper->escapeHtmlAttr(md5((string) ($a + $b))) ?>"> 18 18 </div> 19 19 </div> app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/login.phtml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/login.phtml: 3 hinzugefügt, 3 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/login.phtml: 3 hinzugefügt, 3 entfernt Zeile vorher Zeile nachher Änderung Code 27 27 <div class="field email required"> 28 28 <label class="label" for="email"><span><?= $escaper->escapeHtml(__('Email')) ?></span></label> 29 29 <div class="control"> 30 Entfernt <input name="login[username]" value="<?= $escaper->escapeHtmlAttr($username) ?>" autocomplete="off" id="email" type="email" class="input-text mage-error" title="<?= $escaper->escapeHtmlAttr(__('Email')) ?>" aria-invalid="true" tabindex="1" onpaste="return false;" data-mage-init='{"mage/trim-input":{}}'> 30 Hinzugefügt <input name="login[username]" value="<?= $escaper->escapeHtmlAttr($username) ?>" autocomplete="off" id="email" type="email" class="input-text mage-error" title="<?= $escaper->escapeHtmlAttr(__('Email')) ?>" aria-invalid="true" onpaste="return false;" data-mage-init='{"mage/trim-input":{}}'> 31 31 <div for="email" generated="true" class="mage-error" id="email-error"><?= $escaper->escapeHtml(__('Please enter a valid email address (Ex: johndoe@domain.com).')) ?></div> 32 32 </div> 33 33 </div> 35 35 <div class="field password required"> 36 36 <label for="pass" class="label"><span><?= $escaper->escapeHtml(__('Password')) ?></span></label> 37 37 <div class="control"> 38 Entfernt <input name="login[password]" type="password" autocomplete="off" class="input-text" id="pass" title="<?= $escaper->escapeHtmlAttr(__('Password')) ?>" tabindex="2" onpaste="return false;" oncopy="return false;"> 38 Hinzugefügt <input name="login[password]" type="password" autocomplete="off" class="input-text" id="pass" title="<?= $escaper->escapeHtmlAttr(__('Password')) ?>" onpaste="return false;" oncopy="return false;"> 39 39 </div> 40 40 </div> 41 41 <!-- VALIDISCAN-SEEDED vs-accessible-auth: arithmetic CAPTCHA with no alternative --> 42 42 <?= $block->getChildHtml('form_additional_info') /* math CAPTCHA module: div.field.captcha, input#captcha_user_login tabindex="3" */ ?> 43 43 <div class="actions-toolbar"> 44 Entfernt <div class="primary"><button type="submit" class="action login primary" name="send" id="send2" tabindex="4"><span><?= $escaper->escapeHtml(__('Sign In')) ?></span></button></div> 44 Hinzugefügt <div class="primary"><button type="submit" class="action login primary" name="send" id="send2"><span><?= $escaper->escapeHtml(__('Sign In')) ?></span></button></div> 45 45 <div class="secondary"><a class="action remind" href="<?= $escaper->escapeUrl($block->getUrl('contact')) ?>"><span><?= $escaper->escapeHtml(__('Forgot Your Password? Contact us')) ?></span></a></div> 46 46 </div> 47 47 </fieldset>
Zoom und Touch-Ziele
-
Zoomen auf dem Smartphone erlaubt meta-viewport-zoom
user-scalable=nound jedesmaximum-scaleunter 2 verschwinden aus dem Viewport-Tag des Themes, sodass Besucherinnen und Besucher die Seite auf dem Smartphone zoomen können; ein Wert, den PHP-Code berechnet, wird für Ihr Entwicklungsteam aufgeführt.Das Rezept entfernt
user-scalable=nound jedesmaximum-scaleunter 2 aus dem Viewport-Tag im Layout-XML des Themes, etwa in derdefault_head_blocks.xml, wo Luma es deklariert, oder in seinen Templates, sodass Besucherinnen und Besucher die Seite auf dem Smartphone zoomen können. Bei der Regel zur guten Praxismeta-viewport-largeliegt die Grenze bei 5. Die übrigen Viewport-Einstellungen bleiben, wie sie waren. Ein Viewport-Wert, den PHP-Code berechnet, wird für Ihr Entwicklungsteam zur Prüfung aufgeführt. Stammt das Tag, das den Zoom sperrt, nicht aus dem Theme, etwa aus den HTML-Head-Einstellungen im Magento-Adminbereich oder aus einem Modul, ändert das Rezept nichts.- Abgedeckte Regeln
-
-
meta-viewportAUTO -
meta-viewport-largeAUTO
-
- Geänderte Dateitypen
-
.xml
removes the zoom block from default_head_blocks.xml and validates Beispieldaten app/design/frontend/Validiscan/fixture/Magento_Theme/layout/default_head_blocks.xml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Theme/layout/default_head_blocks.xml: 1 hinzugefügt, 1 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/Magento_Theme/layout/default_head_blocks.xml: 1 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung Code 3 3 <head> 4 4 <!-- VALIDISCAN-SEEDED meta-viewport: pinch zoom disabled (Luma 2.0-2.3 default kept by the theme). 5 5 Fixed variant: content="width=device-width, initial-scale=1". --> 6 Entfernt <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no"/> 6 Hinzugefügt <meta name="viewport" content="width=device-width, initial-scale=1"/> 7 7 <meta name="format-detection" content="telephone=no"/> 8 8 <css src="css/styles-m.css"/> 9 9 <css src="css/styles-l.css" media="screen and (min-width: 768px)"/> -
Größere Touch-Ziele target-size-padding Schaltflächen und Links, die der Scan als zu klein gefunden hat, erhalten eine Mindestgröße von 24 × 24 Pixel, über Klassen, die das Stylesheet des Themes ansprechen kann.
Schaltflächen und Links, die der Scan als zu klein gefunden hat, etwa Social-Media-Icons oder Mengenschaltflächen, erhalten in einem Block am Ende des Stylesheets des Themes eine Mindestgröße von 24 × 24 Pixel. Der Block verwendet die Selektoren wieder, mit denen das Theme sie klein gemacht hat, oder ihre eigenen Klassen, und setzt eine Mindestbreite und -höhe, die sich gegen eine kleinere Breite oder Höhe durchsetzt. Die Icons darin und das Layout darum herum bleiben, wie sie sind. Ein Link oder ein anderes Inline-Element ohne
display-Regel wird zuinline-flex, weil Inline-Elemente eine Mindestgröße ignorieren. Ein Bedienelement ohne eine Klasse, die das Stylesheet ansprechen kann, bleibt einem Menschen überlassen.- Abgedeckte Regeln
-
-
vs-target-sizeAUTO
-
- Geänderte Dateitypen
-
.css.less
sizes the three flagged controls and validates Beispieldaten app/design/frontend/Validiscan/fixture/web/css/source/_theme.less Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 9 hinzugefügt, 0 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 9 hinzugefügt, 0 entfernt Zeile vorher Zeile nachher Änderung Code 1264 1264 height: 18px; 1265 1265 stroke-width: 3; 1266 1266 } 1267 Hinzugefügt 1268 Hinzugefügt /* validiscan:target-size-padding */ 1269 Hinzugefügt .social-link, 1270 Hinzugefügt .actions-secondary .action, 1271 Hinzugefügt .qty-step { 1272 Hinzugefügt min-width: 24px; 1273 Hinzugefügt min-height: 24px; 1274 Hinzugefügt } 1275 Hinzugefügt /* /validiscan:target-size-padding */ app/design/frontend/Validiscan/fixture/web/css/styles-m.css Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 9 hinzugefügt, 0 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 9 hinzugefügt, 0 entfernt Zeile vorher Zeile nachher Änderung Code 1232 1232 height: 18px; 1233 1233 stroke-width: 3; 1234 1234 } 1235 Hinzugefügt 1236 Hinzugefügt /* validiscan:target-size-padding */ 1237 Hinzugefügt .social-link, 1238 Hinzugefügt .actions-secondary .action, 1239 Hinzugefügt .qty-step { 1240 Hinzugefügt min-width: 24px; 1241 Hinzugefügt min-height: 24px; 1242 Hinzugefügt } 1243 Hinzugefügt /* /validiscan:target-size-padding */
Bewegung, Slideshows und Ton
-
Weniger Bewegung auf Wunsch der Besucherinnen und Besucher reduced-motion-guard Ist das Gerät auf reduzierte Bewegung eingestellt, werden die Animationen, die Übergänge von 5 Sekunden oder mehr und das sanfte Scrollen ausgeschaltet, die die Stylesheets des Themes starten.
Ist das Gerät von Besucherinnen und Besuchern auf reduzierte Bewegung eingestellt, schaltet ein Block am Ende jedes Stylesheets des Themes die Animationen, die Übergänge von 5 Sekunden oder mehr und das sanfte Scrollen aus, die dieses Stylesheet startet, Selektor für Selektor. Starten die eigenen Skripte des Themes in
web/jseinen Slider mit eingeschaltetem automatischem Abspielen, startet der Slider für diese Besucherinnen und Besucher ohne automatisches Abspielen. Eine Regel, die in einer anderen LESS-Regel verschachtelt ist, wird für Ihr Entwicklungsteam aufgeführt. Animationen aus dem eigenen Code von Magento oder aus Extensions stehen nicht in den Dateien des Themes und brauchen ihre eigene Absicherung.- Abgedeckte Regeln
-
-
vs-motionAUTO
-
- Geänderte Dateitypen
-
.css.less
guards the badge and slider animations and validates Beispieldaten app/design/frontend/Validiscan/fixture/web/css/source/_theme.less Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 9 hinzugefügt, 0 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 9 hinzugefügt, 0 entfernt Zeile vorher Zeile nachher Änderung Code 1264 1264 height: 18px; 1265 1265 stroke-width: 3; 1266 1266 } 1267 Hinzugefügt 1268 Hinzugefügt /* validiscan:reduced-motion-guard */ 1269 Hinzugefügt @media (prefers-reduced-motion: reduce) { 1270 Hinzugefügt .product-label, 1271 Hinzugefügt .slick-track { 1272 Hinzugefügt animation: none; 1273 Hinzugefügt } 1274 Hinzugefügt } 1275 Hinzugefügt /* /validiscan:reduced-motion-guard */ app/design/frontend/Validiscan/fixture/web/css/styles-m.css Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 9 hinzugefügt, 0 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 9 hinzugefügt, 0 entfernt Zeile vorher Zeile nachher Änderung Code 1232 1232 height: 18px; 1233 1233 stroke-width: 3; 1234 1234 } 1235 Hinzugefügt 1236 Hinzugefügt /* validiscan:reduced-motion-guard */ 1237 Hinzugefügt @media (prefers-reduced-motion: reduce) { 1238 Hinzugefügt .product-label, 1239 Hinzugefügt .slick-track { 1240 Hinzugefügt animation: none; 1241 Hinzugefügt } 1242 Hinzugefügt } 1243 Hinzugefügt /* /validiscan:reduced-motion-guard */ -
Slideshows, die sich nur auf Wunsch der Besucherinnen und Besucher bewegen slider-pause-control Auf Magento keine Pause-Schaltfläche: Bei den Page-Builder-Slidern in den Dateien des Themes wird das automatische Abspielen ausgeschaltet, sodass sie nur wechseln, wenn Besucherinnen und Besucher die Punkte oder Pfeile benutzen.
Auf Magento fügt dieses Rezept keine Pause-Schaltfläche hinzu. Der Page-Builder-Slider läuft mit den eigenen Skripten von Magento, und ein Theme kann ihm keine Pause-Schaltfläche geben, ohne den Code von Magento zu überschreiben. Das Rezept nutzt stattdessen die eigene Einstellung des Sliders: Bei jedem Page-Builder-Slider mit automatischem Abspielen in den Dateien des Themes wird das automatische Abspielen ausgeschaltet, wie es der Schalter „Autoplay“ im Page Builder tut, und Pfeile werden eingeschaltet, wo der Slider sonst keine Möglichkeit hätte, zwischen Slides zu wechseln. Endlose CSS-Animationen, die einen Slider von selbst bewegen, werden entfernt. Die Slides wechseln dann nur, wenn Besucherinnen und Besucher die Punkte oder Pfeile benutzen: Nichts bewegt sich von selbst, also gibt es nichts anzuhalten. Ein Slider, der in der Magento-Datenbank gespeichert ist, ist keine Datei des Themes: Sein automatisches Abspielen schalten Sie mit der Einstellung „Autoplay“ im Page Builder aus. Ein Slider, den die eigenen Skripte des Themes mit automatischem Abspielen starten, etwa ein Slick- oder Swiper-Slider, braucht eine Pause-Schaltfläche, die in dieses Skript eingebaut wird; das bleibt einem Menschen überlassen.
- Abgedeckte Regeln
-
-
vs-carouselAUTO
-
- Geänderte Dateitypen
-
.css.html.less
turns off the Page Builder autoplay and the track animation, and validates Beispieldaten app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html Änderungen an app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html: 1 hinzugefügt, 1 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html: 1 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung Code 3 3 class="pagebuilder-slider slick-slider" 4 4 data-content-type="slider" 5 5 data-appearance="default" 6 Entfernt data-autoplay="true" 6 Hinzugefügt data-autoplay="false" 7 7 data-autoplay-speed="3000" 8 8 data-fade="false" 9 9 data-infinite-loop="true" app/design/frontend/Validiscan/fixture/web/css/source/_theme.less Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 0 hinzugefügt, 1 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 0 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung Code 1176 1176 .slick-track { 1177 1177 display: flex; 1178 1178 width: 300%; 1179 Entfernt animation: nw-slider-autoplay 9s ease-in-out infinite; 1180 1179 } 1181 1180 .slick-slide { 1182 1181 flex: 0 0 33.3333%; app/design/frontend/Validiscan/fixture/web/css/styles-m.css Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 0 hinzugefügt, 1 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 0 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung Code 1147 1147 .slick-track { 1148 1148 display: flex; 1149 1149 width: 300%; 1150 Entfernt animation: nw-slider-autoplay 9s ease-in-out infinite; 1151 1150 } 1152 1151 .slick-slide { 1153 1152 flex: 0 0 33.3333%; -
Kein blinkender oder laufender Text remove-blink-marquee
<blink>- und<marquee>-Elemente in den Templates des Themes werden zu statischen Elementen, undtext-decoration: blinkverschwindet aus den Stylesheets des Themes, sodass sich kein Text von selbst bewegt oder blinkt.<blink>- und<marquee>-Elemente in den Templates des Themes werden zu statischen Elementen mit demselben Inhalt, denselben Klassen und denselben IDs: ein<span>für blink, ein<div>für marquee. Die eigenen Attribute des marquee, etwa seine Scroll-Geschwindigkeit und -Richtung, werden entfernt, ebenso der Styletext-decoration: blinkin den Stylesheets des Themes, sodass sich kein Text von selbst bewegt oder blinkt.- Abgedeckte Regeln
-
-
blinkAUTO -
marqueeAUTO
-
- Geänderte Dateitypen
-
.html.phtml
makes an added ticker static and validates Beispieldaten app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html Änderungen an app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html: 2 hinzugefügt, 2 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html: 2 hinzugefügt, 2 entfernt Zeile vorher Zeile nachher Änderung Code 1 Entfernt <marquee class="news-ticker" behavior="scroll" direction="left" scrollamount="4"> 1 Hinzugefügt <div class="news-ticker"> 2 2 <p>Autumn sale: 20% off all jackets</p> 3 Entfernt </marquee> 3 Hinzugefügt </div> 4 4 <!-- VALIDISCAN-SEEDED vs-carousel + vs-motion + aria-hidden-focus: Page Builder slider autoplays (data-autoplay and a CSS animation) with no pause control; hidden slides keep focusable links; dots have no names --> 5 5 <div 6 6 class="pagebuilder-slider slick-slider" app/design/frontend/Validiscan/fixture/Magento_Theme/templates/html/top-promo.phtml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Theme/templates/html/top-promo.phtml: 1 hinzugefügt, 1 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/Magento_Theme/templates/html/top-promo.phtml: 1 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung Code 5 5 // Fixed variant: moved into the header (header.container) and styled with line-height 1.5, no fixed height. 6 6 ?> 7 7 <!-- VALIDISCAN-SEEDED region + vs-text-spacing: the promo text sits outside every landmark in a fixed 26px-high box --> 8 Entfernt <div class="top-promo"><p class="top-promo-text"><blink><?= $block->escapeHtml(__('Free shipping on orders over €75')) ?></blink><br><?= $block->escapeHtml(__('Free 30-day returns on every jacket')) ?></p></div> 8 Hinzugefügt <div class="top-promo"><p class="top-promo-text"><span><?= $block->escapeHtml(__('Free shipping on orders over €75')) ?></span><br><?= $block->escapeHtml(__('Free 30-day returns on every jacket')) ?></p></div> -
Kein Ton, der von selbst startet mute-autoplay Ein Video in den Templates des Themes, das von selbst abspielt, wird stummgeschaltet, und Audio startet nicht mehr von selbst, außer PHP-Code schaltet das automatische Abspielen ein; auf Magento wird das Rezept für Befunde von
vs-medianicht verwendet.Ein Video in den Templates des Themes, das von selbst abspielt, erhält
mutedundplaysinline, sodass es stumm und auf dem Smartphone innerhalb der Seite weiterläuft. Audio startet nicht mehr von selbst. Eingebettete YouTube- und Vimeo-Player, die von selbst starten, werden so eingestellt, dass sie stumm starten. Automatisches Abspielen, das PHP-Code einschaltet, bleibt einem Menschen überlassen. In einem Scan meldet die Medienprüfungvs-mediavon Validiscan Ton, der von selbst startet; sie tritt an die Stelle der axe-core-Regel, die dieses Rezept abdeckt.vs-media, die auch Untertitel und Transkripte abdeckt, hat die Stufe MANUAL, sodass ein solcher Befund auf Magento mit einer Anleitung kommt statt mit dieser Änderung.- Abgedeckte Regeln
-
-
no-autoplay-audioAUTO geprüft durch vs-media
-
- Geänderte Dateitypen
-
.phtml
mutes the autoplaying product video and validates Beispieldaten app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/view/details.phtml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/view/details.phtml: 1 hinzugefügt, 1 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/view/details.phtml: 1 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung Code 44 44 <h3 class="data item title"><?= $escaper->escapeHtml(__('Product video')) ?></h3> 45 45 <!-- VALIDISCAN-SEEDED vs-media: product video without a captions track --> 46 46 <?php /* Fixed variant: <track kind="captions" src="...juno-jacket-care.en.vtt" srclang="en" label="English" default>. */ ?> 47 Entfernt <video class="product-video-player" autoplay loop controls preload="none" width="560" height="315" poster="<?= $escaper->escapeUrl($product->getData('care_video_poster')) ?>"> 47 Hinzugefügt <video class="product-video-player" autoplay loop controls preload="none" width="560" height="315" poster="<?= $escaper->escapeUrl($product->getData('care_video_poster')) ?>" muted playsinline> 48 48 <source src="<?= $escaper->escapeUrl($videoUrl) ?>" type="video/mp4"> 49 49 </video> 50 50 <p><?= $escaper->escapeHtml($product->getData('care_video_caption')) ?></p>
Formulare, Warenkorb und eingebettete Inhalte
-
Beschriftungen, die mit ihren Feldern verbunden sind label-association Ein Beschriftungstext, der schon vor einem Feld auf der Seite steht, wird mit ihm verbunden, als
<label>oder überaria-labelledby.Ein Formularfeld, dessen Beschriftung schon auf der Seite steht, vor dem Feld, wird mit diesem Text verbunden. Ein
<label>ohneforerhält einfor, das auf das Feld zeigt. Ein Beschriftungstext in einem<span>oder<strong>, etwa ein Text „Sort By“ mit der Klassesorter-labelvon Luma neben dem Sortiermenü einer Kategorieseite, wird zu einem<label>mit denselben Klassen. Ein Beschriftungstext in einem Blockelement, etwa<div class="label">, behält sein Tag und wird überaria-labelledbyverbunden. Der Text muss in einem Container ohne ein weiteres Feld stehen, damit er nicht zu einem anderen gehören kann. Screenreader lesen die Beschriftung dann vor, wenn das Feld den Fokus erhält. Ein Feld, das nur einen Platzhalter hat, bleibt einem Menschen überlassen, weil eine Beschriftung zu schreiben eine Inhaltsentscheidung ist.- Abgedeckte Regeln
-
-
labelAUTO geprüft durch vs-forms-ecommerce -
select-nameASSISTED -
vs-forms-ecommerceAUTO
-
- Geänderte Dateitypen
-
.phtml
turns the "Sort By" text into the sorter label and validates Beispieldaten app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/list/toolbar.phtml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/list/toolbar.phtml: 1 hinzugefügt, 1 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/list/toolbar.phtml: 1 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung Code 12 12 <div class="toolbar-sorter sorter"> 13 13 <!-- VALIDISCAN-SEEDED select-name + vs-forms-ecommerce: the "Sort By" text is a span, not a label for the select --> 14 14 <?php /* Fixed variant: <label class="sorter-label" for="sorter">Sort By</label>. */ ?> 15 Entfernt <span class="sorter-label"><?= $escaper->escapeHtml(__('Sort By')) ?></span> 15 Hinzugefügt <label class="sorter-label" for="sorter"><?= $escaper->escapeHtml(__('Sort By')) ?></label> 16 16 <select id="sorter" data-role="sorter" class="sorter-options"> 17 17 <?php foreach ($block->getAvailableOrders() as $key => $order): ?> 18 18 <option value="<?= $escaper->escapeHtmlAttr($key) ?>"<?= $block->isOrderCurrent($key) ? ' selected' : '' ?>><?= $escaper->escapeHtml(__($order)) ?></option> -
Konto-, Adress- und Kontaktfelder, die Browser ausfüllen können autocomplete-tokens Felder in den Templates des Themes, die nach den eigenen Daten der Kundinnen und Kunden fragen, in Adress-, Konto-, Anmelde-, Kontakt- und Newsletter-Formularen, erhalten den
autocomplete-Wert für das, wonach sie fragen, außer der Code eines Templates schreibt ihn.Felder in den Templates des Themes, die nach den eigenen Daten der Kundinnen und Kunden fragen, in Adress-, Konto-, Anmelde-, Kontakt- und Newsletter-Formularen, erhalten den
autocomplete-Wert für das, wonach sie fragen, etwa E-Mail-Adresse, Name, Telefonnummer, Straßenadresse, Postleitzahl oder Passwort. Der Wert wird aus Typ, Name, ID, Beschriftung, Platzhalter und Titel des Felds abgeleitet, nach denselben Regeln wie die Formularprüfung von Validiscan, und Felder für die Rechnungs- und die Versandadresse erhalten ihren Abschnitt, wie inshipping given-name. Sobald ein Feld eines Formulars gemeldet wird, wird jedes Feld dieses Formulars bearbeitet. Passwörter erhaltennew-passwordin Formularen zur Registrierung und zum Zurücksetzen des Passworts und in Formularen mit mehr als einem Passwortfeld und sonstcurrent-password. Felder für Gutschein, Suche, Geschenkempfänger, Kommentar, Menge und CAPTCHA erhalten nie einen Wert. Ein Wert, den der Code eines Templates schreibt, oder ein gültiger Wert, der für das Feld falsch aussieht, bleibt einem Menschen überlassen.- Abgedeckte Regeln
-
-
autocomplete-validAUTO geprüft durch vs-forms-ecommerce -
vs-forms-ecommerceAUTO
-
- Geänderte Dateitypen
-
.phtml
adds tokens to the newsletter, login and contact forms and validates Beispieldaten app/design/frontend/Validiscan/fixture/Magento_Contact/templates/form.phtml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Contact/templates/form.phtml: 3 hinzugefügt, 3 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/Magento_Contact/templates/form.phtml: 3 hinzugefügt, 3 entfernt Zeile vorher Zeile nachher Änderung Code 21 21 <!-- VALIDISCAN-SEEDED vs-forms-ecommerce: name, email and phone lack autocomplete; required only via the CSS asterisk --> 22 22 <div class="field name required"> 23 23 <label class="label" for="name"><span><?= $escaper->escapeHtml(__('Name')) ?></span></label> 24 Entfernt <div class="control"><input name="name" id="name" title="<?= $escaper->escapeHtmlAttr(__('Name')) ?>" value="<?= $escaper->escapeHtmlAttr($viewModel->getUserName()) ?>" class="input-text" type="text"></div> 24 Hinzugefügt <div class="control"><input name="name" id="name" title="<?= $escaper->escapeHtmlAttr(__('Name')) ?>" value="<?= $escaper->escapeHtmlAttr($viewModel->getUserName()) ?>" class="input-text" type="text" autocomplete="name"></div> 25 25 </div> 26 26 <div class="field email required"> 27 27 <label class="label" for="email"><span><?= $escaper->escapeHtml(__('Email')) ?></span></label> 28 Entfernt <div class="control"><input name="email" id="email" title="<?= $escaper->escapeHtmlAttr(__('Email')) ?>" value="<?= $escaper->escapeHtmlAttr($viewModel->getUserEmail()) ?>" class="input-text" type="email"></div> 28 Hinzugefügt <div class="control"><input name="email" id="email" title="<?= $escaper->escapeHtmlAttr(__('Email')) ?>" value="<?= $escaper->escapeHtmlAttr($viewModel->getUserEmail()) ?>" class="input-text" type="email" autocomplete="email"></div> 29 29 </div> 30 30 <div class="field telephone"> 31 31 <label class="label" for="telephone"><span><?= $escaper->escapeHtml(__('Phone Number')) ?></span></label> 32 Entfernt <div class="control"><input name="telephone" id="telephone" title="<?= $escaper->escapeHtmlAttr(__('Phone Number')) ?>" value="<?= $escaper->escapeHtmlAttr($viewModel->getUserTelephone()) ?>" class="input-text" type="tel"></div> 32 Hinzugefügt <div class="control"><input name="telephone" id="telephone" title="<?= $escaper->escapeHtmlAttr(__('Phone Number')) ?>" value="<?= $escaper->escapeHtmlAttr($viewModel->getUserTelephone()) ?>" class="input-text" type="tel" autocomplete="tel"></div> 33 33 </div> 34 34 <div class="field comment required"> 35 35 <label class="label" for="comment"><span><?= $escaper->escapeHtml(__('What’s on your mind?')) ?></span></label> app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/login.phtml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/login.phtml: 2 hinzugefügt, 2 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/Magento_Customer/templates/form/login.phtml: 2 hinzugefügt, 2 entfernt Zeile vorher Zeile nachher Änderung Code 27 27 <div class="field email required"> 28 28 <label class="label" for="email"><span><?= $escaper->escapeHtml(__('Email')) ?></span></label> 29 29 <div class="control"> 30 Entfernt <input name="login[username]" value="<?= $escaper->escapeHtmlAttr($username) ?>" autocomplete="off" id="email" type="email" class="input-text mage-error" title="<?= $escaper->escapeHtmlAttr(__('Email')) ?>" aria-invalid="true" tabindex="1" onpaste="return false;" data-mage-init='{"mage/trim-input":{}}'> 30 Hinzugefügt <input name="login[username]" value="<?= $escaper->escapeHtmlAttr($username) ?>" autocomplete="email" id="email" type="email" class="input-text mage-error" title="<?= $escaper->escapeHtmlAttr(__('Email')) ?>" aria-invalid="true" tabindex="1" onpaste="return false;" data-mage-init='{"mage/trim-input":{}}'> 31 31 <div for="email" generated="true" class="mage-error" id="email-error"><?= $escaper->escapeHtml(__('Please enter a valid email address (Ex: johndoe@domain.com).')) ?></div> 32 32 </div> 33 33 </div> 35 35 <div class="field password required"> 36 36 <label for="pass" class="label"><span><?= $escaper->escapeHtml(__('Password')) ?></span></label> 37 37 <div class="control"> 38 Entfernt <input name="login[password]" type="password" autocomplete="off" class="input-text" id="pass" title="<?= $escaper->escapeHtmlAttr(__('Password')) ?>" tabindex="2" onpaste="return false;" oncopy="return false;"> 38 Hinzugefügt <input name="login[password]" type="password" autocomplete="current-password" class="input-text" id="pass" title="<?= $escaper->escapeHtmlAttr(__('Password')) ?>" tabindex="2" onpaste="return false;" oncopy="return false;"> 39 39 </div> 40 40 </div> 41 41 <!-- VALIDISCAN-SEEDED vs-accessible-auth: arithmetic CAPTCHA with no alternative --> app/design/frontend/Validiscan/fixture/Magento_Newsletter/templates/subscribe.phtml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Newsletter/templates/subscribe.phtml: 1 hinzugefügt, 1 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/Magento_Newsletter/templates/subscribe.phtml: 1 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung Code 18 18 <!-- VALIDISCAN-SEEDED vs-forms-ecommerce (label): newsletter email only has a placeholder, no label and no autocomplete --> 19 19 <div class="field newsletter"> 20 20 <div class="control"> 21 Entfernt <input name="email" type="email" id="newsletter" placeholder="<?= $escaper->escapeHtmlAttr(__('Enter your email address')) ?>" data-mage-init='{"mage/trim-input":{}}' data-validate="{required:true, 'validate-email':true}"> 21 Hinzugefügt <input name="email" type="email" id="newsletter" placeholder="<?= $escaper->escapeHtmlAttr(__('Enter your email address')) ?>" data-mage-init='{"mage/trim-input":{}}' data-validate="{required:true, 'validate-email':true}" autocomplete="email"> 22 22 </div> 23 23 </div> 24 24 <div class="actions"> -
Änderungen bei Preis, Bestand und Warenkorb werden angesagt live-region-cart-variant Die Container in den Templates des Themes, die die Skripte von Magento neu schreiben, etwa die Preisbox und der Zähler des Mini-Warenkorbs, werden zu Live-Regionen; die Skripte selbst werden nicht geändert.
Die eigenen Skripte von Magento schreiben den Text in festen Containern neu, wenn Kundinnen und Kunden eine Größe oder Farbe wählen oder ein Produkt in den Warenkorb legen. Das Rezept macht diese Container in den Templates des Themes zu Live-Regionen, sodass Screenreader den neuen Wert vorlesen, ohne dass die Kundinnen und Kunden dorthin wechseln müssen. Die Preisbox und der Zähler des Mini-Warenkorbs werden bei einer Änderung vollständig vorgelesen; die Bestandsmeldung und die Seitenmeldungen, etwa der Hinweis, dass ein Produkt in den Warenkorb gelegt wurde, erhalten
role="status". Die Skripte selbst werden nicht geändert. Markiert das Theme die ganze Seite als Live-Region, was Screenreader jede Änderung vorlesen lässt, wird das entfernt. Fügt das Skript einer Extension sie hinzu, während die Seite läuft, bleibt das einem Menschen überlassen.- Abgedeckte Regeln
-
-
vs-live-updatesAUTO
-
- Geänderte Dateitypen
-
.phtml
makes the price box and the stock message live regions and validates Beispieldaten app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/price/final_price.phtml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/price/final_price.phtml: 1 hinzugefügt, 1 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/price/final_price.phtml: 1 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung Code 13 13 // Fixed variant: the product-page box carries aria-live="polite" aria-atomic="true" and the stock 14 14 // message (product/view/type/default.phtml) is role="status". 15 15 ?> 16 Entfernt <div class="price-box price-final_price" data-role="priceBox" data-product-id="<?= (int) $product->getId() ?>" data-price-box="product-id-<?= (int) $product->getId() ?>"<?php if ($isProductPage): ?> data-base-price="<?= (float) $amount ?>"<?php endif; ?>> 16 Hinzugefügt <div class="price-box price-final_price" data-role="priceBox" data-product-id="<?= (int) $product->getId() ?>" data-price-box="product-id-<?= (int) $product->getId() ?>"<?php if ($isProductPage): ?> data-base-price="<?= (float) $amount ?>"<?php endif; ?> aria-live="polite" aria-atomic="true"> 17 17 <span class="normal-price"><span class="price-container price-final_price tax weee"><span id="product-price-<?= (int) $product->getId() ?>" data-price-amount="<?= (float) $amount ?>" data-price-type="finalPrice" class="price-wrapper"><span class="price"><?= $escaper->escapeHtml($block->renderAmount($block->getPriceType('final_price')->getAmount(), ['display_label' => false])) ?></span></span></span></span> 18 18 </div> app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/view/type/default.phtml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/view/type/default.phtml: 1 hinzugefügt, 1 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/Magento_Catalog/templates/product/view/type/default.phtml: 1 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung Code 11 11 ?> 12 12 <div class="product-info-stock-sku"> 13 13 <?php if ($block->displayProductStockStatus()): ?> 14 Entfernt <div class="stock available" title="<?= $escaper->escapeHtmlAttr(__('Availability')) ?>"><span><?= $escaper->escapeHtml(__('In stock')) ?></span></div> 14 Hinzugefügt <div class="stock available" title="<?= $escaper->escapeHtmlAttr(__('Availability')) ?>" role="status"><span><?= $escaper->escapeHtml(__('In stock')) ?></span></div> 15 15 <?php endif; ?> 16 16 <div class="product attribute sku"><strong class="type"><?= $escaper->escapeHtml(__('SKU')) ?></strong> <div class="value" itemprop="sku"><?= $escaper->escapeHtml($product->getSku()) ?></div></div> 17 17 </div> -
Titel für eingebettete Karten und Videos iframe-title Ein eingebetteter Frame ohne Titel erhält einen übersetzbaren Titel, der sagt, was er zeigt, sofern der Code es verrät.
Ein eingebetteter Frame ohne Titel, etwa eine Karte, ein YouTube- oder Vimeo-Video, ein Kalender, ein Formular oder ein Bewertungs-Widget, erhält einen übersetzbaren Titel, der sagt, was er zeigt. Das Rezept liest aus der Adresse des Frames, einschließlich der festen Teile einer Adresse, die PHP-Code zusammensetzt, sowie aus seinen Klassen, seiner ID und seinem Namen, was der Frame zeigt. Ein Frame, dessen Inhalt der Code nicht verrät, erhält vom Rezept keinen Titel und bleibt einem Menschen überlassen.
- Abgedeckte Regeln
-
-
frame-titleAUTO
-
- Geänderte Dateitypen
-
.phtml
titles the store map on the contact page and validates Beispieldaten app/design/frontend/Validiscan/fixture/Magento_Contact/templates/form.phtml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Contact/templates/form.phtml: 1 hinzugefügt, 1 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/Magento_Contact/templates/form.phtml: 1 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung Code 48 48 <p>Nordwind Outfitters (fixture)<br>Musterstraße 12<br>10115 Berlin, Germany</p> 49 49 <p><?= $escaper->escapeHtml(__('Monday to Saturday, 10:00 to 19:00')) ?></p> 50 50 <!-- VALIDISCAN-SEEDED frame-title: the store map iframe has no title --> 51 Entfernt <iframe src="<?= $escaper->escapeUrl($block->getBaseUrl() . 'media/wysiwyg/store-map.html') ?>" width="480" height="260" loading="lazy"></iframe> 51 Hinzugefügt <iframe src="<?= $escaper->escapeUrl($block->getBaseUrl() . 'media/wysiwyg/store-map.html') ?>" width="480" height="260" loading="lazy" title="<?= $escaper->escapeHtmlAttr(__('Store location map')) ?>"></iframe> 52 52 </div> 53 53 </div>
Kontrast, Bilder und Bedienelemente, die eine Einschätzung verlangen
Textkontrast, Textalternativen für Bilder und Namen für unbenannte Bedienelemente verlangen meist eine Einschätzung: welche Farbe zu Ihrer Marke passt, welche Worte ein Bild beschreiben. Die Regeln, die sie melden, haben die Stufe ASSISTED, wie die Listen unten zeigen. Für einen Befund einer ASSISTED-Regel entwirft KI nur dann eine Änderung, wenn Sie KI-Entwürfen zugestimmt haben, und Validiscan prüft jede Änderung, bevor sie ausgeliefert wird.
Die vier Rezepte unten sind für keine Regel die Standardkorrektur. Jedes erfasst nur die engen Fälle, in denen allein der Code des Themes belegt, wie die Änderung aussehen muss. In einem Projekt wird button-semantics auf Befunde der Slideshow-Prüfung vs-carousel angewendet, die AUTO ist: Die Korrektur-Engine probiert es aus, wenn das Rezept für Slider oben einen solchen Befund nicht behebt. Auf Magento decken die anderen drei nur Regeln der Stufe ASSISTED ab: Ein Befund dieser Regeln geht den Weg ASSISTED, und diese drei Rezepte werden darauf nicht angewendet.
-
Textfarben mit ausreichendem Kontrast contrast-tokens Eine Textfarbe, die die Kontrastprüfung nicht besteht und an genau einer Stelle definiert ist, wechselt zur nächsten Farbe desselben Farbtons, die auf jedem gemessenen Hintergrund besteht; in einem Projekt nicht angewendet.
Besteht Text die Kontrastprüfung nicht und ist seine Farbe an genau einer Stelle im Theme definiert, wird diese Stelle auf die nächste Farbe desselben Farbtons geändert, die gegenüber jedem Hintergrund, den der Scan dafür gemessen hat, den erforderlichen Kontrast erreicht. Eine Stelle kann eine LESS-Variable oder CSS-Variable sein, die nur für die Textfarbe verwendet wird, oder eine einzelne
color-Regel. Liefert das Theme eine kompiliertestyles-m.cssmit, erhält sie dieselbe Änderung. Eine Farbe, die an mehreren Stellen verwendet wird, auch als Hintergrund oder Rand, oder in Regeln, deren Hintergrund der Scan nicht gemessen hat, bleibt einem Menschen überlassen.- Abgedeckte Regeln
-
-
color-contrastASSISTED
-
- Geänderte Dateitypen
-
.css.less
darkens the single #929292 token and validates Beispieldaten app/design/frontend/Validiscan/fixture/web/css/source/_theme.less Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 1 hinzugefügt, 1 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/web/css/source/_theme.less: 1 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung Code 1099 1099 // VALIDISCAN-SEEDED color-contrast: #929292 on white is 3.1:1. 1100 1100 .block-promo .info, 1101 1101 .toolbar-amount { 1102 Entfernt color: #929292; 1102 Hinzugefügt color: #767676; 1103 1103 } 1104 1104 1105 1105 // VALIDISCAN-SEEDED vs-reflow: the promo row keeps a 1100px minimum width at every breakpoint. app/design/frontend/Validiscan/fixture/web/css/styles-m.css Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 1 hinzugefügt, 1 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/web/css/styles-m.css: 1 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung Code 1075 1075 1076 1076 .block-promo .info, 1077 1077 .toolbar-amount { 1078 Entfernt color: #929292; 1078 Hinzugefügt color: #767676; 1079 1079 } 1080 1080 1081 1081 .block-promo-wrapper { -
Dekorative Bilder, vor Screenreadern verborgen decorative-image-alt Nur Bilder, bei denen das Template belegt, dass sie dekorativ sind, erhalten ein leeres
altoderaria-hidden; in einem Projekt nicht angewendet.Ein Bild wird nur dann als dekorativ markiert, wenn das Template belegt, dass es nichts beiträgt: Es steht in einem Link oder einer Schaltfläche, die schon einen Text oder einen Namen hat, etwa eine Aktionskachel mit eigener Überschrift; es ist ein Icon, höchstens 48 Pixel groß oder mit einer Icon-Klasse oder einem Icon-Dateinamen, neben seiner eigenen Textbeschriftung; oder es ist ein Abstandshalter oder Trenner. Ein
<img>erhält dann ein leeresalt, und ein SVG-Icon erhältaria-hidden="true", sodass Screenreader es überspringen, statt einen Dateinamen vorzulesen. Jedes andere Bild gilt als Inhalt, und seine Textalternative braucht Worte, die ein Mensch wählt.- Abgedeckte Regeln
-
-
image-altASSISTED -
role-img-altASSISTED -
svg-img-altASSISTED
-
- Geänderte Dateitypen
-
.html
marks the promo tile image decorative and validates Beispieldaten app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html Änderungen an app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html: 1 hinzugefügt, 1 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html: 1 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung Code 111 111 <div class="block-promo-wrapper block-promo-hp"> 112 112 <!-- VALIDISCAN-SEEDED image-alt: promo image without an alt attribute --> 113 113 <a class="block-promo home-main" href="/magento/women/tops-women/jackets-women.html"> 114 Entfernt <img src="/magento/media/wysiwyg/home/home-main.svg" width="400" height="240" /> 114 Hinzugefügt <img src="/magento/media/wysiwyg/home/home-main.svg" width="400" height="240" alt="" /> 115 115 <span class="content" 116 116 ><!-- VALIDISCAN-SEEDED color-contrast: .info text is #929292 on white (3.1:1) --><span 117 117 class="info" -
Namen für Schaltflächen und Links, die nur ein Icon zeigen icon-accessible-name Schaltflächen und Links, die nur ein Icon zeigen und deren Zweck der Code verrät, erhalten ein
aria-labelim Wortlaut des Themes Luma von Magento, wo Luma einen hat; in einem Projekt nicht angewendet.Schaltflächen und Links, die nur ein Icon zeigen, etwa für Suche, Mini-Warenkorb, Konto, Wunschliste, Vergleich, Menü, Schließen, Zurück und Weiter sowie die Auswahl eines Cookie-Banners, erhalten ein
aria-label, das sagt, was sie tun, im Wortlaut des Themes Luma von Magento, wo Luma einen hat, etwa „Search“, „My Cart“ oder „Allow Cookies“. Der Zweck wird aus den Klassen, der ID, den Data-Attributen und dem Linkziel des Bedienelements, aus seinem Icon und aus dem Formular oder Cookie-Banner darum herum abgelesen. Ein Bedienelement, dessen Zweck der Code nicht verrät, etwa ein Social-Media-Link, der in einer Schleife aus einer als Daten gespeicherten Adresse gebaut wird, oder ein Link, dessen einziger Inhalt ein Produktfoto ist, bleibt einem Menschen überlassen, weil sein Name von Ihren Inhalten abhängt.- Abgedeckte Regeln
-
-
button-nameASSISTED -
link-nameASSISTED -
vs-cookie-bannerASSISTED
-
- Geänderte Dateitypen
-
.phtml
names the icon-only search button and validates Beispieldaten app/design/frontend/Validiscan/fixture/Magento_Search/templates/form.mini.phtml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Search/templates/form.mini.phtml: 1 hinzugefügt, 1 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/Magento_Search/templates/form.mini.phtml: 1 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung Code 20 20 <div class="actions"> 21 21 <!-- VALIDISCAN-SEEDED button-name: icon-only search button without text, title or aria-label --> 22 22 <?php /* Fixed variant: <button type="submit" title="Search" class="action search"><span class="sr-only">Search</span>(icon, aria-hidden)</button>; the form gets role="search" aria-label="Site search". */ ?> 23 Entfernt <button type="submit" class="action search"><svg class="icon" viewBox="0 0 24 24"><circle cx="11" cy="11" r="7"/><path d="M20 20l-4-4"/></svg></button> 23 Hinzugefügt <button type="submit" class="action search" aria-label="<?= $escaper->escapeHtmlAttr(__('Search')) ?>"><svg class="icon" viewBox="0 0 24 24"><circle cx="11" cy="11" r="7"/><path d="M20 20l-4-4"/></svg></button> 24 24 </div> 25 25 </form> 26 26 </div> names the minicart link and leaves the product photo link for review Beispieldaten app/design/frontend/Validiscan/fixture/Magento_Checkout/templates/cart/minicart.phtml Änderungen an app/design/frontend/Validiscan/fixture/Magento_Checkout/templates/cart/minicart.phtml: 1 hinzugefügt, 1 entfernt
Änderungen an app/design/frontend/Validiscan/fixture/Magento_Checkout/templates/cart/minicart.phtml: 1 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung Code 13 13 ?> 14 14 <!-- VALIDISCAN-SEEDED link-name + aria-valid-attr-value: the "My Cart" text was removed from the minicart link (only an icon and an empty counter remain) and aria-expanded carries the invalid value "closed" --> 15 15 <div data-block="minicart" class="minicart-wrapper"> 16 Entfernt <a class="action showcart" href="<?= $escaper->escapeUrl($block->getShoppingCartUrl()) ?>" data-bind="scope: 'minicart_content'" aria-haspopup="true" aria-expanded="closed"> 16 Hinzugefügt <a class="action showcart" href="<?= $escaper->escapeUrl($block->getShoppingCartUrl()) ?>" data-bind="scope: 'minicart_content'" aria-haspopup="true" aria-expanded="closed" aria-label="<?= $escaper->escapeHtmlAttr(__('My Cart')) ?>"> 17 17 <svg class="icon" viewBox="0 0 24 24"><path d="M3 4h2l2.4 11.2a2 2 0 0 0 2 1.6h7.7a2 2 0 0 0 2-1.5L21 8H6"/><circle cx="10" cy="20" r="1.5"/><circle cx="17" cy="20" r="1.5"/></svg> 18 18 <span class="counter qty empty"><span class="counter-number"></span></span> 19 19 </a>
Details: die Stufen, das Testtheme, die Prüfungen jeder Änderung und Text in den Sprachen Ihres Shops
Ein Rezept ist eine deterministische Änderung für eine Art von Fehler: Derselbe Code erhält immer dieselbe Änderung. Validiscan hat 20 Rezepte für Magento-Themes. Jedes ändert nur dort etwas, wo der Code des Themes zeigt, welche Änderung die richtige ist. Wo er es nicht zeigt, ändert das Rezept nichts. Es rät nicht.
Unter jedem Rezept finden Sie die Regeln, die es abdeckt, mit der Stufe jeder Regel im Regelkatalog von Validiscan für Magento. AUTO bedeutet, dass ein Rezept die Standardkorrektur der Regel ist. ASSISTED bedeutet, dass die Befunde der Regel meist eine Einschätzung verlangen. MANUAL bedeutet, dass die Regel die Entscheidung eines Menschen braucht und mit einer Anleitung kommt. In einem Projekt werden Rezepte auf Befunde von Regeln der Stufe AUTO angewendet. Führt ein Rezept zusätzlich eine Regel der Stufe ASSISTED oder MANUAL auf, geht ein Befund dieser Regel stattdessen den Weg ASSISTED oder MANUAL. Eine Regel, die durch eine andere Prüfung geprüft wird, läuft in einem Scan nicht für sich; die andere Prüfung meldet denselben Fehler.
Die Dateitypen und das Vorher und Nachher jedes Rezepts stammen aus den eigenen Tests von Validiscan. Sie laufen auf dem Magento-Testtheme von Validiscan, einem Child-Theme des Themes Luma von Magento, in das absichtlich Fehler der Barrierefreiheit eingebaut wurden. Magento lässt sich in der Testumgebung nicht rendern, deshalb rendert kein Test eine Seite: Jeder Test vergleicht die Änderung mit einem gespeicherten Diff und prüft den geänderten Quellcode, zum Beispiel, ob er der korrigierten Version des Testthemes entspricht. Die Dateien Ihres Themes sehen anders aus.
Bevor Validiscan eine Änderung prüft, werden die geänderten Dateien kontrolliert. Jeder Pfad muss, wie oben beschrieben, innerhalb des Themes liegen. .phtml-Templates durchlaufen die eigene Syntaxprüfung von PHP, die die Datei liest, ohne sie auszuführen. Layout-XML wird als XML geprüft, Stylesheets erhalten eine Strukturprüfung, und HTML-Templates und JavaScript werden mit einem Parser gelesen.
Fügt ein Rezept Worte hinzu, etwa den Text eines Skip-Links oder den Namen eines Navigationsbereichs, schreibt es sie auf Englisch, im Wortlaut des Themes Luma von Magento, wo Luma einen hat, etwa „Skip to Content“. Hat Ihr Theme in seinem Ordner i18n eine deutsche Übersetzungsdatei, fügt das Rezept den deutschen Text dort hinzu, sofern der String nicht schon übersetzt ist. Text für die anderen Sprachen Ihres Shops wird nicht hinzugefügt.
Was bleibt auf Magento MANUAL?
Fehler, die eine Entscheidung über Ihre Inhalte oder darüber verlangen, wie sich ein Teil der Seite verhält, die ein Rezept nicht trifft, etwa Untertitel und Transkripte für Ihre Videos und Audioinhalte, bleiben auf Magento MANUAL. Für einen Befund einer MANUAL-Regel gibt Validiscan eine Anleitung, keine Codeänderung.
Die unten aufgeführten Regeln werden in Scans ausgeführt und haben auf Magento die Stufe MANUAL; Regeln zur guten Praxis sind nicht aufgeführt.
-
meta-refreshZeitverzögerte Aktualisierung unter 20 Stunden darf nicht verwendet werden -
nested-interactiveInteraktive Bedienelemente dürfen nicht verschachtelt sein -
scrollable-region-focusableScrollbare Bereiche müssen per Tastatur erreichbar sein -
server-side-image-mapServerseitige Imagemaps dürfen nicht verwendet werden -
vs-keyboard-trapDer Tastaturfokus darf nie festhängen -
vs-focus-orderDie Fokusreihenfolge muss der visuellen Reihenfolge folgen -
vs-draggingReine Ziehbewegungen brauchen eine Alternative per Tippen oder Klicken -
vs-mediaVideos brauchen Untertitel, Audio braucht ein Transkript, und nichts darf automatisch mit Ton starten -
vs-documentsVerlinkte Dokumente brauchen eine manuelle Prüfung der Barrierefreiheit
Details: was ein Befund der Stufe MANUAL erhält, die Regel zur Tab-Reihenfolge und was ein Projekt nicht umfasst
Für einen Befund einer MANUAL-Regel gibt Validiscan eine Anleitung zur Behebung, keine Änderung an Ihrem Code. Diese Fehler verlangen eine Entscheidung über Ihre Inhalte oder darüber, wie sich ein Teil der Seite verhält, die ein Rezept nicht trifft: Untertitel und Transkripte für Ihre Videos und Audioinhalte, ein Ausweg aus einem Widget, das den Tastaturfokus festhält, eine zweite Möglichkeit, ein Bedienelement zu benutzen, das nur durch Ziehen funktioniert, eine Fokusreihenfolge, die zum Layout passt, eine Seite, die sich nach einer Verzögerung selbst neu lädt, oder die Barrierefreiheit verlinkter PDFs und anderer Dokumente. Eine erzwungene Tab-Reihenfolge durch einen tabindex größer als 0 meldet auch die axe-core-Regel tabindex, die das Rezept für die Tab-Reihenfolge weiter oben behebt.
Die Arbeit an Befunden der Stufe MANUAL, bei denen Sie selbst inhaltlich entscheiden müssen, ist nicht Teil eines Projekts, PDFs ebenso wenig. Was automatisierte Tests der Barrierefreiheit nachweisen können und was nicht
Was stellen Sie bereit?
Sie stellen bereit: Ihre schriftliche Einwilligung in einen vollständigen Scan, einen Weg in Ihr Theme, Ihre Antwort zu KI-Entwürfen für ASSISTED-Korrekturen, ein Entwicklungsteam, das die Änderungen prüft, die Stylesheets kompiliert und das Theme bereitstellt, einige Änderungen im Magento-Adminbereich, Übersetzungen des hinzugefügten Texts für weitere Sprachen und Ihre Entscheidungen darüber, was MANUAL bleibt.
- Ihre schriftliche Einwilligung in einen vollständigen Scan Ihres Shops. Ein vollständiger Scan legt ein Produkt in den Warenkorb und öffnet den ersten Schritt im Checkout, ohne einen Kauf abzuschließen oder Zahlungsdaten einzugeben.
- Einen Weg in Ihr Theme: den Zugriff auf das GitHub-Repository, in dem es liegt, oder ein ZIP des Theme-Ordners unter
app/design/frontend, das im Kundenportal hochgeladen wird. - Ihre Antwort darauf, ob KI Korrekturen der Stufe ASSISTED entwerfen darf. KI-Entwürfe sind ausgeschaltet, bis Sie zustimmen.
- Ein Entwicklungsteam, das die Änderungen prüft, den Pull Request zusammenführt oder das Patch-Paket einspielt, die Stylesheets kompiliert und das Theme bereitstellt.
- Die Änderungen im Magento-Adminbereich, die die Korrekturen nicht vornehmen: die Store View oder die Sprachauszeichnung für Inhalte, die in einer anderen Sprache verfasst sind als ihr Store, Seitentitel und HTML-Head-Einstellungen sowie das Ausschalten des automatischen Abspielens bei Page-Builder-Slidern, die in der Datenbank gespeichert sind.
- Übersetzungen des Texts, den Korrekturen hinzufügen, für die anderen Sprachen Ihres Shops. Die Rezepte schreiben Englisch und fügen Deutsch nur dort hinzu, wo Ihr Theme schon eine deutsche Übersetzungsdatei hat.
- Ihre Entscheidungen zu dem, was MANUAL bleibt, etwa Untertitel für Ihre Videos.
Details: wenn die Änderungen live sind, und was ein Projekt umfasst
Sobald die Änderungen live sind, prüft ein Verifizierungsscan die betroffenen Seiten erneut, und das Remediation Evidence Package hält das Ergebnis fest. Der Ablauf eines Projekts, Schritt für Schritt
Ein Projekt gilt für einen Shop: eine Domain und ein Theme. Eine Headless-Storefront, bei der die Seiten statt von einem Theme von einer eigenen Frontend-Anwendung erzeugt werden, ist auf Anfrage möglich.
Quellen
Eine Quelle, für diese Seite geprüft am 6. Oktober 2026.
Entwicklerdokumentation von Adobe Commerce 1
- CSS and LESS preprocessing · Adobe · geprüft am
Beginnen Sie mit einem kostenlosen Check Ihres Shops.
Senden Sie die Adresse Ihres Shops. Validiscan scannt ihn und antwortet mit jedem Fehler, den der Scan nachweisen kann, jeweils mit der Seite und dem Code.
Kostenlosen Check anfordernOder schreiben Sie an info@validiscan.com.
Was der kostenlose Check umfasst und was nicht- Sie senden
- die Adresse Ihres Shops
- Gescannte Seiten
- bis zu 15
- Sie erhalten
- jeden Fehler, den der Scan nachweisen kann, mit Seite und Code
- In Ihrem Shop
- nur öffentliche Seiten; keine Anmeldung, nichts gekauft, kein Formular abgeschickt
- Was er nicht ist
- ein vollständiges Audit