Voici trois solutions :
Solution #1 - appearance : none - avec la solution de contournement d'Internet Explorer 10 - 11 ( Démo )
--
Pour masquer le jeu de flèches par défaut appearance: none
sur l'élément de sélection, puis ajoutez votre propre flèche personnalisée avec background-image
select {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none; /* Remove default arrow */
background-image: url(...); /* Add custom arrow */
}
Support des navigateurs :
appearance: none
offre un très bon support pour les navigateurs ( caniuse ) - sauf pour Internet Explorer.
Nous pouvons améliorer cette technique et ajouter le support pour Internet Explorer 10 et Internet Explorer 11 en ajoutant
select::-ms-expand {
display: none; /* Hide the default arrow in Internet Explorer 10 and Internet Explorer 11 */
}
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 Internet Explorer 9 funky.
Pour au moins annuler notre flèche personnalisée - en laissant intacte la flèche de sélection par défaut.
/* Target Internet Explorer 9 to undo the custom arrow */
@media screen and (min-width:0\0) {
select {
background-image:none\9;
padding: 5px\9;
}
}
Tous ensemble :
select {
margin: 50px;
width: 150px;
padding: 5px 35px 5px 5px;
font-size: 16px;
border: 1px solid #CCC;
height: 34px;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background: url(https://stackoverflow.com/favicon.ico) 96% / 15% no-repeat #EEE;
}
/* CAUTION: Internet Explorer hackery ahead */
select::-ms-expand {
display: none; /* Remove default arrow in Internet Explorer 10 and 11 */
}
/* Target Internet Explorer 9 to undo the custom arrow */
@media screen and (min-width:0\0) {
select {
background: none\9;
padding: 5px\9;
}
}
<select>
<option>Apples</option>
<option selected>Pineapples</option>
<option>Chocklate</option>
<option>Pancakes</option>
</select>
Cette solution est facile et bénéficie d'une bonne prise en charge par les navigateurs - elle devrait généralement suffire.
Si la prise en charge du navigateur Internet Explorer est nécessaire, lisez ce qui suit.
Solution n°2 : tronquez l'élément de sélection pour masquer la flèche par défaut ( Démonstration )
--
(Lire la suite ici)
Enveloppez le select
dans un div avec un largeur fixe et overflow:hidden
.
Ensuite, donnez le select
élément d'une largeur d'environ 20 pixels de plus que le div .
Le résultat est que la flèche déroulante par défaut de l'option select
sera masqué (en raison de l'élément overflow:hidden
sur le conteneur), et vous pouvez placer l'image d'arrière-plan de votre choix sur le côté droit de la division.
Le site avantage de cette approche est qu'elle est multi-navigateurs (Internet Explorer 8 et plus), WebKit et Gecko ). Cependant, le désavantage de cette approche est que la liste déroulante des options dépasse sur le côté droit (de 20 pixels que nous avons cachés... parce que 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 éléments suivants mobile le problème ci-dessus ne se pose pas, car chaque téléphone ouvre l'élément de sélection de manière native. Donc, pour les mobiles, c'est peut-être la meilleure solution].
.styled select {
background: transparent;
width: 150px;
font-size: 16px;
border: 1px solid #CCC;
height: 34px;
}
.styled {
margin: 50px;
width: 120px;
height: 34px;
border: 1px solid #111;
border-radius: 3px;
overflow: hidden;
background: url(https://stackoverflow.com/favicon.ico) 96% / 20% no-repeat #EEE;
}
<div class="styled">
<select>
<option>Pineapples</option>
<option selected>Apples</option>
<option>Chocklate</option>
<option>Pancakes</option>
</select>
</div>
Si la flèche personnalisée est nécessaire sur Firefox - avant le Version 35 - mais vous n'avez pas besoin de prendre en charge les anciennes versions d'Internet Explorer - alors continuez à lire...
Solution n° 3 - Utilisez le pointer-events
propriété ( Démonstration )
--
(Lire la suite ici)
L'idée ici est de superposer un élément sur la flèche déroulante native (pour créer notre flèche personnalisée) et d'interdire les événements de pointeur sur celle-ci.
Avantage : Il fonctionne bien dans WebKit et Gecko. Il est également très esthétique (pas de saillies). option
éléments).
Inconvénient : Internet Explorer (Internet Explorer 10 et inférieur) 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 !
Toutefois, avec cette méthode, vous pouvez utiliser Modernizer ou des commentaires conditionnels pour qu'Internet Explorer revienne à la flèche standard intégrée.
NB : Étant donné qu'Internet Explorer 10 ne prend pas en charge conditional comments
plus : Si vous voulez utiliser cette approche, vous devriez probablement utiliser Modernizr . Cependant, il est encore possible d'exclure le CSS "pointer-events" d'Internet Explorer 10 avec un hack CSS décrit ici .
.notIE {
position: relative;
display: inline-block;
}
select {
display: inline-block;
height: 30px;
width: 150px;
outline: none;
color: #74646E;
border: 1px solid #C8BFC4;
border-radius: 4px;
box-shadow: inset 1px 1px 2px #DDD8DC;
background: #FFF;
}
/* Select arrow styling */
.notIE .fancyArrow {
width: 23px;
height: 28px;
position: absolute;
display: inline-block;
top: 1px;
right: 3px;
background: url(https://stackoverflow.com/favicon.ico) right / 90% no-repeat #FFF;
pointer-events: none;
}
/*target Internet Explorer 9 and Internet Explorer 10:*/
@media screen and (min-width: 0\0) {
.notIE .fancyArrow {
display: none;
}
}
<!--[if !IE]> -->
<div class="notIE">
<!-- <![endif]-->
<span class="fancyArrow"></span>
<select>
<option>Apples</option>
<option selected>Pineapples</option>
<option>Chocklate</option>
<option>Pancakes</option>
</select>
<!--[if !IE]> -->
</div>
<!-- <![endif]-->
58 votes
Je pense que c'est une question légitime, mais la réponse est "non, pas vraiment" ou "pas comme vous le souhaitez". Mais personne (ni moi) n'en est sûr à 100%, ce sentiment d'ambiguïté s'insinue dans la peau du lecteur et la légitimité de la question est remise en question.
1 votes
@Jitendra, je sais où vous voulez en venir. Nous aimerions que vous rendiez votre question plus explicite. De plus, je pense avoir trouvé ce que vous cherchez. C'est expérimental, mais regardez ça : cappuccino.org/aristo/showcase
1 votes
@jeremyosborne - Merci pour la réponse. Je sais que je peux le faire avec javascript. Votre lien eaxmple est basé sur JS. J'ai posé cette question parce que je voulais savoir si quelqu'un sait ce que l'on peut faire de mieux avec css uniquement.
1 votes
@Jitendra Merci de mettre à jour votre question. Le mieux que vous puissiez faire de manière fiable avec les contraintes dont vous disposez (CSS uniquement et pas de JS) est de modifier la police de caractères, les couleurs d'arrière-plan et de premier plan (texte), la taille des bordures, l'apparence et les couleurs, le placement et la taille (généralement via le paramètre de type via la police). Même dans ce cas, vous devrez probablement procéder à quelques ajustements pour vous assurer que l'apparence est la même dans tous les navigateurs. J'aimerais connaître une meilleure réponse que celle-là, et peut-être en existe-t-il une que j'ai manquée, mais je ne le pense pas.
0 votes
Cette tâche me rappelle étrangement quelque chose de boiteux qu'ils demanderaient dans un entretien FE... mais néanmoins très utile.
0 votes
"Mais personne (ni moi) n'en est sûr à 100%" C'est LA raison pour laquelle cette question est géniale ! Nous devons être sûrs de ce genre de choses. Elles sont fondamentales.