CSS

CSS : Mise en forme d’une liste déroulante

Par Marc, le 24 décembre 2018, mis à jour le 18 février 2023 — design, html, liste déroulante, style, web — 5 minutes de lecture

Un peu de HTML pour commencer

Pour mon exemple, j’ai décidé de choisir une petite question toute bête qui possède la faculté de foutre le bordel très facilement dans  certains forums de joueurs. Concernant le code en lui-même, rien de bien compliqué. Une liste déroulante est composée d’une balise <select> qui englobe une liste de balises <option> qui symbolisent chaque élément de notre liste. Mais ce qui nous intéresse le plus n’est pas le code HTML, mais le CSS que vous pouvez-voir juste après : <div class=”bloc”> <div class=”select”> <select> <option>Vous êtes plutôt ?</option> <option value=”1″>PlayStation</option> <option value=”2″>Xbox</option> <option value=”3″>Nintendo</option> <option value=”4″>PC Master Race</option> </select> </div> </div>

Et beaucoup de CSS pour finir…

/* Ajout d’une petire image de fond juste pour le fun */ body { font-family: ‘Lato’, sans-serif; color: #555555; background: url(https://www.desktopbackground.org/p/2013/12/13/684937_nuclear-war-wallpapers_1600x900_h.jpg); background-repeat: no-repeat; background-size: cover; } /*Pas important, juste pour positioner la liste déroulante en milieude page */ .bloc { display: flex; flex-direction: column; align-items : center; justify-content: center; height: 100vh; } /*Réinitilaisation de la liste déroulante*/ select { appearance: none; outline: 0; border: 0 !important; background: #F9F9F9; background-image: none; box-shadow: none; font-size: 1.2em; } /*Ajout des couleurs de fond pour chaque option */ select option[value=”1″] { background: #2E6DB4; color: white; } select option[value=”2″] { background: #107C11; color: white; } select option[value=”3″] { background: #E70009; color: white; } select option[value=”4″] { background: black; color: white; } /* Mise en place des dimensions. On cache la flèche d’origine */ .select { position: relative; width: 350px; height: 45px; overflow: hidden; border-radius: 5px; border: 1px solid #CED4DA; } /* On adapte la liste déroulante à la div qui l’englobe*/ select { width: 100%; height: 100%; margin: 0; padding-left: 15px; color: #555555; cursor: pointer; } /* Mise en place de la flèche */ .select::after { content: ‘\276F’; position: absolute; top: 20%; right: 0; padding: 0 15px; background: white; pointer-events: none; transform: rotate(90deg); font-size: 1.5em; background: #F9F9F9; } .select:hover::after { color: #FA6141; } J’ai ajouté quelques lignes de commentaires pour vous expliquer les grandes lignes de mon code, mais je vais tout même revenir sur quelques points qui me paraissent essentiels.

1. Réinitialisation de la liste

Avant de commencer à mettre en forme une liste déroulante, il est important de la réinitialiser pour partir sur de bonnes bases. C’est-à-dire faire disparaître tous les éléments de style par défaut. Comme vous pouvez le voir dans le code ci-dessous, ce n’est pas très compliqué, j’utilise la déclaration  “appearance:none pour réinitialiser le rendu par défaut de la liste, j’efface les bords avec mon « border : 0 », j’applique une couleur de fond et j’enlève le halo lorsqu’on clique sur la liste avec « outline : 0 » select { appearance: none; outline: 0; border: 0 !important; background: #F9F9F9; background-image: none; box-shadow: none; font-size: 1.2em; }

2. Ajout d’une nouvelle flèche de sélection

Comme la vie est très mal faite, on ne peut pas modifier le style de la flèche de sélection par défaut hormis la couleur ou la taille. Il faut donc la cacher et en créer une nouvelle toute belle à la place. Et c’est justement là qu’intervient la première div que j’ai placé au-dessus de la balise <select>. En effet, c’est grâce à cette div qu’on fixe les dimensions de la liste déroulante et qu’on peut cacher la flèche d’origine avec l’attribut « overflow : hidden ». .select { position: relative; width: 350px; height: 45px; overflow: hidden; border-radius: 5px; border: 1px solid #CED4DA; } select { width: 100%; height: 100%; margin: 0; padding-left: 15px; color: #555555; cursor: pointer; } Une fois qu’on s’est occupé de cacher la flèche d’origine, il faut en créer une nouvelle. Et pour cela, on va utiliser le pseudo élément ::after pour créer une toute nouvelle flèche à la droite de la div principale. Je pense que le code ci-dessous est assez parlant pour se passer de description, mais sachez que vous pouvez changer l’allure de la flèche à l’aide de l’attribut « content ». Ici, j’ai utilisé un chevron classique auquel j’ai appliqué une rotation de 90° pour lui donner l’apparence d’une flèche vers le bas. .select::after { content: ‘\276F’; position: absolute; top: 20%; right: 0; padding: 0 15px; background: white; pointer-events: none; transform: rotate(90deg); font-size: 1.5em; background: #F9F9F9; } Et voilà, même si ça aurait gagné à être plus simple et moins tarabiscoté, la stylisation d’une liste déroulante en CSS n’a rien de fondamentalement très compliqué. Il suffit juste de suivre ces quelques étapes et ensuite laisser parler son imagination. Mon exemple est ici assez rudimentaire, mais il y a moyen de faire des choses vraiment très intéressantes visuellement et d’embellir le tout d’un soupçon de JavaScript pour y ajouter un peu de mouvement. Mais là, je vous laisse faire… En attendant, je vous laisse la démo de ma liste déroulante juste en-dessous.

See the Pen bOWJwx by Marko (@marko78) on CodePen.

Marc

Développeur full-stack depuis maintenant près de 7 ans, j'ai décidé d'ouvrir ce blog afin de capitaliser mes acquis, essayer de partager mes connaissances, découvrir de nouvelles technologies et surtout échanger avec d’autres développeurs.

Commentaires

Le 25 mars 2020 à 21 h 16 min, Naamane bilel a dit :


Bravo c'est super


Votre réponse sera révisée par les administrateurs si besoin.

Le 30 décembre 2022 à 15 h 35 min, clément corbiere a dit :


Bonjour, j'ai toujours le même problème sur votre liste déroulante. je n'arrive pas à changer le background lorsque je survol les liens avec la souris. si vous avez une solution je suis preneur. merci (par e-mail si possible). tks


Votre réponse sera révisée par les administrateurs si besoin.

Le 4 janvier 2023 à 11 h 21 min, Marc a dit :


Bonjour

J'ai tenté de bricoler quelque chose, mais ce n'est pas évidant d'agir sur le body depuis un autre élément. à la rigueur, il faudrait créer un div qu'on étale en fond pour le background pour agri dessus. à tester


Votre réponse sera révisée par les administrateurs si besoin.

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.