Bagaimana cara menambahkan gambar dalam daftar pilih?


150

Saya memiliki daftar jenis kelamin tertentu.

Kode:

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

Saya ingin menggunakan gambar dalam daftar drop-down sebagai drop-down-icon.jpeg.

Saya ingin menambahkan tombol di tempat ikon drop down.

Bagaimana cara melakukannya?



51
menjadi lebih positif. komunitas stack overflow adalah komunitas yang ramah.
Lucas

sebagai solusi umum: jika Anda bisa, dapatkan ikon Anda bersama sebagai SVGs, impor mereka ke dalam font pilihan Anda ke dalam jangkauan Unicode pribadi, gunakan font itu dalam huruf Anda <option>; didukung oleh semuanya mulai dari IE 8.0, kecil dan sederhana.

Jawaban:


176

Di Firefox Anda bisa menambahkan gambar latar belakang ke opsi:

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

Lebih baik lagi, Anda dapat memisahkan HTML dan CSS seperti itu

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

Di browser lain , satu-satunya cara melakukannya adalah menggunakan beberapa pustaka widget JS, seperti misalnya UI jQuery , misalnya menggunakan Selectable .

Dari jQuery UI 1.11, widget Selectmenu tersedia, yang sangat dekat dengan yang Anda inginkan.


21
Dan apakah Anda memiliki solusi W3C-valid pada tahun 2015? Tanpa menerapkan kembali kotak pilih?
Ivan Kuckir

13
Bagaimana dengan tahun 2017? Masih belum ada solusi?
laurent

28
@IvanKuckir - Pffff. W3C masih "mendiskusikan" alasan mengapa dan mengapa tidak ini harus dilakukan, dan setelah menerapkan studi tentang topik tersebut, sebuah komite kemudian akan membahas potensi keuntungan dan kerugian dari memungkinkan ini. Setelah selesai, akan ada studi lapangan tentang kompatibilitas ke belakang. Mereka kemudian akan menampar sebuah studi untuk orang buta warna. Setelah rekomendasi dibuat, akan ada studi tentang efek samping potensial pada elemen lain (seperti kotak centang). Setelah semua itu, mereka akan memiliki studi untuk memutuskan apakah semua studi itu diperlukan.
Greeso

6
Firefox tidak lagi mendukung metode yang disebutkan di atas.
Roshana Pitigala

15
hampir tahun 2020 dan kita masih di Abad Pertengahan
Hitam

27

Solusi saya adalah menggunakan FontAwesome dan kemudian menambahkan gambar perpustakaan sebagai teks! Anda hanya perlu Unicodes dan ditemukan di sini: File Referensi FontAwesome forUnicodes

Berikut ini contoh filter negara:

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

Perhatikan font-family: Arial, FontAwesome; diperlukan untuk ditugaskan dalam gaya untuk pilih seperti yang diberikan dalam contoh!


2
Ini persis apa yang saya coba lakukan! Saya benar-benar tidak ingin harus menerapkan plugin js lain - jadi ini sempurna karena saya sudah menggunakan ikon FontAwesome di situs web saya.
Purple Lady

1
solusi ini tidak berfungsi pada opsi, hanya ketika dipilih (pena: codepen.io/wtfgraciano/pen/YMwWqK )
graciano

Ini berfungsi tetapi fitur ini tergantung pada browser. Ini berfungsi baik pada Chrome di Windows misalnya.
Tarik

Apa maksud Anda menambahkan gambar perpustakaan sebagai teks? Maaf saya tidak cukup mengikuti, apakah Anda keberatan menjelaskan?
RyanN1220

1
@ RyanN1220 Fontawesome adalah perpustakaan memiliki gambar mini. Dan setiap gambar memiliki teks unicode yang sesuai yang dapat Anda terapkan. Lihat tautan dalam jawaban untuk kode teks. ( fontawesome.com/cheatsheet?from=io#social-buttons ) Tidak ada yang istimewa, cukup ikuti contoh dalam jawaban dan Anda harus pergi dengan baik.
Tarik

26

Anda dapat menggunakan iconselect.js; Ikon / gambar pilih (kotak kombo, dropdown)

Demo dan unduh; http://bug7a.github.io/iconselect.js/

masukkan deskripsi gambar di sini

Penggunaan HTML;

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

Penggunaan 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
Plugin ini memiliki "persyaratan" paling aneh yang pernah saya lihat; CSS dan fungsi gulir akan rusak jika Anda telah <!doctype html>mendefinisikannya.
Digital Ninja

23

Anda sudah memiliki beberapa jawaban yang menyarankan menggunakan JavaScript / jQuery. Saya akan menambahkan alternatif yang hanya menggunakan HTML dan CSS tanpa JS.

Ide dasarnya adalah dengan menggunakan satu set tombol radio dan label (yang akan mengaktifkan / menonaktifkan tombol radio), dan dengan kontrol CSS bahwa hanya label yang terkait dengan tombol radio yang dipilih yang akan ditampilkan. Jika Anda ingin mengizinkan pemilihan beberapa nilai, Anda dapat mencapainya dengan menggunakan kotak centang alih-alih tombol radio.

Berikut ini sebuah contoh. Kode mungkin sedikit berantakan (khusus dibandingkan dengan solusi lain):

.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
Perlu untuk memindahkan mouse agar bisa runtuh. Bisakah itu dilakukan pada klik dan bukan mouse melayang / bergerak? Apakah ini berfungsi pada perangkat seluler / bukan mouse?
tgkprog

17

Solusi lintas peramban jQuery lain untuk masalah ini adalah http://designwithpc.com/Plugins/ddSlick yang dibuat untuk penggunaan ini.


2
demo tampilan tidak berfungsi di komputer saya (Linux Mint + Firefox 44)
RousseauAlexandre

@RousseauAlexandre memeriksa konsol di situs lain yang saya lihat ada 403 kesalahan untuk konten penulis. Saya mengiriminya pesan tentang itu karena mengeluh di sini tidak akan ada gunanya.
jerrygarciuh

Anda benar, saya mendapat kesalahan my.hellobar.com/45874_63207.js & kemudian TypeError: $(...).ddslickbukan fungsi di konsol Firefox
RousseauAlexandre

1
Hanya menautkan ke perpustakaan bukanlah jawaban yang baik. Menautkannya, menjelaskan mengapa itu memecahkan masalah, dan menyediakan kode menggunakan pustaka untuk melakukannya membuat jawaban yang lebih baik. Lihat: Bagaimana saya bisa menautkan ke sumber daya eksternal dengan cara yang ramah komunitas?
Kevin Brown

12

Dengan negara, bahasa, atau mata uang, Anda dapat menggunakan emoji.

Bekerja dengan hampir semua browser / OS yang mendukung penggunaan 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
"Bekerja dengan hampir semua browser / OS yang mendukung penggunaan emoji" .... kecuali bahwa Windows tidak mendukung flag emoji.
skomisa

... dan Google Chrome, bahkan di luar Windows :(
Piskvor meninggalkan gedung

2

Untuk gambar dua warna, Anda dapat menggunakan Fontello , dan mengimpor mesin terbang kustom apa pun yang ingin Anda gunakan. Cukup buat gambar Anda di Illustrator, simpan ke SVG, dan letakkan di situs Fontello, lalu unduh font khusus Anda yang siap diimpor. Tanpa JavaScript!


1

Saya mencoba beberapa jquery custom pilih berdasarkan dengan gambar, tetapi tidak ada yang bekerja di tata letak responsif. Akhirnya saya menemukan Bootstrap-Select. Setelah beberapa modifikasi saya dapat menghasilkan kode ini.

Kode dan github repo di sini

masukkan deskripsi gambar di sini


12
Hanya menautkan ke perpustakaan bukanlah jawaban yang baik. Menautkannya, menjelaskan mengapa itu memecahkan masalah, dan menyediakan kode menggunakan pustaka untuk melakukannya membuat jawaban yang lebih baik. Lihat: Bagaimana saya bisa menautkan ke sumber daya eksternal dengan cara yang ramah komunitas?
Kevin Brown

1

Bagi mereka yang ingin menampilkan ikon, dan menerima solusi "hitam dan putih", satu kemungkinan menggunakan entitas karakter:

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

Dengan ekstensi, ikon Anda dapat disimpan dalam font khusus. Berikut ini contoh menggunakan font FontAwesome : https://jsfiddle.net/14606fv9/2/ https://jsfiddle.net/14606fv9/2/

Satu manfaat adalah tidak memerlukan Javascript. Namun, perhatikan bahwa memuat font lengkap tidak memperlambat pemuatan halaman Anda.

Nota bene: Solusi menggunakan gambar latar belakang sepertinya tidak berfungsi lagi di Firefox (setidaknya dalam versi 57 "Quantum"):

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

1

Jawaban bebas Alvaros JS adalah awal yang baik bagi saya, dan saya benar-benar mencoba untuk mendapatkan jawaban yang benar-benar bebas JS yang masih memberikan semua fungsi yang diharapkan dari Select dengan gambar, tetapi sayangnya bentuk bersarang adalah down-fall. Saya memposting dua solusi di sini; solusi utama saya yang menggunakan 1 baris JavaScript, dan solusi yang sepenuhnya bebas JavaScript yang tidak akan berfungsi di dalam formulir lain, tetapi mungkin berguna untuk menu nav.

Sayangnya ada sedikit pengulangan dalam kode, tetapi ketika Anda berpikir tentang apa yang Pilih lakukan, itu masuk akal. Ketika Anda mengklik suatu opsi itu menyalin teks itu ke area yang dipilih, yaitu, mengklik 1 dari 4 opsi tidak akan mengubah 4 opsi, tetapi bagian atas sekarang akan mengulangi yang Anda klik. Untuk melakukan ini dengan gambar akan memerlukan JavaScript, atau ... Anda menduplikasi entri.

Dalam contoh saya, kami memiliki daftar game (Produk), yang memiliki versi. Setiap produk juga dapat memiliki Ekspansi, yang juga dapat memiliki versi. Untuk setiap Produk, kami memberi pengguna daftar dari setiap versi jika ada lebih dari satu, bersama dengan gambar dan teks versi spesifik.

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

Menggunakan JS untuk pemilihan kotak centang kita dapat memiliki beberapa instance pada formulir. Di sini saya telah diperluas untuk menampilkan daftar Ekspansi, yang juga memiliki logika yang sama di sekitar versi.

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

Tentu saja ini membutuhkan sedikit CSS yang adil, yang saya hanya sertakan dalam JSFiddle ini untuk mengurangi ukuran jawaban yang sudah besar ini. Saya telah menggunakan Bootstrap 4 untuk mengurangi jumlah yang dibutuhkan, dan juga untuk memungkinkannya agar cocok dengan kontrol Bootstrap lain dan setiap penyesuaian situs yang telah dibuat.

Gambar diatur ke 75px, tetapi ini dapat dengan mudah diubah dalam 5 baris .rich-selectdan.rich-select-option-body img


0

Saya mendapat masalah yang sama. Solusi saya adalah pendahuluan tombol radio, dengan gambar di sebelah kanannya. Karena Anda hanya dapat memilih satu opsi di radio, ini berfungsi (seperti) pilihan.

Bekerja dengan baik untukku. Semoga bisa membantu orang lain.


1
a <select>belum tentu untuk memilih nilai tunggal
npup

0

Ini menggunakan ms-Dropdown: https://github.com/marghoobsuleman/ms-Dropdown

Sumber data adalah json. Tapi Anda tidak perlu menggunakan json. Jika mau, Anda dapat menggunakan dengan css.

Contoh Css: https://github.com/marghoobsuleman/ms-Dropdown/tree/master/examples

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

HTML

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

Naskah

<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

UPDATE: Pada 2018, ini tampaknya berfungsi sekarang. Diuji di Chrome, Firefox, IE dan 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
Di mana gambarnya?
BBaysinger

2
Saya mengubah warna latar belakang alih-alih gambar dalam contoh saya, tetapi pemilihan gaya masih membuktikan intinya.
Jon

4
Jawaban ini tidak menjawab pertanyaan sebenarnya ( "Bagaimana cara menambahkan gambar di daftar pilih?" ) Sama sekali.
skomisa

1
cukup adil. Saya tidak mengujinya dengan gambar, saya ingin menerapkan gaya, yang akhirnya saya tanyakan. Saya menduga bahwa {background-image: url (euro.png);} dapat diganti dengan {background-color: green; } dalam contoh saya. Saya tidak cenderung untuk kembali dan mengujinya.
Jon

sama sekali tidak menjawab pertanyaan asli.
staggart
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.