Як додати зображення до списку вибору?


150

У мене є список статей.

Код:

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

Я хочу використовувати зображення у випадаючому списку як спадний значок.jpeg.

Я хочу додати кнопку замість значка, що випадає.

Як це зробити?



51
будьте більш позитивними. спільнота переповнення стека є дружньою.
Лукас

як загальне рішення: якщо ви можете, зберіть ваші піктограми у вигляді SVG, імпортуйте їх на ваш шрифт в особистий діапазон Unicode, використовуйте цей шрифт у своїх <option>s підтримується всім, починаючи від 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 , наприклад використання Selectable .

З jQuery UI 1.11 доступний віджет Selectmenu , який дуже близький до того, що ви хочете.


21
А чи є у вас рішення W3C, чинне у 2015 році? Без повторної реалізації вибору?
Іван Кукір

13
Як щодо 2017 року? Все ще немає рішення?
Лоран

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

6
Firefox вже не підтримує вищезгаданий метод.
Рошана Пітігала

15
майже 2020 рік, і ми все ще перебуваємо в середньому віці
Чорний

27

Моє рішення - використовувати FontAwesome, а потім додати зображення бібліотеки як текст! Вам просто потрібні Unicodes, і їх можна знайти тут: FontAwesome Reference File forUnicodes

Ось приклад фільтра стану:

<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
це рішення не працює над опцією, лише коли вибрано (pen: codepen.io/wtfgraciano/pen/YMwWqK )
graciano

Це працює, але ця функція залежить від браузера. Наприклад, він добре працює на Chrome у Windows.
Тарік

Що означає додавати бібліотечні зображення як текст? Вибачте, я не дуже дотримуюся, ви не проти пояснити?
RyanN1220

1
@ RyanN1220 Fontawesome - це бібліотека з міні-зображеннями. І кожне зображення має відповідний текст унікоду, який ви можете застосувати. Дивіться посилання у відповіді на текстовий код. ( fontawesome.com/cheatsheet?from=io#social-buttons ) Nothign особливий, просто дотримуйтесь прикладу у відповіді, і вам слід добре піти.
Тарік

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>визначили.
Digital Ninja

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 не знайдено помилку, а потім 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 не підтримує прапорці смайлів.
skomisa

... і Google Chrome навіть за межами Windows :(
Piskvor вийшов з будівлі

2

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


1

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

Код і github repo тут

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


12
Просто посилання на бібліотеку не є гарною відповіддю. Посилання на нього, пояснення, чому він вирішує проблему, та надання коду за допомогою бібліотеки для цього робить кращу відповідь. Див.: Як я можу зв’язатись із зовнішнім ресурсом у зручному для громади спосіб?
Кевін Браун

1

Для тих, хто хоче відобразити піктограму та прийняти "чорно-біле" рішення, є одна можливість використання сутності символів:

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

За розширенням ваші значки можуть зберігатися у власному шрифті. Ось приклад використання шрифту FontAwesome : https://jsfiddle.net/14606fv9/2/ https://jsfiddle.net/14606fv9/2/

Одна перевага полягає в тому, що він не вимагає JavaScript. Однак зверніть увагу, що завантаження повного шрифту не уповільнює завантаження вашої сторінки.

Nota bene: Рішення щодо використання фонового зображення, здається, більше не працює у 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

Приклад Джона: 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
Ця відповідь взагалі не стосується актуального питання ( "Як додати зображення до списку вибору?" ).
skomisa

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

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