Come aggiungere immagini nella lista selezionata?


150

Ho un elenco selezionato di generi.

Codice:

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

Voglio usare un'immagine nell'elenco a discesa come drop-down-icon.jpeg.

Voglio aggiungere un pulsante al posto dell'icona a discesa.

Come farlo?



51
sii più positivo. la comunità di overflow dello stack è amichevole.
Lucas,

come soluzione generale: se puoi, unisci le tue icone come SVG, importale in un font a tua scelta nell'intervallo Unicode personale, usa quel font nei tuoi <option>; supportato da tutto, da IE 8.0, piccolo e semplice.

Risposte:


176

In Firefox puoi semplicemente aggiungere l'immagine di sfondo all'opzione:

<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> 

Meglio ancora, puoi separare HTML e CSS in questo modo

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); }

In altri browser, l'unico modo per farlo sarebbe utilizzare una libreria di widget JS, come ad esempio l' interfaccia utente di jQuery , ad esempio utilizzando Selectable .

Dall'interfaccia utente 1.11 di jQuery è disponibile il widget Selectmenu , che è molto vicino a ciò che si desidera.


21
E hai qualche soluzione valida per W3C nel 2015? Senza implementare nuovamente la casella di selezione?
Ivan Kuckir,

13
Che ne dici di nel 2017? Ancora nessuna soluzione?
laurent,

28
@IvanKuckir - Pffff. Il W3C sta ancora "discutendo" i motivi per cui e perché non ciò dovrebbe essere fatto, e dopo aver implementato uno studio sull'argomento, un comitato discuterà quindi i potenziali vantaggi e svantaggi di abilitarlo. Una volta fatto, ci sarà uno studio sul campo sulla compatibilità con le versioni precedenti. Quindi schiaffeggeranno uno studio per i non vedenti. Una volta formulata la raccomandazione, ci sarà uno studio sui potenziali effetti collaterali su altri elementi (come la casella di controllo). Dopo tutto ciò, avranno uno studio per decidere se tutti quegli studi dove necessario.
Greeso,

6
Firefox non supporta più il metodo sopra menzionato.
Roshana Pitigala,

15
quasi il 2020 e siamo ancora nel Medioevo
Nero,

27

La mia soluzione è usare FontAwesome e quindi aggiungere immagini di libreria come testo! Hai solo bisogno degli Unicode e si trovano qui: FontAwesome File di riferimento per Unicode

Ecco un esempio di filtro di stato:

<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>

Nota la famiglia di caratteri: Arial, FontAwesome; deve essere assegnato in stile per selezionare come indicato nell'esempio!


2
Questo è esattamente quello che stavo cercando di fare! Non volevo davvero dover implementare un altro plugin js - quindi questo è perfetto poiché sto già usando le icone FontAwesome nel mio sito web.
Purple Lady,

1
questa soluzione non funziona sull'opzione, solo se selezionata (penna: codepen.io/wtfgraciano/pen/YMwWqK )
graciano,

Funziona ma la funzione dipende dal browser. Funziona bene su Chrome in Windows, ad esempio.
Tarik,

Cosa intendi per aggiungere immagini di libreria come testo? Scusa se non ti seguo abbastanza, ti dispiace spiegare?
RyanN1220,

1
@ RyanN1220 Fontawesome è una libreria con mini immagini. E ogni immagine ha un corrispondente testo Unicode che puoi applicare. Vedi il link nella risposta per il codice di testo. ( fontawesome.com/cheatsheet?from=io#social-buttons ) Niente di speciale, basta seguire l'esempio nella risposta e dovresti essere pronto per partire.
Tarik,

26

È possibile utilizzare iconselect.js; Selezione icona / immagine (casella combinata, menu a discesa)

Demo e download; http://bug7a.github.io/iconselect.js/

inserisci qui la descrizione dell'immagine

Utilizzo HTML;

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

Utilizzo di 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);

    };

30
Questo plugin ha il "requisito" più strano che abbia mai visto; Il CSS e la funzionalità di scorrimento si interrompono se sono stati <!doctype html>definiti.
Digital Ninja

23

Hai già diverse risposte che suggeriscono di utilizzare JavaScript / jQuery. Ho intenzione di aggiungere un'alternativa che utilizza solo HTML e CSS senza alcun JS.

L'idea di base è quella di utilizzare una serie di pulsanti di opzione ed etichette (che attiveranno / disattiveranno i pulsanti di opzione) e con il controllo CSS che verrà visualizzata solo l'etichetta associata al pulsante di opzione selezionato. Se si desidera consentire la selezione di più valori, è possibile ottenerlo utilizzando le caselle di controllo anziché i pulsanti di opzione.

Ecco un esempio Il codice potrebbe essere un po 'più complicato (specialmente rispetto alle altre soluzioni):

.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>


3
È necessario spostare il mouse per farlo crollare. Può essere fatto con un clic e non con il mouse / sposta il mouse? Funzionerebbe su dispositivi mobili / non mouse?
tgkprog,

17

Un'altra soluzione cross-browser jQuery per questo problema è http://designwithpc.com/Plugins/ddSlick, creata appositamente per questo uso.


2
la demo vista non funziona sul mio computer (Linux Mint + Firefox 44)
RousseauAlexandre

@RousseauAlexandre controllando la console su quell'altro sito vedo 403 errori per il contenuto dell'autore. Gli ho inviato un messaggio a riguardo poiché lamentarsi qui non farà nulla di buono.
jerrygarciuh,

hai ragione, ho ottenuto un errore my.hellobar.com/45874_63207.js non trovato e quindi TypeError: $(...).ddslicknon è una funzione nella console di Firefox
RousseauAlexandre

1
Il semplice collegamento a una libreria non è una buona risposta. Collegarsi ad esso, spiegare perché risolve il problema e fornire codice utilizzando la libreria per farlo rende una risposta migliore. Vedi: Come posso collegarmi a una risorsa esterna in modo favorevole alla comunità?
Kevin Brown,

12

Con paesi, lingue o valuta puoi usare emoji.

Funziona praticamente con tutti i browser / sistemi operativi che supportano l'uso di emoji.

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>


6
"Funziona praticamente con tutti i browser / sistemi operativi che supportano l'uso di emoji" .... tranne per il fatto che Windows non supporta i flag di emoji.
skomisa,

... e nemmeno Google Chrome, anche al di fuori di Windows :(
Piskvor ha lasciato l'edificio il

2

Per un'immagine a due colori, è possibile utilizzare Fontello e importare qualsiasi glifo personalizzato che si desidera utilizzare. Basta creare la tua immagine in Illustrator, salvarla in SVG e rilasciarla sul sito Fontello, quindi scaricare il font personalizzato pronto per l'importazione. Nessun JavaScript!


1

Ho provato diverse selezioni personalizzate basate su jquery con immagini, ma nessuna ha funzionato in layout reattivi. Finalmente sono arrivato attraverso Bootstrap-Select. Dopo alcune modifiche sono stato in grado di produrre questo codice.

Codice e repository github qui

inserisci qui la descrizione dell'immagine


12
Il semplice collegamento a una libreria non è una buona risposta. Collegarsi ad esso, spiegare perché risolve il problema e fornire codice utilizzando la libreria per farlo rende una risposta migliore. Vedi: Come posso collegarmi a una risorsa esterna in modo favorevole alla comunità?
Kevin Brown,

1

Per coloro che desiderano visualizzare un'icona e accettare una soluzione "in bianco e nero", una possibilità è l'utilizzo di entità personaggio:

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

Per estensione, le tue icone possono essere memorizzate in un carattere personalizzato. Ecco un esempio usando il font FontAwesome : https://jsfiddle.net/14606fv9/2/ https://jsfiddle.net/14606fv9/2/

Un vantaggio è che non richiede Javascript. Tuttavia, fai attenzione che il caricamento del carattere completo non rallenta il caricamento della tua pagina.

Nota bene: la soluzione di utilizzare un'immagine di sfondo non sembra funzionare più in Firefox (almeno nella versione 57 "Quantum"):

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

1

La risposta gratuita di Alvaros JS è stata un ottimo inizio per me, e ho davvero cercato di ottenere una risposta davvero priva di JS che offrisse comunque tutte le funzionalità che ci si aspettava da un Select con immagini, ma i moduli tristemente nidificati sono stati la caduta. Sto pubblicando due soluzioni qui; la mia soluzione principale che utilizza 1 riga di JavaScript e una soluzione totalmente priva di JavaScript che non funzionerà all'interno di un altro modulo, ma potrebbe essere utile per i menu di navigazione.

Sfortunatamente c'è un po 'di ripetizione nel codice, ma quando pensi a cosa fa un Select ha senso. Quando si fa clic su un'opzione, il testo viene copiato nell'area selezionata, ovvero facendo clic su 1 di 4 opzioni non si modificheranno le 4 opzioni, ma la parte superiore ora ripeterà quella su cui si è fatto clic. Per fare questo con le immagini richiederebbe JavaScript, oppure devi duplicare le voci.

Nel mio esempio abbiamo un elenco di giochi (Prodotti), che hanno versioni. Ogni prodotto può anche avere espansioni, che possono anche avere versioni. Per ogni prodotto forniamo all'utente un elenco di ogni versione se ce n'è più di una, insieme a un'immagine e testo specifico della versione.

<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="game-@version.ProductId-@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="game-@version.ProductId-@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>
}

Usando JS per la deselezione della casella possiamo avere più istanze su un modulo. Qui ho esteso per mostrare un elenco di espansioni, che hanno anche la stessa logica attorno alle versioni.

<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="exp-@expansion.ProductId">
            <label class="custom-control-label w-100" for="exp-@expansion.ProductId">

                @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="exp-@version.ProductId" id="exp-@version.ProductId-@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="rich-select-dropdown-button-@expansion.ProductId" class="rich-select-dropdown-button" />
                        <label for="rich-select-dropdown-button-@expansion.ProductId"></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="exp-@version.ProductId-@version.VersionId" tabindex="-1" onclick="document.getElementById('rich-select-dropdown-button-@expansion.ProductId').click();">
                                            <img src="@version.ImageUrl" alt="">@expansion.Name: @version.VersionName (@version.Year)
                                        </label>
                                    </div>
                                </div>
                            }
                        </div>
                    </div>
                }
            </label>
        </div>
    </div>

Naturalmente questo richiede un bel po 'di CSS, che ho incluso solo in questo JSFiddle per ridurre le dimensioni di questa risposta già enorme. Ho usato Bootstrap 4 per ridurre la quantità necessaria e anche per consentirmi di adattarsi con altri controlli Bootstrap e qualsiasi personalizzazione del sito che è stata effettuata.

Le immagini sono impostate su 75px, ma questo può essere facilmente modificato in 5 righe in .rich-selecte.rich-select-option-body img


0

Ho avuto lo stesso problema. La mia soluzione era una foreach di pulsanti di opzione, con l'immagine alla sua destra. Dal momento che puoi scegliere una sola opzione alla radio, funziona (come) una selezione.

Funziona bene per me. Spero che possa aiutare qualcun altro.


1
a <select>non è necessariamente per selezionare un singolo valore
npup

0

Questo utilizza ms-Dropdown: https://github.com/marghoobsuleman/ms-Dropdown

La risorsa dati è json. Ma non devi usare JSON. Se vuoi puoi usarlo con css.

Esempio css: https://github.com/marghoobsuleman/ms-Dropdown/tree/master/examples

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

HTML

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

copione

<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>

-8

AGGIORNAMENTO: A partire dal 2018, questo sembra funzionare ora. Testato su Chrome, Firefox, IE e 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>

1
Dov'è l'immagine?
BBaysinger,

2
Nel mio esempio stavo cambiando il colore di sfondo anziché l'immagine, ma la selezione dello stile dimostra ancora il punto.
Jon,

4
Questa risposta non affronta affatto la vera domanda ( "Come aggiungere immagini nella lista selezionata?" ).
skomisa,

1
giusto. Non l'ho provato con le immagini, volevo applicare lo stile, ed è così che sono arrivato a questa domanda. Ho supposto che {background-image: url (euro.png);} potesse essere sostituito con {background-color: green; } nel mio esempio. Non sono propenso a tornare indietro e testarlo.
Jon

non affronta affatto la domanda originale.
Staggart
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.