Aller au contenu

Éléments interactifs et widgets dans le développement web

La création de widgets personnalisés et l'utilisation des API HTML peuvent considérablement améliorer l'interactivité et l'expérience utilisateur de vos applications web. Ce guide fournit des instructions étape par étape pour créer des éléments interactifs personnalisés tels que des curseurs, des modales et des onglets, et vous présente les API HTML5 telles que l'API Canvas pour créer des graphiques dynamiques.

Introduction

Les éléments interactifs et les widgets sont des composants essentiels des applications web modernes. Ils améliorent l'engagement des utilisateurs en offrant des interfaces dynamiques et interactives. Ce guide couvre la création de widgets personnalisés et l'utilisation des API HTML5 pour construire des applications web réactives et conviviales.

Bonnes pratiques

  1. Utilisez du HTML sémantique : Assurez-vous que votre structure HTML est significative et accessible.
  2. Séparez les responsabilités : Gardez le HTML, le CSS et le JavaScript séparés pour maintenir un code propre et gérable.
  3. Accessibilité : Assurez-vous que les éléments interactifs sont accessibles à tous les utilisateurs, y compris ceux utilisant des lecteurs d'écran.
  4. Optimisation des performances : Minimisez la manipulation du DOM et optimisez le JavaScript pour garantir des interactions fluides.
  5. Design responsive : Assurez-vous que les éléments interactifs fonctionnent bien sur différentes tailles d'écran et appareils.

Création de widgets personnalisés

Remarque : Pour les applications de production, envisagez d'utiliser des éléments HTML natifs comme <code><dialog></code> pour les modales ou <code><details></code> et <code><summary></code> pour le contenu repliable avant de créer des widgets personnalisés.

Curseur personnalisé

Un curseur personnalisé permet aux utilisateurs de sélectionner une valeur dans une plage. Voici comment en créer un à l'aide de HTML, CSS et JavaScript.

Exemple

html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Custom Slider</title>
    <style>
        .slider-container {
            display: flex;
            align-items: center;
            gap: 10px;
        }

        #slider {
            width: 200px;
        }
    </style>
</head>
<body>
    <div class="slider-container">
        <input type="range" id="slider" min="0" max="100" value="50" aria-label="Value slider" aria-describedby="slider-value" />
        <span id="slider-value">50</span>
    </div>
    <script>
        document.getElementById('slider').addEventListener('input', function() {
            document.getElementById('slider-value').textContent = this.value;
        });
    </script>
</body>
</html>

Cet exemple crée un curseur simple avec un champ de plage et un élément span pour afficher la valeur actuelle. Le JavaScript met à jour le contenu textuel du span lorsque le curseur bouge.

Modale personnalisée

Les modales sont utilisées pour afficher du contenu dans une superposition. Voici comment créer une modale personnalisée.

Exemple

html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Custom Modal</title>
    <style>
        .modal {
            display: none;
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background-color: rgba(0, 0, 0, 0.5);
            justify-content: center;
            align-items: center;
        }

        .modal-content {
            background-color: #fff;
            padding: 20px;
            border-radius: 5px;
            text-align: center;
        }

        .close {
            position: absolute;
            top: 10px;
            right: 10px;
            font-size: 20px;
            cursor: pointer;
        }
    </style>
</head>
<body>
    <button id="open-modal">Open Modal</button>
    <div id="modal" class="modal" role="dialog" aria-modal="true" aria-labelledby="modal-title" tabindex="-1">
        <div class="modal-content">
            <span id="close-modal" class="close" aria-label="Close modal">&times;</span>
            <h2 id="modal-title">Custom Modal</h2>
            <p>This is a custom modal!</p>
        </div>
    </div>
    <script>
        const modal = document.getElementById('modal');
        const openBtn = document.getElementById('open-modal');
        const closeBtn = document.getElementById('close-modal');

        openBtn.addEventListener('click', () => {
            modal.style.display = 'flex';
            closeBtn.focus();
        });

        closeBtn.addEventListener('click', () => {
            modal.style.display = 'none';
            openBtn.focus();
        });

        window.addEventListener('keydown', (e) => {
            if (modal.style.display === 'flex' && e.key === 'Escape') {
                modal.style.display = 'none';
                openBtn.focus();
            }
        });

        modal.addEventListener('click', (event) => {
            if (event.target === modal) {
                modal.style.display = 'none';
                openBtn.focus();
            }
        });
    </script>
</body>
</html>

Cet exemple montre comment créer une modale qui peut être ouverte et fermée à l'aide de JavaScript. La modale affiche une superposition et une boîte de contenu, qui peuvent être fermées en cliquant sur un bouton, en appuyant sur Échap ou en cliquant sur la superposition. La gestion du focus est assurée pour permettre aux utilisateurs du clavier de naviguer dans la boîte de dialogue.

Onglets personnalisés

Les onglets permettent aux utilisateurs de passer d'une section de contenu à une autre. Voici comment créer des onglets personnalisés.

Exemple

html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Custom Tabs</title>
    <style>
        .tabs {
            display: flex;
            gap: 10px;
        }

        .tab-button {
            padding: 10px 20px;
            cursor: pointer;
            background-color: #f0f0f0;
            border: 1px solid #ccc;
            border-radius: 5px;
        }

        .tab-button.active {
            background-color: #fff;
            border-bottom: 2px solid #000;
        }

        .tab-content {
            display: none;
            margin-top: 20px;
        }

        .tab-content.active {
            display: block;
        }
    </style>
</head>
<body>
    <div class="tabs" role="tablist">
        <button class="tab-button active" role="tab" aria-selected="true" data-tab="tab1">Tab 1</button>
        <button class="tab-button" role="tab" aria-selected="false" data-tab="tab2">Tab 2</button>
        <button class="tab-button" role="tab" aria-selected="false" data-tab="tab3">Tab 3</button>
    </div>
    <div class="tab-content active" role="tabpanel" aria-labelledby="tab1">
        <p>Content for Tab 1</p>
    </div>
    <div class="tab-content" role="tabpanel" aria-labelledby="tab2">
        <p>Content for Tab 2</p>
    </div>
    <div class="tab-content" role="tabpanel" aria-labelledby="tab3">
        <p>Content for Tab 3</p>
    </div>
    <script>
        const buttons = document.querySelectorAll('.tab-button');
        const contents = document.querySelectorAll('.tab-content');

        function activateTab(clickedBtn) {
            buttons.forEach(btn => {
                btn.classList.remove('active');
                btn.setAttribute('aria-selected', 'false');
            });
            contents.forEach(content => content.classList.remove('active'));

            clickedBtn.classList.add('active');
            clickedBtn.setAttribute('aria-selected', 'true');
            document.getElementById(clickedBtn.dataset.tab).classList.add('active');
        }

        buttons.forEach(button => {
            button.addEventListener('click', () => activateTab(button));
            button.addEventListener('keydown', (e) => {
                let nextIndex;
                if (e.key === 'ArrowRight') nextIndex = (buttons.indexOf(button) + 1) % buttons.length;
                else if (e.key === 'ArrowLeft') nextIndex = (buttons.indexOf(button) - 1 + buttons.length) % buttons.length;
                else return;
                e.preventDefault();
                buttons[nextIndex].focus();
                activateTab(buttons[nextIndex]);
            });
        });
    </script>
</body>
</html>

Cet exemple crée une interface à onglets. Cliquer sur un bouton d'onglet ou utiliser les flèches gauche/droite affichera le contenu correspondant et masquera les autres.

Utilisation des API HTML5

Introduction aux API HTML5

Les API HTML5 offrent des fonctionnalités puissantes qui améliorent les applications web. L'une des API HTML5 les plus polyvalentes est l'API Canvas, qui permet de créer des graphiques dynamiques.

Utilisation de l'API Canvas

L'API Canvas vous permet de dessiner des graphiques directement sur une page web. Voici un exemple de base sur la façon d'utiliser l'API Canvas.

Exemple

html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Canvas API Example</title>
</head>
<body>
    <canvas id="myCanvas" width="400" height="400" style="border:1px solid #000;"></canvas>
    <script>
        const canvas = document.getElementById('myCanvas');
        const ctx = canvas.getContext('2d');

        // Draw a rectangle
        ctx.fillStyle = '#FF0000';
        ctx.fillRect(50, 50, 150, 100);

        // Draw a circle
        ctx.beginPath();
        ctx.arc(200, 200, 40, 0, 2 * Math.PI);
        ctx.fillStyle = '#00FF00';
        ctx.fill();

        // Draw text
        ctx.font = '20px Arial';
        ctx.fillStyle = '#0000FF';
        ctx.fillText('Hello Canvas', 100, 300);
    </script>
</body>
</html>

Cet exemple montre les fonctions de dessin de base de l'API Canvas, y compris le dessin d'un rectangle, d'un cercle et de texte sur un élément canvas. Pour des mises à jour dynamiques ou des animations, appelez à plusieurs reprises les fonctions de dessin à l'intérieur de requestAnimationFrame ou d'écouteurs d'événements.

INFO

Assurez-vous toujours que vos éléments interactifs sont accessibles. Utilisez les rôles et propriétés ARIA, le HTML sémantique et assurez la navigation au clavier pour offrir une expérience utilisateur inclusive à tous. Cela améliore non seulement l'accessibilité, mais renforce également l'utilisabilité globale et le SEO.

Conclusion

La création de widgets personnalisés tels que des curseurs, des modales et des onglets, ainsi que l'utilisation d'API HTML5 comme l'API Canvas, peuvent considérablement améliorer l'interactivité et les fonctionnalités des applications web. En suivant ces guides étape par étape, vous pouvez créer des éléments web engageants et dynamiques qui améliorent l'expérience utilisateur.

Pratique

Parmi les affirmations suivantes concernant les éléments interactifs et les widgets, lesquelles sont vraies ?

Trouvez-vous cela utile?

Aperçu dual-run — comparez avec les routes Symfony en production.