Les éléments <marquee> sont obsolètes et ne doivent pas être utilisés

Le texte défilant d’un <marquee> bouge en permanence et ne peut pas être mis en pause : les clients qui ont des difficultés de lecture, des troubles de l’attention ou une déficience visuelle ne peuvent pas lire l’offre ou le message de livraison qu’il contient. Le mouvement détourne aussi l’attention des produits et de la commande.

Identifiant de la règle
marquee
Source
axe-core 4.13.0
Impact
Grave
Niveau de correction
AUTO
sur Shopify, Shopware, WooCommerce et Magento
Statut
exécutée

Ce que fait le contrôle

Vérifier que les éléments <marquee> ne sont pas utilisés

La règle sélectionne chaque élément <marquee> de la page, éléments masqués compris, et met en échec chacun de ceux qui sont visibles à l’écran. Elle ne lit ni les attributs de l’élément ni son texte ; la vitesse, la direction et le fait que le texte bouge réellement ou non n’entrent donc pas en jeu.

Un <marquee> ne réussit que si axe-core le trouve hors de vue, par exemple lorsque lui-même ou un ancêtre a display: none ou opacity: 0, lorsqu’il a visibility: hidden, lorsque clip-path: inset(50%) ou un clip de taille nulle le masque, ou lorsqu’il est positionné au-dessus du haut de la page. Un <marquee> situé plus bas dans une longue page est tout de même considéré comme visible.

Par défaut, le scanner de Validiscan charge chaque page en 1440 × 900 pixels (ordinateur) et en 390 × 844 (mobile) ; un <marquee> que le thème masque à l’une des tailles n’est donc signalé que pour l’autre. Un texte défilant réalisé avec une animation CSS ou en JavaScript ne relève pas de cette règle.

Comment corriger

Supprimez l’élément <marquee> et affichez son texte comme contenu statique. Si une barre d’annonce animée est souhaitée, réalisez-la en CSS en respectant prefers-reduced-motion et dotez-la d’un bouton de pause visible.

Critères de succès WCAG

Clauses de la norme EN 301 549

La clause de la norme EN 301 549 pour chaque critère, selon la version de la norme
Critère WCAG Version 3.2.1 Version 4.1.1
2.2.2 9.2.2.2 9.2.2.2

Où une recette corrige le problème

Afficher l’avant et l’après (1)
Avant et après Données d’exemple

sections/announcement-bar.liquid Modifications apportées à sections/announcement-bar.liquid (lignes ajoutées : 2, lignes supprimées : 2)

Modifications apportées à sections/announcement-bar.liquid (lignes ajoutées : 2, lignes supprimées : 2)
Ligne avant Ligne après Modification Code
3 3 -%}
4 4 <div class="announcement-bar color-accent"{% if bar_lang != '' %} lang="{{ bar_lang }}"{% endif %}>
5 5 <div class="page-width">
6 Supprimée <marquee class="announcement-bar__message" behavior="scroll" direction="left" scrollamount="4">{{ section.settings.text | escape }}</marquee>
7 Supprimée <p class="announcement-bar__note"><blink class="announcement-bar__flag">New</blink> winter collection</p>
6 Ajoutée <div class="announcement-bar__message">{{ section.settings.text | escape }}</div>
7 Ajoutée <p class="announcement-bar__note"><span class="announcement-bar__flag">New</span> winter collection</p>
8 8 </div>
9 9 </div>
10 10
Afficher l’avant et l’après (1)
replaces a seeded marquee and blink in the top bar; axe no longer reports them Données d’exemple

Resources/views/storefront/layout/header/top-bar.html.twig Modifications apportées à Resources/views/storefront/layout/header/top-bar.html.twig (lignes ajoutées : 2, lignes supprimées : 2)

Modifications apportées à Resources/views/storefront/layout/header/top-bar.html.twig (lignes ajoutées : 2, lignes supprimées : 2)
Ligne avant Ligne après Modification Code
4 4 {% block layout_header_top_bar_usp %}
5 5 <p class="top-bar-usp">
6 6 {% sw_icon 'checkmark' style { size: 'xs' } %}
7 Supprimée <marquee class="top-bar-marquee" behavior="scroll" scrollamount="4"><span>{{ 'header.topBarUsp'|trans }}</span></marquee>
7 Ajoutée <span class="top-bar-marquee"><span>{{ 'header.topBarUsp'|trans }}</span></span>
8 8 </p>
9 9 {% endblock %}
10 10
13 13 <li class="top-bar-nav-item">
14 14 <a class="top-bar-nav-link top-bar-help" href="{{ url('/contact') }}">
15 15 {% sw_icon 'headset' style { size: 'xs' } %}
16 Supprimée <blink class="top-bar-blink">{{ 'header.topBarHelp'|trans }}</blink>
16 Ajoutée <span class="top-bar-blink">{{ 'header.topBarHelp'|trans }}</span>
17 17 </a>
18 18 </li>
19 19 </ul>
Afficher l’avant et l’après (2)
makes a marquee and a blink added to the fixture theme static Données d’exemple

footer.php Modifications apportées à footer.php (lignes ajoutées : 1, lignes supprimées : 1)

Modifications apportées à footer.php (lignes ajoutées : 1, lignes supprimées : 1)
Ligne avant Ligne après Modification Code
31 31 <?php endfor; ?>
32 32 </div>
33 33
34 Supprimée <marquee class="kb-ticker" behavior="scroll" scrollamount="3"><?php esc_html_e( 'Free returns within 30 days', 'kestrel-birch' ); ?></marquee>
34 Ajoutée <div class="kb-ticker"><?php esc_html_e( 'Free returns within 30 days', 'kestrel-birch' ); ?></div>
35 35 <div class="site-info">
36 36 <?php // VALIDISCAN-SEED color-contrast: .site-info and the footer copy are #888 on #f4f1ec (3.1:1), see main.css. ?>
37 37 <p>

functions.php Modifications apportées à functions.php (lignes ajoutées : 1, lignes supprimées : 1)

Modifications apportées à functions.php (lignes ajoutées : 1, lignes supprimées : 1)
Ligne avant Ligne après Modification Code
223 223 */
224 224 function kb_single_product_usp() {
225 225 // VALIDISCAN-SEED vs-reflow: .kb-usp is white-space: nowrap in assets/css/woocommerce.css.
226 Supprimée echo '<p class="kb-usp"><blink class="kb-new">' . esc_html__( 'New', 'kestrel-birch' ) . '</blink> ' . esc_html__( 'Same-day dispatch · Free returns · Climate-neutral delivery', 'kestrel-birch' ) . '</p>';
226 Ajoutée echo '<p class="kb-usp"><span class="kb-new">' . esc_html__( 'New', 'kestrel-birch' ) . '</span> ' . esc_html__( 'Same-day dispatch · Free returns · Climate-neutral delivery', 'kestrel-birch' ) . '</p>';
227 227 }
228 228 add_action( 'woocommerce_single_product_summary', 'kb_single_product_usp', 31 );
229 229
turns blink and marquee into static elements in templates and PHP strings Données d’exemple

functions.php Modifications apportées à functions.php (lignes ajoutées : 1, lignes supprimées : 1)

Modifications apportées à functions.php (lignes ajoutées : 1, lignes supprimées : 1)
Ligne avant Ligne après Modification Code
11 11 add_action( 'after_setup_theme', 'minimal_setup' );
12 12
13 13 function minimal_sale() {
14 Supprimée echo '<p><blink class="sale">' . esc_html__( 'Sale', 'minimal' ) . '</blink></p>';
14 Ajoutée echo '<p><span class="sale">' . esc_html__( 'Sale', 'minimal' ) . '</span></p>';
15 15 }

template-parts/notice.php Modifications apportées à template-parts/notice.php (lignes ajoutées : 3, lignes supprimées : 3)

Modifications apportées à template-parts/notice.php (lignes ajoutées : 3, lignes supprimées : 3)
Ligne avant Ligne après Modification Code
1 1 <div class="notice">
2 Supprimée <marquee class="notice__ticker" behavior="scroll" direction="left" scrollamount="4">
2 Ajoutée <div class="notice__ticker">
3 3 <?php esc_html_e( 'Free shipping this week', 'minimal' ); ?>
4 Supprimée </marquee>
5 Supprimée <blink><?php esc_html_e( 'New!', 'minimal' ); ?></blink>
4 Ajoutée </div>
5 Ajoutée <span><?php esc_html_e( 'New!', 'minimal' ); ?></span>
6 6 </div>
Afficher l’avant et l’après (1)
makes an added ticker static and validates Données d’exemple

app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html (lignes ajoutées : 2, lignes supprimées : 2)

Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Cms/content/home.html (lignes ajoutées : 2, lignes supprimées : 2)
Ligne avant Ligne après Modification Code
1 Supprimée <marquee class="news-ticker" behavior="scroll" direction="left" scrollamount="4">
1 Ajoutée <div class="news-ticker">
2 2 <p>Autumn sale: 20% off all jackets</p>
3 Supprimée </marquee>
3 Ajoutée </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 Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Theme/templates/html/top-promo.phtml (lignes ajoutées : 1, lignes supprimées : 1)

Modifications apportées à app/design/frontend/Validiscan/fixture/Magento_Theme/templates/html/top-promo.phtml (lignes ajoutées : 1, lignes supprimées : 1)
Ligne avant Ligne après Modification 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 Supprimée <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 Ajoutée <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>

Commencez par une vérification gratuite de votre boutique.

Envoyez l’adresse de votre boutique. Validiscan la scanne et vous envoie chaque échec que le scan peut prouver, avec sa page et son code.

Demander une vérification gratuite

Ou écrivez à info@validiscan.com.

Ce que couvre la vérification gratuite, et ce qu’elle laisse de côté
Vous envoyez
l’adresse de votre boutique
Pages scannées
jusqu’à 15
Vous recevez
chaque échec que le scan peut prouver, avec la page et le code
Sur votre boutique
pages publiques uniquement ; aucune connexion, aucun achat, aucun formulaire envoyé
Ce qu’elle n’est pas
un audit complet

Écrire à Validiscan

Pour une vérification gratuite, indiquez l’adresse de votre boutique et sa plateforme.

Validiscan utilise ce que vous envoyez pour vous répondre. Politique de confidentialité