Existe-t-il un moyen CSS uniquement de <select>
liste déroulante?
J'ai besoin de styliser un <select>
formulaire autant que possible, sans JavaScript. Quelles sont les propriétés que je peux utiliser pour le faire en CSS?
Ce code doit être compatible avec tous les principaux navigateurs:
- Internet Explorer 6, 7 et 8
- Firefox
- Safari
Je sais que je peux le faire avec JavaScript: Exemple .
Et je ne parle pas de style simple. Je veux savoir ce que nous pouvons faire de mieux avec CSS uniquement.
J'ai trouvé des questions similaires sur Stack Overflow.
Et celui-ci sur Doctype.com.
Réponses:
Voici trois solutions:
Solution n ° 1 - apparence: aucune - avec solution de contournement d'Internet Explorer 10-11 ( démo )
-
Pour masquer la flèche par défaut définie
appearance: none
sur l'élément de sélection, puis ajoutez votre propre flèche personnalisée avecbackground-image
Prise en charge du navigateur:
appearance: none
a une très bonne prise en charge du navigateur ( caniuse ) - sauf pour Internet Explorer 11 (et versions ultérieures) et Firefox 34 (et versions ultérieures).Nous pouvons améliorer cette technique et ajouter la prise en charge d'Internet Explorer 10 et d'Internet Explorer 11 en ajoutant
Si Internet Explorer 9 est un problème, nous n'avons aucun moyen de supprimer la flèche par défaut (ce qui signifierait que nous aurions maintenant deux flèches), mais nous pourrions utiliser un sélecteur génial d'Internet Explorer 9.
Pour au moins annuler notre flèche personnalisée - en laissant intacte la flèche de sélection par défaut.
Tous ensemble:
Afficher l'extrait de code
Cette solution est simple et prend en charge un bon navigateur - elle devrait généralement suffire.
Si la prise en charge du navigateur pour Internet Explorer 9 (et versions ultérieures) et Firefox 34 (et versions ultérieures) est nécessaire, continuez à lire ...
Solution # 2 Tronquez l'élément de sélection pour masquer la flèche par défaut ( démo )
-
(En savoir plus ici)
Enveloppez l'
select
élément dans un div avec une largeur fixe etoverflow:hidden
.Donnez ensuite à l'
select
élément une largeur d'environ 20 pixels supérieure à la div .Le résultat est que la flèche déroulante par défaut de l'
select
élément sera masquée (en raison de laoverflow:hidden
sur le conteneur), et vous pouvez placer n'importe quelle image d'arrière-plan que vous voulez sur le côté droit de la div.L' avantage de cette approche est qu'elle est multi-navigateur (Internet Explorer 8 et versions ultérieures, WebKit et Gecko ). Cependant, l' inconvénient de cette approche est que la liste déroulante des options dépasse du côté droit (par les 20 pixels que nous avons cachés ... car les éléments d'option prennent la largeur de l'élément de sélection).
[Il convient toutefois de noter que si l'élément de sélection personnalisé n'est nécessaire que pour les appareils mobiles - le problème ci-dessus ne s'applique pas - en raison de la façon dont chaque téléphone ouvre nativement l'élément de sélection. Donc, pour les mobiles, cela peut être la meilleure solution.]
Afficher l'extrait de code
Si la flèche personnalisée est nécessaire sur Firefox - avant la version 35 - mais que vous n'avez pas besoin de prendre en charge les anciennes versions d'Internet Explorer - continuez à lire ...
Solution # 3 - Utilisez la
pointer-events
propriété ( démo )-
(En savoir plus ici)
L'idée ici est de superposer un élément sur la flèche déroulante native (pour créer notre élément personnalisé), puis d'interdire les événements de pointeur dessus.
Avantage: il fonctionne bien dans WebKit et Gecko. Il a l'air bien aussi (pas d'
option
éléments saillants ).Inconvénient: Internet Explorer (Internet Explorer 10 et versions ultérieures) ne prend pas en charge
pointer-events
, ce qui signifie que vous ne pouvez pas cliquer sur la flèche personnalisée. En outre, un autre inconvénient (évident) de cette méthode est que vous ne pouvez pas cibler votre nouvelle image de flèche avec un effet de survol ou un curseur manuel, car nous venons de désactiver les événements de pointeur sur eux!Cependant, avec cette méthode, vous pouvez utiliser Modernizer ou des commentaires conditionnels pour que Internet Explorer revienne à la flèche intégrée standard.
NB: Étant donné qu'Internet Explorer 10 ne prend
conditional comments
plus en charge : Si vous souhaitez utiliser cette approche, vous devriez probablement utiliser Modernizr . Cependant, il est toujours possible d'exclure le CSS des événements de pointeur d'Internet Explorer 10 avec un hack CSS décrit ici .Afficher l'extrait de code
la source
C'est possible, mais malheureusement surtout dans les navigateurs WebKit dans la mesure où nous, en tant que développeurs, l'exige. Voici l'exemple du style CSS collecté à partir du panneau d'options Chrome via l'inspecteur des outils de développement intégré, amélioré pour correspondre aux propriétés CSS actuellement prises en charge dans la plupart des navigateurs modernes:
Lorsque vous exécutez ce code sur n'importe quelle page d'un navigateur WebKit, il doit modifier l'apparence de la zone de sélection, supprimer la flèche OS standard et ajouter une flèche PNG, mettre un peu d'espacement avant et après l'étiquette, presque tout ce que vous voulez.
La partie la plus importante est la
appearance
propriété, qui modifie le comportement de l'élément.Il fonctionne parfaitement dans presque tous les navigateurs WebKit, y compris les mobiles, bien que Gecko ne supporte pas
appearance
aussi bien que WebKit, semble-t-il.la source
text-indent: 0.01px; text-overflow: "";
cela fonctionnera encore mieuxL'élément de sélection et sa fonction de liste déroulante sont difficiles à styliser.
Les attributs de style pour l'élément sélectionné par Chris Heilmann confirment ce que Ryan Dohery a dit dans un commentaire à la première réponse:
la source
J'ai eu ce problème exact, sauf que je ne pouvais pas utiliser d'images et n'était pas limité par la prise en charge du navigateur. Cela devrait être «selon les spécifications» et avec de la chance commencer à travailler partout éventuellement .
Il utilise des calques d'arrière-plan en couches pour «découper» une flèche déroulante, car les pseudo-éléments ne fonctionneraient pas pour l'élément sélectionné.
Edit: Dans cette version mise à jour, j'utilise des variables CSS et un petit système de thème.
la source
-moz-appearance: none;
La plus grande incohérence que j'ai remarquée lors du style des listes déroulantes est le rendu Safari et Google Chrome (Firefox est entièrement personnalisable via CSS). Après quelques recherches dans les profondeurs obscures d'Internet, je suis tombé sur ce qui suit, qui résout presque complètement mes scrupules avec WebKit:
Correctif pour Safari et Google Chrome :
Cependant, cela supprime la flèche déroulante. Vous pouvez ajouter une flèche déroulante en utilisant une proximité
div
avec un arrière-plan, une marge négative ou absolument positionnée sur la liste déroulante sélectionnée.* Plus d'informations et d'autres variables sont disponibles dans la propriété CSS: -webkit-apparence .
la source
<select>
les balises peuvent être stylisées via CSS comme tout autre élément HTML sur une page HTML rendue dans un navigateur. Voici un exemple (trop simple) qui positionnera un élément de sélection sur la page et rendra le texte des options en bleu.Exemple de fichier HTML (selectExample.html):
Exemple de fichier CSS (selectExample.css):
la source
Le billet de blog Comment créer un formulaire déroulant CSS, aucun JavaScript ne fonctionne pour moi, mais il échoue dans Opera cependant:
la source
Voici une version qui fonctionne dans tous les navigateurs modernes. La clé utilise
appearance:none
ce qui supprime la mise en forme par défaut. Puisque tout le formatage a disparu, vous devez ajouter de nouveau dans la flèche qui différencie visuellement la sélection de l'entrée.Exemple de travail: https://jsfiddle.net/gs2q1c7p/
la source
Je suis arrivé à votre cas en utilisant Bootstrap . C'est la solution la plus simple qui fonctionne:
Remarque: le truc base64 est
fa-chevron-down
en SVG.la source
Dans les navigateurs modernes, le style
<select>
CSS est relativement indolore . Avecappearance: none
la seule partie délicate est de remplacer la flèche (si c'est ce que vous voulez). Voici une solution qui utilise undata:
URI en ligne avec SVG en texte brut:Le reste du style (bordures, rembourrage, couleurs, etc.) est assez simple.
Cela fonctionne dans tous les navigateurs que je viens d'essayer (Firefox 50, Chrome 55, Edge 38 et Safari 10). Une remarque à propos de Firefox est que si vous souhaitez utiliser le
#
caractère dans l'URI de données (par exemplefill: #000
), vous devez l'échapper (fill: %23000
).la source
height
et / ouwidth
sur la<svg>
balise, au lieu de la propriété CSSbackground-size
.la source
Sélectionner des styles CSS personnalisés
Testé dans Internet Explorer (10 et 11), Edge, Firefox et Chrome
la source
background-position: right 15px center, right 10px center;
Utilisez la
clip
propriété pour rogner les bordures et la flèche de l'select
élément, puis ajoutez vos propres styles de remplacement au wrapper:Utilisez une seconde sélection avec une opacité nulle pour rendre le bouton cliquable:
Les coordonnées diffèrent entre Webkit et les autres navigateurs, mais une requête @media peut couvrir cela.
Références
la source
Un très bel exemple qui utilise
:after
et:before
pour faire l'astuce est dans Styling Select Box avec CSS3 | CSSDeckla source
Modifier cet élément n'est pas recommandé, mais si vous voulez l'essayer, c'est comme n'importe quel autre élément HTML.
Modifier l'exemple:
la source
Cela utilise une couleur d'arrière-plan pour certains éléments et j'ai supprimé l'image.
la source
Oui. Vous pouvez styliser n'importe quel élément HTML par son nom de balise, comme ceci:
Bien sûr, vous pouvez également utiliser une classe CSS pour la styliser, comme tout autre élément:
la source
Voici une solution basée sur mes idées préférées de cette discussion. Cela permet de styliser un élément <select> directement sans aucun balisage supplémentaire.
Il fonctionne avec Internet Explorer 10 (et versions ultérieures) avec une solution de secours sûre pour Internet Explorer 8/9. Une mise en garde pour ces navigateurs est que l'image d'arrière-plan doit être positionnée et suffisamment petite pour se cacher derrière le contrôle d'extension natif.
HTML
SCSS
CodePen
http://codepen.io/ralgh/pen/gpgbGx
la source
À partir d'Internet Explorer 10, vous pouvez utiliser le
::-ms-expand
sélecteur de pseudo-élément pour styliser et masquer l'élément de flèche déroulante.Le style restant devrait être similaire à celui d'autres navigateurs.
Voici un fork de base de jsfiddle de Danield qui applique le support pour IE10
la source
Il existe un moyen simple.
Vérifiez ce violon, et pardonnez-moi le sur-style: https://jsfiddle.net/dkellner/7ac9us70/
L'astuce derrière: dès que la balise <select> obtient une propriété appelée "taille", elle se comportera comme une liste à hauteur fixe, et, tout à coup, pour une raison quelconque, vous permet de créer un style d'enfer. À proprement parler, la liste fixe est un effet secondaire - mais elle nous aide simplement davantage car nous l'utilisons pour le "look déroulant".
Un exemple minimal:
(pour faire simple, je l'ai fait avec jQuery - mais vous pouvez faire la même chose sans)
Notes annexes
Cette solution vous offre plus qu'un simple choix: la valeur est également modifiable manuellement. Utilisez la propriété en lecture seule si vous préférez la méthode restreinte par sélection par défaut.
Pour maximiser les possibilités de style, les balises <optgroup> ne sont pas autour de leurs enfants, elles sont déplacées devant eux. C'est intentionnel, c'est plus clair visuellement, et ils sont heureux de travailler comme ça, ne vous inquiétez pas.
Javascripts: oui je sais que l'OP a dit "pas de Javascript" mais je l'ai compris car s'il vous plaît ne vous embêtez pas avec les plugins , ce qui est bien. Vous n'avez besoin d'aucune bibliothèque pour celle-ci. Pas même jQuery, comme je l'ai dit, c'est uniquement pour la clarté de l'exemple.
la source
Vous devriez certainement le faire comme dans Styling select, optgroup et options avec CSS . À bien des égards, la couleur d'arrière-plan et la couleur sont exactement ce dont vous auriez généralement besoin pour styliser les options, pas la sélection entière.
la source
Vous pouvez également ajouter un style de survol à la liste déroulante.
la source
La troisième méthode dans la réponse de Danield peut être améliorée pour fonctionner avec les effets de et d'autres événements de souris. Assurez-vous simplement que l'élément "bouton" vient juste après l'élément de sélection dans le balisage. Puis ciblez-le en utilisant le sélecteur + CSS:
HTML:
CSS:
Cela montrera cependant l'effet de survol lorsque vous survolerez n'importe où sur l'élément de sélection, pas seulement sur le "bouton".
J'utilise cette méthode en combinaison avec Angular (puisque mon projet se trouve être une application Angular de toute façon), pour couvrir tout l'élément de sélection, et laisser Angular afficher le texte de l'option sélectionnée dans l'élément "bouton". Dans ce cas, il est parfaitement logique que l'effet de survol s'applique lorsque vous survolez n'importe où sur la sélection.
Cependant, cela ne fonctionne pas sans JavaScript, donc si vous voulez le faire, et votre site doit fonctionner sans JavaScript, vous devez vous assurer que votre script ajoute les éléments et les classes nécessaires à l'amélioration. De cette façon, un navigateur sans JavaScript obtiendra simplement une sélection normale, sans style, au lieu d'un badge de style qui ne se met pas à jour correctement.
la source
Une solution CSS et HTML uniquement
Il semble compatible avec Chrome, Firefox et Internet Explorer 11. Mais veuillez laisser vos commentaires concernant les autres navigateurs Web.
Comme suggéré par la réponse de Danield, j'emballe ma sélection dans un div (même deux div pour la compatibilité avec x-browser) pour obtenir le comportement attendu.
Voir http://jsfiddle.net/bjap2/
HTML:
Remarquez les deux enveloppes div.
Notez également le div supplémentaire ajouté pour placer le bouton fléché vers le bas où vous le souhaitez (positionné absolument), nous le mettons ici à gauche.
CSS
la source