Retour à l'accueil

CSS pour les grands menus déroulants dans les formulaires

L'article analyse le problème des menus déroulants limités dans les formulaires et propose des solutions CSS pour les étendre. Des exemples de code en CSS et React pour les développeurs middle/senior sont fournis. Une attention particulière est accordée à l'accessibilité et aux performances.

Étendre le menu déroulant : astuce CSS pour les développeurs FE
Advertisement 728x90

Optimiser les menus déroulants dans les formulaires : problèmes et solutions CSS

Les développeurs frontend rencontrent fréquemment des éléments select dont la hauteur du menu déroulant est rigide, limitée à 4 à 5 éléments. Cette contrainte crée une barrière d'usabilité : les utilisateurs ne peuvent pas visualiser une liste complète de plus de 100 options sans faire défiler longuement dans une fenêtre étroite, ce qui entraîne frustration et perte de temps. Le résultat ? Une mauvaise expérience utilisateur — impossible de parcourir rapidement les choix disponibles ou de prendre une décision éclairée.

Un cas courant : un formulaire de soumission d'article de blog avec des champs comme « Public cible » ou « Centres d’intérêt ». La recherche aide à affiner l’entrée, mais elle devient inutile si l’utilisateur ne voit pas d’abord la liste complète. Défiler demande entre 20 et 50 rotations de molette juste pour explorer prudemment, ce qui est épuisant et chronophage.

Solution CSS pour agrandir les menus déroulants

La solution est simple : appliquer quelques règles CSS via les outils de développement ou dans les styles du composant. En augmentant la hauteur maximale à une valeur raisonnable (par exemple max-height: 80vh ou une valeur fixe de 400 à 500px), il devient possible d’afficher 20 à 30 éléments d’un coup, réduisant drastiquement la fatigue liée au défilement.

Google AdInline article slot

Exemples de styles pour les éléments select personnalisés ou natifs :

.select-container {
  position: relative;
}

.select-dropdown {
  max-height: 80vh !important;
  overflow-y: auto;
  position: absolute;
  z-index: 1000;
  width: 100%;
  background: white;
  border: 1px solid #ccc;
  border-radius: 4px;
  box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}

.select-option {
  padding: 12px 16px;
  cursor: pointer;
}

.select-option:hover {
  background: #f5f5f5;
}

Cette approche utilise efficacement l’espace disponible à l’écran sans perturber le layout. Sur les grands écrans, l’effet est particulièrement marqué — l’utilisateur voit instantanément tout le contexte.

Anti-modèle : ignorer la taille réelle des données

Les menus déroulants de taille fixe sont un classique de mauvaise pratique UX. Les designers conçoivent des maquettes avec seulement 3 à 5 éléments, et les développeurs implémentent des versions parfaites sur le plan visuel, sans envisager les cas extrêmes. Le résultat ? Des interfaces qui échouent sous charge réelle.

Google AdInline article slot

Signes caractéristiques de cet anti-modèle :

  • Hauteur fixe du menu < 200px lorsqu’il contient plus de 20 options.
  • Absence de défilement virtuel ou de pagination pour les listes longues.
  • Pas de bouton « Voir tout » ou mode plein écran.
  • La recherche ne s’active qu’après avoir cliqué, sans aperçu préalable.

Au lieu de cela, adoptez ces améliorations :

  • Hauteur dynamique : min(80vh, 50% de la liste).
  • Virtualisation pour les listes dépassant 100 éléments (utilisez react-window ou react-virtualized).
  • Navigation au clavier avec recherche floue.
  • Chargement différé des options au défilement.

Meilleures pratiques en développement frontend

Les composants interactifs doivent s’adapter aux dimensions de l’écran. Le contenu statique n’engage pas l’utilisateur — il doit être repliable ou masquable.

Google AdInline article slot
  • Design réactif : Utilisez max-height: calc(100vh - 200px) pour mobiles et desktop.
  • Accessibilité : Ajoutez des attributs ARIA (role="listbox", aria-activedescendant).
  • Performance : Pour React/Vue, utilisez des portails pour résoudre les conflits de z-index.
  • Tests : Validez avec des listes de 10, 50 et 200 éléments.

Exemple de composant React avec menu adaptable :

import React, { useState, useRef } from 'react';

const AdaptiveSelect = ({ options, onChange }) => {
  const [isOpen, setIsOpen] = useState(false);
  const [selected, setSelected] = useState('');
  const dropdownRef = useRef();

  const toggle = () => setIsOpen(!isOpen);

  const handleSelect = (value) => {
    setSelected(value);
    onChange(value);
    setIsOpen(false);
  };

  return (
    <div className="select-container">
      <div className="select-trigger" onClick={toggle}>
        {selected || 'Sélectionner une option'}
      </div>
      {isOpen && (
        <div className="select-dropdown" ref={dropdownRef}>
          {options.map(opt => (
            <div key={opt} className="select-option" onClick={() => handleSelect(opt)}>
              {opt}
            </div>
          ))}
        </div>
      )}
    </div>
  );
};

export default AdaptiveSelect;

Le composant s’ajuste automatiquement selon la taille de la liste et les dimensions de l’écran.

Points clés à retenir

  • Évolutivité : Les menus avec plus de 20 options nécessitent max-height: 80vh pour une bonne ergonomie.
  • Expérience utilisateur : Afficher toute la liste sans défilement réduit le temps de sélection de 5 à 10 fois.
  • Implémentation : 5 à 10 lignes de CSS résolvent 90 % des cas ; les cas complexes exigent la virtualisation.
  • Tests : Testez toujours avec des données réelles — pas seulement des listes de prototype de 4 éléments.
  • Accessibilité : Assurez-vous de la navigation au clavier et de la compatibilité avec les lecteurs d’écran.

— Editorial Team

Advertisement 728x90

Lire ensuite