Wie füge ich Bilder zur Auswahlliste hinzu?

150

Ich habe eine ausgewählte Liste von Geschlechtern.

Code:

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

Ich möchte ein Bild in der Dropdown-Liste als Dropdown-Symbol.jpeg verwenden.

Ich möchte anstelle des Dropdown-Symbols eine Schaltfläche hinzufügen.

Wie geht das?

Mayur
quelle
51
sei positiver. Die Stack-Overflow-Community ist freundlich.
Lucas
als allgemeine Lösung: Wenn Sie können, stellen Sie Ihre Symbole als SVGs zusammen, importieren Sie sie in eine Schriftart Ihrer Wahl in den persönlichen Unicode-Bereich und verwenden Sie diese Schriftart in Ihrem <option>s; unterstützt von allem ab IE 8.0, klein und einfach.

Antworten:

175

In Firefox können Sie der Option einfach ein Hintergrundbild hinzufügen:

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

Besser noch, Sie können HTML und CSS so trennen

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 anderen Browsern wäre die einzige Möglichkeit, dies zu tun, die Verwendung einer JS-Widget-Bibliothek, wie beispielsweise der jQuery-Benutzeroberfläche , z . B. die Verwendung von Selectable .

Ab jQuery UI 1.11 ist das Selectmenu- Widget verfügbar, das Ihren Wünschen sehr nahe kommt.

vartec
quelle
21
Und haben Sie 2015 eine W3C-gültige Lösung? Ohne das Auswahlfeld erneut zu implementieren?
Ivan Kuckir
13
Wie wäre es mit 2017? Immer noch keine Lösung?
Laurent
28
@ IvanKuckir - Pffff. W3C "diskutiert" immer noch die Gründe, warum und warum dies nicht getan werden sollte, und nach der Durchführung einer Studie zu diesem Thema wird ein Ausschuss die möglichen Vor- und Nachteile einer Aktivierung erörtern. Anschließend wird eine Feldstudie zur Abwärtskompatibilität durchgeführt. Sie werden dann eine Studie für die farbenblinden Menschen schlagen. Sobald die Empfehlung abgegeben wurde, wird eine Studie über mögliche Nebenwirkungen auf andere Elemente (wie das Kontrollkästchen) durchgeführt. Nach all dem werden sie eine Studie haben, um zu entscheiden, ob all diese Studien benötigt werden.
Greeso
6
Firefox unterstützt die oben genannte Methode nicht mehr.
Roshana Pitigala
13
fast 2020 und wir sind noch im Mittelalter
Black
27

Meine Lösung besteht darin, FontAwesome zu verwenden und dann Bibliotheksbilder als Text hinzuzufügen! Sie benötigen nur die Unicodes und diese finden Sie hier: FontAwesome-Referenzdatei für Unicodes

Hier ist ein Beispiel für einen Statusfilter:

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

Beachten Sie die Schriftfamilie: Arial, FontAwesome; muss für die Auswahl stilvoll zugewiesen werden, wie im Beispiel angegeben!

Tarik
quelle
2
Genau das habe ich versucht! Ich wollte wirklich kein weiteres js-Plugin implementieren müssen - das ist also perfekt, da ich bereits FontAwesome-Symbole auf meiner Website verwende.
Lila Dame
1
Diese Lösung funktioniert nicht mit der Option, nur wenn sie ausgewählt ist (Stift: codepen.io/wtfgraciano/pen/YMwWqK )
Graciano
Es funktioniert, aber die Funktion ist browserabhängig. Es funktioniert beispielsweise unter Chrome in Windows gut.
Tarik
Was meinst du mit Bibliotheksbildern als Text hinzufügen? Tut mir leid, dass ich nicht ganz folge. Hast du etwas dagegen zu erklären?
RyanN1220
1
@ RyanN1220 Fontawesome ist eine Bibliothek mit Mini-Bildern. Und jedes Bild hat einen entsprechenden Unicode-Text, den Sie anwenden können. Siehe den Link in der Antwort für den Textcode. ( fontawesome.com/cheatsheet?from=io#social-buttons ) Nichts Besonderes, folgen Sie einfach dem Beispiel in der Antwort und Sie sollten bereit sein zu gehen.
Tarik
26

Sie können iconselect.js verwenden. Symbol- / Bildauswahl (Combobox, Dropdown)

Demo und Download; http://bug7a.github.io/iconselect.js/

Geben Sie hier die Bildbeschreibung ein

HTML-Nutzung;

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

Verwendung von 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
quelle
30
Dieses Plugin hat die seltsamste "Anforderung", die ich je gesehen habe; Das CSS und die Bildlauffunktion werden unterbrochen, wenn Sie dies <!doctype html>definiert haben.
Digital Ninja
23

Sie haben bereits mehrere Antworten, die die Verwendung von JavaScript / jQuery vorschlagen. Ich werde eine Alternative hinzufügen, die nur HTML und CSS ohne JS verwendet.

Die Grundidee besteht darin, eine Reihe von Optionsfeldern und Beschriftungen (die die Optionsfelder aktivieren / deaktivieren) zu verwenden und mit der CSS-Steuerung nur die Beschriftung anzuzeigen, die dem ausgewählten Optionsfeld zugeordnet ist. Wenn Sie die Auswahl mehrerer Werte zulassen möchten, können Sie dies mithilfe von Kontrollkästchen anstelle von Optionsfeldern erreichen.

Hier ist ein Beispiel. Der Code kann etwas unordentlicher sein (speziell im Vergleich zu den anderen Lösungen):

.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
quelle
3
Sie müssen die Maus herausziehen, damit sie zusammenbricht. Kann es mit einem Klick gemacht werden und nicht mit der Maus? Würde dies auf Mobilgeräten / Geräten ohne Maus funktionieren?
Tgkprog
17

Eine andere browserübergreifende jQuery-Lösung für dieses Problem ist http://designwithpc.com/Plugins/ddSlick, die genau für diese Verwendung entwickelt wurde.

jerrygarciuh
quelle
2
Die View-Demo funktioniert nicht auf meinem Computer (Linux Mint + Firefox 44)
RousseauAlexandre
@RousseauAlexandre Überprüfung der Konsole auf dieser anderen Website Ich sehe 403 Fehler für den Inhalt des Autors. Ich habe ihm eine Nachricht darüber geschickt, da eine Beschwerde hier nichts nützt.
Jerrygarciuh
Sie haben Recht, ich habe einen my.hellobar.com/45874_63207.js nicht gefundenen Fehler und dann TypeError: $(...).ddslickist keine Funktion in der Firefox-Konsole
RousseauAlexandre
1
Nur eine Verknüpfung zu einer Bibliothek ist keine gute Antwort. Wenn Sie darauf verlinken, erklären, warum das Problem gelöst wird, und Code mithilfe der Bibliothek bereitstellen, erhalten Sie eine bessere Antwort. Siehe: Wie kann ich auf Community-freundliche Weise eine Verknüpfung zu einer externen Ressource herstellen?
Kevin Brown
12

In Ländern, Sprachen oder Währungen können Sie Emojis verwenden.

Funktioniert mit so ziemlich jedem Browser / Betriebssystem, das die Verwendung von Emojis unterstützt.

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
quelle
6
"Funktioniert mit so ziemlich jedem Browser / Betriebssystem, das die Verwendung von Emojis unterstützt" .... außer dass Windows keine Emoji-Flags unterstützt.
Skomisa
... und Google Chrome auch außerhalb von Windows nicht :(
Piskvor verließ das Gebäude
2

Für ein zweifarbiges Bild können Sie Fontello verwenden und alle benutzerdefinierten Glyphen importieren, die Sie verwenden möchten. Erstellen Sie einfach Ihr Bild in Illustrator, speichern Sie es in SVG, legen Sie es auf der Fontello-Website ab und laden Sie Ihre benutzerdefinierte Schriftart zum Importieren herunter. Kein JavaScript!

BBaysinger
quelle
1

Ich habe mehrere jquery-basierte benutzerdefinierte Auswahl mit Bildern ausprobiert, aber keine funktionierte in reaktionsschnellen Layouts. Endlich bin ich auf Bootstrap-Select gestoßen. Nach einigen Änderungen konnte ich diesen Code erstellen.

Code und Github Repo hier

Geben Sie hier die Bildbeschreibung ein

Aslam Parvaiz
quelle
12
Nur eine Verknüpfung mit einer Bibliothek ist keine gute Antwort. Wenn Sie darauf verlinken, erklären, warum das Problem gelöst wird, und Code mithilfe der Bibliothek bereitstellen, erhalten Sie eine bessere Antwort. Siehe: Wie kann ich auf Community-freundliche Weise eine Verknüpfung zu einer externen Ressource herstellen?
Kevin Brown
1

Für diejenigen, die ein Symbol anzeigen möchten und eine "Schwarzweiß" -Lösung akzeptieren möchten, besteht eine Möglichkeit darin, Zeichenentitäten zu verwenden:

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

Durch die Erweiterung können Ihre Symbole in einer benutzerdefinierten Schriftart gespeichert werden. Hier ist ein Beispiel mit der Schriftart FontAwesome : https://jsfiddle.net/14606fv9/2/ https://jsfiddle.net/14606fv9/2/

Ein Vorteil ist, dass kein Javascript erforderlich ist. Beachten Sie jedoch, dass das Laden der vollständigen Schriftart das Laden Ihrer Seite nicht verlangsamt.

Hinweis: Die Lösung für die Verwendung eines Hintergrundbilds scheint in Firefox nicht mehr zu funktionieren (zumindest in Version 57 "Quantum"):

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

Alvaros JS kostenlose Antwort war ein guter Anfang für mich, und ich habe wirklich versucht, eine wirklich JS-freie Antwort zu erhalten, die immer noch alle Funktionen bietet, die von einem Select mit Bildern erwartet werden, aber leider war das Verschachteln von Formularen der Niedergang. Ich poste hier zwei Lösungen. Meine Hauptlösung, die 1 Zeile JavaScript verwendet, und eine vollständig JavaScript-freie Lösung, die in einem anderen Formular nicht funktioniert, aber für Navigationsmenüs nützlich sein kann.

Leider gibt es einige Wiederholungen im Code, aber wenn Sie darüber nachdenken, was ein Select macht, ist dies sinnvoll. Wenn Sie auf eine Option klicken, wird dieser Text in den ausgewählten Bereich kopiert. Wenn Sie also auf eine von vier Optionen klicken, werden die 4 Optionen nicht geändert. Oben wird jedoch die angeklickte Option wiederholt. Um dies mit Bildern zu tun, wäre JavaScript erforderlich, orrrr ... Sie duplizieren die Einträge.

In meinem Beispiel haben wir eine Liste von Spielen (Produkten), die Versionen haben. Jedes Produkt kann auch Erweiterungen haben, die auch Versionen haben können. Für jedes Produkt geben wir dem Benutzer eine Liste jeder Version, wenn es mehr als eine gibt, zusammen mit einem Bild und einem versionenspezifischen Text.

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

Wenn Sie JS für die Deaktivierung der Kontrollkästchen verwenden, können mehrere Instanzen in einem Formular vorhanden sein. Hier habe ich erweitert, um eine Liste von Erweiterungen anzuzeigen, die auch die gleiche Logik für Versionen haben.

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

Dies erfordert natürlich einiges an CSS, das ich nur in diese JSFiddle aufgenommen habe , um die Größe dieser bereits massiven Antwort zu reduzieren. Ich habe Bootstrap 4 verwendet, um die benötigte Menge zu reduzieren und um zu ermöglichen, dass es in andere Bootstrap-Steuerelemente und alle vorgenommenen Site-Anpassungen passt.

Die Bilder sind auf 75px eingestellt, dies kann jedoch leicht in 5 Zeilen in .rich-selectund geändert werden.rich-select-option-body img

rot
quelle
0

Ich habe das gleiche Problem. Meine Lösung war eine Auswahl von Optionsfeldern mit dem Bild rechts davon. Da Sie im Radio nur eine einzige Option auswählen können, funktioniert dies (wie) eine Auswahl.

Arbeite gut für mich. Hoffe, es kann jemand anderem helfen.

Luan Persini
quelle
1
a <select>ist nicht unbedingt für die Auswahl eines einzelnen Wertes
npup
0

Dies verwendet ms-Dropdown: https://github.com/marghoobsuleman/ms-Dropdown

Datenressource ist json. Aber Sie müssen nicht json verwenden. Wenn Sie möchten, können Sie mit CSS verwenden.

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

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

HTML

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

Skript

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

UPDATE: Ab 2018 scheint dies jetzt zu funktionieren. Getestet in Chrome, Firefox, IE und 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
quelle
1
Wo ist das Bild?
BBaysinger
2
In meinem Beispiel habe ich die Hintergrundfarbe anstelle des Bilds geändert, aber die Stilauswahl beweist immer noch den Punkt.
Jon
4
Diese Antwort behandelt überhaupt nicht die eigentliche Frage ( "Wie füge ich Bilder zur Auswahlliste hinzu?" ).
Skomisa
1
Meinetwegen. Ich habe es nicht mit Bildern getestet, ich wollte Stil anwenden, und so kam ich zu dieser Frage. Ich nahm an, dass {Hintergrundbild: URL (euro.png);} anstelle von {Hintergrundfarbe: grün; } in meinem Beispiel. Ich bin nicht geneigt, zurück zu gehen und es zu testen.
Jon
geht überhaupt nicht auf die ursprüngliche Frage ein.
Staggart