Comment ajouter des images dans la liste de sélection?

150

J'ai une liste restreinte de genres.

Code:

<select>
<option>male</option>
<option>female</option>
<option>others</option>
</select>  

Je veux utiliser une image dans la liste déroulante comme drop-down-icon.jpeg.

Je souhaite ajouter un bouton à la place de l'icône déroulante.

Comment faire ça?

Mayur
la source
51
être plus positif. la communauté de débordement de pile est une communauté conviviale.
Lucas
comme solution générale: si vous le pouvez, rassemblez vos icônes sous forme de SVG, importez-les dans une police de votre choix dans la gamme Unicode personnelle, utilisez cette police dans vos <option>s; pris en charge par tout depuis IE 8.0, petit et simple.

Réponses:

176

Dans Firefox, vous pouvez simplement ajouter une image d'arrière-plan à l'option:

<select>
  <option style="background-image:url(male.png);">male</option>
  <option style="background-image:url(female.png);">female</option>
  <option style="background-image:url(others.png);">others</option>
</select> 

Mieux encore, vous pouvez séparer HTML et CSS comme ça

HTML

<select id="gender">
  <option>male</option>
  <option>female</option>
  <option>others</option>
</select>  

CSS

select#gender option[value="male"]   { background-image:url(male.png);   }
select#gender option[value="female"] { background-image:url(female.png); }
select#gender option[value="others"] { background-image:url(others.png); }

Dans d' autres navigateurs, le seul moyen de le faire serait d'utiliser une bibliothèque de widgets JS, comme par exemple l' interface utilisateur jQuery , par exemple en utilisant Selectable .

Depuis jQuery UI 1.11, le widget Selectmenu est disponible, ce qui est très proche de ce que vous voulez.

vartec
la source
21
Et avez-vous une solution valable pour le W3C en 2015? Sans réimplémenter la boîte de sélection?
Ivan Kuckir
13
Et qu'en 2017? Toujours pas de solution?
laurent
28
@IvanKuckir - Pffff. Le W3C «discute» toujours des raisons pour lesquelles et pourquoi pas cela devrait être fait, et après avoir mis en œuvre une étude sur le sujet, un comité discutera alors des avantages et des inconvénients potentiels de cette possibilité. Une fois cela fait, il y aura une étude de terrain sur la rétrocompatibilité. Ils lanceront ensuite une étude pour les daltoniens. Une fois la recommandation faite, il y aura une étude sur les effets secondaires potentiels sur d'autres éléments (comme la case à cocher). Après tout cela, ils auront une étude pour décider si toutes ces études sont nécessaires.
Greeso
6
Firefox ne prend plus en charge la méthode mentionnée ci-dessus.
Roshana Pitigala
15
presque 2020 et nous sommes encore au Moyen Âge
Noir
27

Ma solution est d'utiliser FontAwesome puis d'ajouter des images de la bibliothèque sous forme de texte! Vous avez juste besoin des Unicodes et ils se trouvent ici: Fichier de référence FontAwesome pour Unicodes

Voici un exemple de filtre d'état:

<select name='state' style='height: 45px; font-family:Arial, FontAwesome;'>
<option value=''>&#xf039; &nbsp; All States</option>
<option value='enabled' style='color:green;'>&#xf00c; &nbsp; Enabled</option>
<option value='paused' style='color:orange;'>&#xf04c; &nbsp; Paused</option>
<option value='archived' style='color:red;'>&#xf023; &nbsp; Archived</option>
</select>

Notez la famille de polices: Arial, FontAwesome; doit être attribué dans le style pour sélectionner comme indiqué dans l'exemple!

Tarik
la source
2
C'est exactement ce que j'essayais de faire! Je ne voulais vraiment pas avoir à implémenter un autre plugin js - c'est donc parfait puisque j'utilise déjà les icônes FontAwesome sur mon site Web.
Purple Lady
1
cette solution ne fonctionne pas sur l'option, uniquement lorsqu'elle est sélectionnée (stylo: codepen.io/wtfgraciano/pen/YMwWqK )
graciano
Cela fonctionne mais la fonctionnalité dépend du navigateur. Cela fonctionne bien sur Chrome sous Windows par exemple.
Tarik le
Que voulez-vous dire ajouter des images de la bibliothèque sous forme de texte? Désolé, je ne suis pas tout à fait, cela vous dérange-t-il d'expliquer?
RyanN1220
1
@ RyanN1220 Fontawesome est une bibliothèque contenant des mini images. Et chaque image a un texte Unicode correspondant que vous pouvez appliquer. Voir le lien dans la réponse pour le code de texte. ( fontawesome.com/cheatsheet?from=io#social-buttons ) Rien de spécial, suivez simplement l'exemple dans la réponse et vous devriez être prêt à partir.
Tarik
26

Vous pouvez utiliser iconselect.js; Sélection d'icône / image (liste déroulante, liste déroulante)

Démo et téléchargement; http://bug7a.github.io/iconselect.js/

entrez la description de l'image ici

Utilisation HTML;

<div id="my-icon-select"></div>

Utilisation de Javascript;

    var iconSelect;

    window.onload = function(){

        iconSelect = new IconSelect("my-icon-select");

        var icons = [];
        icons.push({'iconFilePath':'images/icons/1.png', 'iconValue':'1'});
        icons.push({'iconFilePath':'images/icons/2.png', 'iconValue':'2'});
        icons.push({'iconFilePath':'images/icons/3.png', 'iconValue':'3'});

        iconSelect.refresh(icons);

    };
bugra ozden
la source
30
Ce plugin a la plus étrange "exigence" que j'aie jamais vue; Le CSS et la fonctionnalité de défilement sont interrompus si vous avez <!doctype html>défini.
Digital Ninja
23

Vous avez déjà plusieurs réponses qui suggèrent d'utiliser JavaScript / jQuery. Je vais ajouter une alternative qui n'utilise que HTML et CSS sans aucun JS.

L'idée de base est d'utiliser un ensemble de boutons radio et d'étiquettes (qui activeront / désactiveront les boutons radio), et avec le contrôle CSS que seule l'étiquette associée au bouton radio sélectionné sera affichée. Si vous souhaitez autoriser la sélection de plusieurs valeurs, vous pouvez y parvenir en utilisant des cases à cocher au lieu de boutons radio.

Voici un exemple. Le code peut être un peu plus compliqué (spécialement comparé aux autres solutions):

.select-sim {
  width:200px;
  height:22px;
  line-height:22px;
  vertical-align:middle;
  position:relative;
  background:white;
  border:1px solid #ccc;
  overflow:hidden;
}

.select-sim::after {
  content:"▼";
  font-size:0.5em;
  font-family:arial;
  position:absolute;
  top:50%;
  right:5px;
  transform:translate(0, -50%);
}

.select-sim:hover::after {
  content:"";
}

.select-sim:hover {
  overflow:visible;
}

.select-sim:hover .options .option label {
  display:inline-block;
}

.select-sim:hover .options {
  background:white;
  border:1px solid #ccc;
  position:absolute;
  top:-1px;
  left:-1px;
  width:100%;
  height:88px;
  overflow-y:scroll;
}

.select-sim .options .option {
  overflow:hidden;
}

.select-sim:hover .options .option {
  height:22px;
  overflow:hidden;
}

.select-sim .options .option img {
  vertical-align:middle;
}

.select-sim .options .option label {
  display:none;
}

.select-sim .options .option input {
  width:0;
  height:0;
  overflow:hidden;
  margin:0;
  padding:0;
  float:left;
  display:inline-block;
  /* fix specific for Firefox */
  position: absolute;
  left: -10000px;
}

.select-sim .options .option input:checked + label {
  display:block;
  width:100%;
}

.select-sim:hover .options .option input + label {
  display:block;
}

.select-sim:hover .options .option input:checked + label {
  background:#fffff0;
}
<div class="select-sim" id="select-color">
  <div class="options">
    <div class="option">
      <input type="radio" name="color" value="" id="color-" checked />
      <label for="color-">
        <img src="http://placehold.it/22/ffffff/ffffff" alt="" /> Select an option
      </label>
    </div>
    <div class="option">
      <input type="radio" name="color" value="red" id="color-red" />
      <label for="color-red">
        <img src="http://placehold.it/22/ff0000/ffffff" alt="" /> Red
      </label>
    </div>
    <div class="option">
      <input type="radio" name="color" value="green" id="color-green" />
      <label for="color-green">
        <img src="http://placehold.it/22/00ff00/ffffff" alt="" /> Green
      </label>
    </div>
    <div class="option">
      <input type="radio" name="color" value="blue" id="color-blue" />
      <label for="color-blue">
        <img src="http://placehold.it/22/0000ff/ffffff" alt="" /> Blue
      </label>
    </div>
    <div class="option">
      <input type="radio" name="color" value="yellow" id="color-yellow" />
      <label for="color-yellow">
        <img src="http://placehold.it/22/ffff00/ffffff" alt="" /> Yellow
      </label>
    </div>
    <div class="option">
      <input type="radio" name="color" value="pink" id="color-pink" />
      <label for="color-pink">
        <img src="http://placehold.it/22/ff00ff/ffffff" alt="" /> Pink
      </label>
    </div>
    <div class="option">
      <input type="radio" name="color" value="turquoise" id="color-turquoise" />
      <label for="color-turquoise">
        <img src="http://placehold.it/22/00ffff/ffffff" alt="" /> Turquoise
      </label>
    </div>
  </div>
</div>

Alvaro Montoro
la source
3
Besoin de déplacer la souris pour qu'elle s'effondre. Cela peut-il être fait par clic et non par survol / déplacement de la souris? Cela fonctionnerait-il sur les appareils mobiles / non souris?
tgkprog
17

Une autre solution jQuery cross-browser pour ce problème est http://designwithpc.com/Plugins/ddSlick qui est fait exactement pour cette utilisation.

jerrygarciuh
la source
2
la démo vue ne fonctionne pas sur mon ordinateur (Linux Mint + Firefox 44)
RousseauAlexandre
@RousseauAlexandre vérifiant la console sur cet autre site, je vois 403 erreurs pour le contenu de l'auteur. Je lui ai envoyé un message à ce sujet car se plaindre ici ne servira à rien.
jerrygarciuh
vous avez raison, j'ai une erreur my.hellobar.com/45874_63207.js introuvable et puis TypeError: $(...).ddslickn'est pas une fonction dans la console de Firefox
RousseauAlexandre
1
Un simple lien vers une bibliothèque n'est pas une bonne réponse. Un lien vers celui-ci, en expliquant pourquoi il résout le problème et en fournissant du code à l'aide de la bibliothèque pour ce faire permet une meilleure réponse. Voir: Comment puis-je créer un lien vers une ressource externe de manière conviviale pour la communauté?
Kevin Brown
12

Avec les pays, les langues ou les devises, vous pouvez utiliser des émojis.

Fonctionne avec à peu près tous les navigateurs / systèmes d'exploitation prenant en charge l'utilisation des emojis.

select {
 height: 50px;
 line-height: 50px;
 font-size: 12pt;
}
<select name="countries">
    <option value="NL">🇳🇱&emsp;Netherlands</option>
    <option value="DE">🇩🇪&emsp;Germany</option>
    <option value="FR">🇫🇷&emsp;France</option>
    <option value="ES">🇪🇸&emsp;Spain</option>
</select>

<br /><br />

<select name="currency">
    <option value="EUR">🇪🇺&emsp;€&emsp;EUR&emsp;💶</option>
    <option value="GBP">🇬🇧&emsp;£&emsp;GBP&emsp;💷</option>
    <option value="USD">🇺🇸&emsp;$&emsp;USD&emsp;💵</option>
    <option value="YEN">🇯🇵&emsp;¥&emsp;YEN&emsp;💴</option>
</select>

Tim
la source
6
"Fonctionne avec à peu près tous les navigateurs / OS prenant en charge l'utilisation des emojis" .... sauf que Windows ne prend pas en charge les indicateurs emoji.
skomisa
... et Google Chrome non plus, même en dehors de Windows :(
Piskvor a quitté le bâtiment
2

Pour une image à deux couleurs, vous pouvez utiliser Fontello et importer tout glyphe personnalisé que vous souhaitez utiliser. Créez simplement votre image dans Illustrator, enregistrez-la au format SVG et déposez-la sur le site Fontello, puis téléchargez votre police personnalisée prête à être importée. Pas de JavaScript!

BBaysinger
la source
1

J'ai essayé plusieurs sélections personnalisées basées sur jquery avec des images, mais aucune ne fonctionnait dans des mises en page réactives. Enfin, je suis tombé sur Bootstrap-Select. Après quelques modifications, j'ai pu produire ce code.

Code et dépôt github ici

entrez la description de l'image ici

aslam parvaiz
la source
12
Un simple lien vers une bibliothèque n'est pas une bonne réponse. Lier à lui, expliquer pourquoi il résout le problème et fournir du code en utilisant la bibliothèque pour le faire permet une meilleure réponse. Voir: Comment puis-je créer un lien vers une ressource externe de manière conviviale pour la communauté?
Kevin Brown
1

Pour ceux qui souhaitent afficher une icône, et acceptant une solution "noir et blanc", une possibilité consiste à utiliser des entités caractères:

   <select>
      <option>100 &euro;</option>
      <option>89 &pound;</option>
    </select>

Par extension, vos icônes peuvent être stockées dans une police personnalisée. Voici un exemple utilisant la police FontAwesome : https://jsfiddle.net/14606fv9/2/ https://jsfiddle.net/14606fv9/2/

L'un des avantages est qu'il ne nécessite aucun Javascript. Cependant, faites attention au fait que le chargement de la police complète ne ralentit pas le chargement de votre page.

Nota bene: La solution d'utiliser une image de fond ne semble plus fonctionner sous Firefox (du moins en version 57 "Quantum"):

<select>
  <option style="background-image:url(euro.png);">100</option>
  <option style="background-image:url(pound.png);">89</option>
</select>
OuzoPower
la source
1

Réponse gratuite Alvaros JS été un bon début pour moi, et j'ai vraiment essayé d'obtenir une réponse vraiment sans JS qui fournissait toujours toutes les fonctionnalités attendues d'un Select avec des images, mais malheureusement, l'imbrication des formulaires a été la chute. Je poste deux solutions ici; ma solution principale qui utilise 1 ligne de JavaScript, et une solution totalement sans JavaScript qui ne fonctionnera pas dans un autre formulaire, mais pourrait être utile pour les menus de navigation.

Malheureusement, il y a un peu de répétition dans le code, mais quand vous pensez à ce qu'est un Select, cela a du sens. Lorsque vous cliquez sur une option, il copie ce texte dans la zone sélectionnée, c'est-à-dire que cliquer sur 1 des 4 options ne changera pas les 4 options, mais le haut répètera maintenant celle sur laquelle vous avez cliqué. Pour ce faire avec des images, il faudrait JavaScript, orrrr ... vous dupliquez les entrées.

Dans mon exemple, nous avons une liste de jeux (Produits), qui ont des versions. Chaque produit peut également avoir des extensions, qui peuvent également avoir des versions. Pour chaque produit, nous donnons à l'utilisateur une liste de chaque version s'il y en a plus d'une, avec une image et un texte spécifique à la version.

<h4>@Model.Name</h4>
@if (Model.Versions.Count == 1)
{
    <div class="rich-select-option-body pl-2">
        <img src="@Model.Versions[0].ImageUrl" alt="">@Model.Versions[0].VersionName (@Model.Versions[0].Year)
    </div>
}
else
{
    <h5>Select the version</h5>
    <div class="rich-select custom-select">
        <div class="rich-select-dropdown">
            @foreach (var version in Model.Versions)
            {
                <div class="rich-select-option">
                    <input type="radio" name="game" id="[email protected]@version.VersionId" @if (version == Model.Versions.First()) { @Html.Raw(" checked") ; } />
                    <div class="rich-select-option-body">
                        <label tabindex="-1">
                            <img src="@version.ImageUrl" alt="">@version.VersionName (@version.Year)
                        </label>
                    </div>
                </div>
            }
        </div>
        <input type="checkbox" id="rich-select-dropdown-button" class="rich-select-dropdown-button" />
        <label for="rich-select-dropdown-button"></label>
        <div class="rich-select-options">
            @foreach (var version in Model.Versions)
            {
                <div class="rich-select-option">
                    <div class="rich-select-option-body">
                        <label for="[email protected]@version.VersionId" tabindex="-1" onclick="document.getElementById('rich-select-dropdown-button').click();">
                            <img src="@version.ImageUrl" alt=""> @version.VersionName (@version.Year)
                        </label>
                    </div>
                </div>
            }
        </div>
    </div>
}

En utilisant JS pour la désélection de la case à cocher, nous pouvons avoir plusieurs instances sur un formulaire. Ici, j'ai étendu pour afficher une liste d'extensions, qui ont également la même logique autour des versions.

<h5 class="mt-3">Include Expansions?</h5>
@foreach (var expansion in Model.Expansions)
{
    <div class="form-row">
        <div class="custom-control custom-checkbox w-100">
            <input type="checkbox" class="expansion-checkbox custom-control-input" id="[email protected]">
            <label class="custom-control-label w-100" for="[email protected]">

                @if (expansion.Versions.Count == 1)
                {
                    <div class="rich-select-option-body pl-2">
                        <img src="@expansion.ImageUrl" />@expansion.Name: @expansion.Versions[0].VersionName (@expansion.Versions[0].Year)
                    </div>
                }
                else
                {
                    <div class="rich-select custom-select">
                        <div class="rich-select-dropdown">
                            @foreach (var version in expansion.Versions)
                            {
                                <div class="rich-select-option">
                                    <input type="radio" name="[email protected]" id="[email protected]@version.VersionId" @if (version == expansion.Versions.First()) { @Html.Raw(" checked") ; } />
                                    <div class="rich-select-option-body">
                                        <label tabindex="-1">
                                            <img src="@version.ImageUrl" alt="">@expansion.Name: @version.VersionName (@version.Year)
                                        </label>
                                    </div>
                                </div>
                            }
                        </div>

                        <input type="checkbox" id="[email protected]" class="rich-select-dropdown-button" />
                        <label for="[email protected]"></label>
                        <div class="rich-select-options">
                            @foreach (var version in expansion.Versions)
                            {
                                <div class="rich-select-option">
                                    <div class="rich-select-option-body">
                                        <label for="[email protected]@version.VersionId" tabindex="-1" onclick="document.getElementById('[email protected]').click();">
                                            <img src="@version.ImageUrl" alt="">@expansion.Name: @version.VersionName (@version.Year)
                                        </label>
                                    </div>
                                </div>
                            }
                        </div>
                    </div>
                }
            </label>
        </div>
    </div>

Bien sûr, cela nécessite un peu de CSS, que je n'ai inclus dans ce JSFiddle que pour réduire la taille de cette réponse déjà massive. J'ai utilisé Bootstrap 4 pour réduire la quantité nécessaire et pour lui permettre de s'intégrer avec d'autres contrôles Bootstrap et toutes les personnalisations de site qui ont été effectuées.

Les images sont réglées à 75px, mais cela peut facilement être changé en 5 lignes dans .rich-selectet.rich-select-option-body img

rouge
la source
0

J'ai eu le même problème. Ma solution était un foreach de boutons radio, avec l'image à droite de celui-ci. Puisque vous ne pouvez choisir qu'une seule option à la radio, cela fonctionne (comme) une sélection.

Travaillez bien pour moi. J'espère que cela peut aider quelqu'un d'autre.

Luan Persini
la source
1
a <select>n'est pas nécessairement pour sélectionner une seule valeur
npup
0

Cela utilise ms-Dropdown: https://github.com/marghoobsuleman/ms-Dropdown

La ressource de données est json. Mais vous n'avez pas besoin d'utiliser json. Si vous le souhaitez, vous pouvez utiliser avec css.

Exemple CSS: https://github.com/marghoobsuleman/ms-Dropdown/tree/master/examples

Exemple Json: http://jsfiddle.net/tcibikci/w3rdhj4s/6

HTML

<div id="byjson"></div>

Scénario

<script>
        var jsonData = [
            {description:'Choos your payment gateway', value:'', text:'Payment Gateway'},
            {image:'https://via.placeholder.com/50', description:'My life. My card...', value:'amex', text:'Amex'},
            {image:'https://via.placeholder.com/50', description:'It pays to Discover...', value:'Discover', text:'Discover'},
            {image:'https://via.placeholder.com/50', title:'For everything else...', description:'For everything else...', value:'Mastercard', text:'Mastercard'},
            {image:'https://via.placeholder.com/50', description:'Sorry not available...', value:'cash', text:'Cash on devlivery', disabled:true},
            {image:'https://via.placeholder.com/50', description:'All you need...', value:'Visa', text:'Visa'},
            {image:'https://via.placeholder.com/50', description:'Pay and get paid...', value:'Paypal', text:'Paypal'}
        ];
        $("#byjson").msDropDown({byJson:{data:jsonData, name:'payments2'}}).data("dd");
    }
</script>
Tolga
la source
-8

MISE À JOUR: À partir de 2018, cela semble fonctionner maintenant. Testé dans Chrome, Firefox, IE et Edge

<!DOCTYPE html>
<html>
<body>

<style>
select#newlocale option[value="volvo"]   { background-color: powderblue;   }
select#newlocale option[value="opel"]   { background-color: red;   }
select#newlocale option[value="audi"]   { background-color: green;   }
</style> 

<select id="newlocale">
  <option value="volvo"><div >Volvo</div></option>
  <option value="saab">Saab</option>
  <option value="opel">Opel</option>
  <option value="audi">Audi</option>
</select>

</body>
</html>
Jon
la source
1
Où est l'image?
BBaysinger
2
Je changeais la couleur d'arrière-plan au lieu de l'image dans mon exemple, mais la sélection de style prouve toujours le point.
Jon le
4
Cette réponse ne répond pas du tout à la question réelle ( "Comment ajouter des images dans la liste de sélection?" ).
skomisa
1
C'est suffisant. Je ne l'ai pas testé avec des images, je voulais appliquer du style, c'est ainsi que je me suis retrouvé à cette question. J'ai supposé que {background-image: url (euro.png);} pouvait être remplacé par {background-color: green; } dans mon exemple. Je ne suis pas enclin à revenir en arrière et à le tester.
Jon
ne répond pas du tout à la question initiale.
staggart