Как добавить изображения в список выбора?


150

У меня есть список избранных полов.

Код:

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

Я хочу использовать изображение из выпадающего списка как drop-down-icon.jpeg.

Я хочу добавить кнопку вместо выпадающего значка.

Как это сделать?



51
быть более позитивным. Сообщество переполнения стека является дружественным.
Лукас

как общее решение: если вы можете, соберите свои значки в виде SVG, импортируйте их в выбранный вами шрифт в личный диапазон Unicode, используйте этот шрифт в своих <option>; поддерживается все, начиная с IE 8.0, маленький и простой.

Ответы:


176

В Firefox вы можете просто добавить фоновое изображение к опции:

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

А еще лучше, вы можете разделить HTML и CSS, как это

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

В других браузерах единственный способ сделать это - использовать некоторую библиотеку виджетов JS, например, jQuery UI , например, используя Selectable .

Из jQuery UI 1.11 доступен виджет Selectmenu , который очень близок к тому, что вы хотите.


21
И есть ли у вас какое-либо W3C-решение в 2015 году? Без повторной реализации выбора?
Иван Кукир

13
Как насчет 2017 года? Все еще нет решения?
Laurent

28
@IvanKuckir - Пфффф. W3C все еще «обсуждает» причины, почему и почему этого не следует делать, и после проведения исследования по этой теме, комитет затем обсудит потенциальные преимущества и недостатки, позволяющие это сделать. После этого будет проведено практическое исследование обратной совместимости. Затем они проведут исследование для дальтоников. Как только рекомендация будет сделана, будет проведено исследование о потенциальных побочных эффектах на другие элементы (такие как флажок). После всего этого у них будет исследование, чтобы решить, все ли исследования там, где это необходимо.
Greeso

6
Firefox больше не поддерживает вышеупомянутый метод.
Рошана Питигала

15
почти 2020, и мы все еще в средневековье
черный

27

Мое решение состоит в том, чтобы использовать FontAwesome, а затем добавить изображения библиотеки в виде текста! Вам просто нужны юникоды, и они находятся здесь: Справочный файл FontAwesome для юникодов

Вот пример фильтра состояния:

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

Обратите внимание на семейство шрифтов: Arial, FontAwesome; требуется выбрать в стиле для выбора, как указано в примере!


2
Это именно то, что я пытался сделать! Я действительно не хотел реализовывать другой плагин js - так что это прекрасно, так как я уже использую значки FontAwesome на своем веб-сайте.
Фиолетовая леди

1
это решение не работает с опцией, только при выборе (ручка: codepen.io/wtfgraciano/pen/YMwWqK )
graciano

Это работает, но функция зависит от браузера. Это хорошо работает на Chrome в Windows, например.
Tarik

Что вы имеете в виду добавить библиотечные изображения в виде текста? Извините, я не совсем понимаю, вы не против объяснить?
RyanN1220

1
@ RyanN1220 Fontawesome - это библиотека с мини-изображениями. И каждое изображение имеет соответствующий текст Unicode, который вы можете применить. Смотрите ссылку в ответе для текстового кода. ( fontawesome.com/cheatsheet?from=io#social-buttons ) Ничего особенного, просто следуйте примеру в ответе, и вам будет хорошо идти.
Тарик

26

Вы можете использовать iconselect.js; Выбор значка / изображения (выпадающий список)

Демо и скачать; http://bug7a.github.io/iconselect.js/

введите описание изображения здесь

Использование HTML;

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

Использование 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
Этот плагин имеет самое странное «требование», которое я когда-либо видел; CSS и функция прокрутки ломаются, если вы <!doctype html>определили.
Цифровой ниндзя

23

У вас уже есть несколько ответов, которые предлагают использовать JavaScript / jQuery. Я собираюсь добавить альтернативу, которая использует только HTML и CSS без JS.

Основная идея состоит в том, чтобы использовать набор переключателей и меток (которые будут активировать / деактивировать переключатели), а с помощью элемента управления CSS будет отображаться только ярлык, связанный с выбранным переключателем. Если вы хотите разрешить выбор нескольких значений, вы можете достичь этого с помощью флажков вместо переключателей.

Вот пример. Код может быть немного сложнее (особенно по сравнению с другими решениями):

.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
Нужно переместить мышь, чтобы она рухнула. Это можно сделать по щелчку, а не при наведении курсора мыши? Будет ли это работать на мобильных / не мышиных устройствах?
tgkprog

17

Другим кросс-браузерным решением jQuery для этой проблемы является http://designwithpc.com/Plugins/ddSlick, которое предназначено именно для этого использования.


2
вид демо не работают на моем компьютере (Linux Mint + Firefox 44)
RousseauAlexandre

@RousseauAlexandre проверяя консоль на этом другом сайте, я вижу 403 ошибки для содержания автора. Я отправил ему сообщение об этом, так как жалобы здесь не принесут пользы.
jerrygarciuh

Вы правы, я получил ошибку my.hellobar.com/45874_63207.js not found, а затем TypeError: $(...).ddslickне является функцией консоли Firefox
RousseauAlexandre

1
Просто ссылка на библиотеку не является хорошим ответом. Ссылки на него, объяснение, почему это решает проблему, и предоставление кода с использованием библиотеки для этого - лучший ответ. Смотрите: Как я могу сделать ссылку на внешний ресурс в сообществе?
Кевин Браун

12

Со странами, языками или валютой вы можете использовать эмодзи.

Работает практически со всеми браузерами / ОС, поддерживающими использование смайликов.

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
«Работает практически со всеми браузерами / ОС, поддерживающими использование смайликов» .... за исключением того, что Windows не поддерживает флаги смайликов.
скомиса

... и Google Chrome не работает даже за пределами Windows :(
Писквор покинул здание

2

Для двухцветного изображения вы можете использовать Fontello и импортировать любой пользовательский глиф, который вы хотите использовать. Просто сделайте свое изображение в Illustrator, сохраните его в SVG и поместите на сайт Fontello, а затем загрузите свой собственный шрифт, готовый для импорта. Нет JavaScript!


1

Я пробовал несколько пользовательских выборок на основе jquery с изображениями, но ни один не работал в адаптивных макетах. Наконец я наткнулся на Bootstrap-Select. После некоторых изменений я смог создать этот код.

Код и github репо здесь

введите описание изображения здесь


12
Просто ссылка на библиотеку не является хорошим ответом. Ссылки на него, объяснение, почему это решает проблему, и предоставление кода с использованием библиотеки для этого - лучший ответ. Смотрите: Как я могу сделать ссылку на внешний ресурс в сообществе?
Кевин Браун

1

Для тех, кто хочет отобразить значок и принимает «черно-белое» решение, одна возможность заключается в использовании символьных сущностей:

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

Расширение, ваши значки могут быть сохранены в произвольном шрифте. Вот пример использования шрифта FontAwesome : https://jsfiddle.net/14606fv9/2/ https://jsfiddle.net/14606fv9/2/

Одним из преимуществ является то, что он не требует никакого Javascript. Однако обратите внимание, что загрузка полного шрифта не замедляет загрузку вашей страницы.

Примечание: решение об использовании фонового изображения больше не работает в Firefox (по крайней мере, в версии 57 «Quantum»):

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

1

Alvaros JS свободный ответ стал для меня отличным началом, и я действительно попытался получить действительно свободный от JS ответ, который по-прежнему предоставлял все функции, ожидаемые от Select с изображениями, но, к сожалению, формы вложений были падением. Я публикую два решения здесь; мое основное решение, которое использует 1 строку JavaScript, и полностью бесплатное решение JavaScript, которое не будет работать внутри другой формы, но может быть полезно для навигационных меню.

К сожалению, в коде есть небольшое повторение, но когда вы думаете о том, что делает Select, это имеет смысл. Когда вы щелкаете опцию, она копирует этот текст в выбранную область, т. Е. Выбор 1 из 4 опций не изменит 4 опций, но верхняя часть теперь будет повторять ту, которую вы щелкнули. Для этого с изображениями потребуется JavaScript, orrrr ... вы дублируете записи.

В моем примере у нас есть список игр (продуктов), которые имеют версии. Каждый продукт может также иметь Расширения, которые также могут иметь версии. Для каждого Продукта мы даем пользователю список каждой версии, если их более одной, вместе с изображением и текстом конкретной версии.

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

Используя JS для снятия флажка, мы можем иметь несколько экземпляров в форме. Здесь я расширил список расширений, которые также имеют одинаковую логику в версиях.

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

Конечно, для этого требуется немало CSS, который я включил только в этот JSFiddle, чтобы уменьшить размер этого и без того массивного ответа. Я использовал Bootstrap 4, чтобы уменьшить необходимое количество, а также позволить ему вписываться в другие элементы управления Bootstrap и любые настройки сайта, которые были сделаны.

Изображения установлены на 75 пикселей, но это можно легко изменить в 5 строк .rich-selectи.rich-select-option-body img


0

У меня та же проблема. Моим решением было использование переключателей с изображением справа от него. Поскольку вы можете выбрать только один вариант на радио, он работает (как) выбор.

Работай хорошо для меня. Надеюсь, что это может помочь кому-то еще.


1
a <select>не обязательно для выбора одного значения
npup

0

Это использует MS-Dropdown: https://github.com/marghoobsuleman/ms-Dropdown

Ресурс данных JSON. Но вам не нужно использовать JSON. Если вы хотите, вы можете использовать с CSS.

Пример Css: https://github.com/marghoobsuleman/ms-Dropdown/tree/master/examples

Пример Json: http://jsfiddle.net/tcibikci/w3rdhj4s/6

HTML

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

скрипт

<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

ОБНОВЛЕНИЕ: По состоянию на 2018 год, это похоже на работу сейчас. Протестировано в Chrome, Firefox, IE и 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
Где изображение?
BBaysinger

2
Я изменил цвет фона вместо изображения в моем примере, но выбор стиля все еще подтверждает это.
Джон

4
Этот ответ вообще не касается реального вопроса ( «Как добавить изображения в список выбора?» ).
скомиса

1
справедливо. Я не проверял это с изображениями, я хотел применить стиль, вот как я оказался в этом вопросе. Я предположил, что {background-image: url (euro.png);} можно заменить на {background-color: green; } в моем примере. Я не склонен возвращаться и проверять это.
Джон

не затрагивает оригинальный вопрос вообще.
пошаговое
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.