Làm thế nào để thêm hình ảnh trong danh sách chọn?


150

Tôi có một danh sách lựa chọn giới tính.

Mã số:

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

Tôi muốn sử dụng một hình ảnh trong danh sách thả xuống dưới dạng thả xuống-icon.jpeg.

Tôi muốn thêm một nút thay cho biểu tượng thả xuống.

Làm thế nào để làm điều đó?



51
tích cực hơn cộng đồng tràn stack là một cộng đồng thân thiện.
Lucas

như một giải pháp chung: nếu bạn có thể, hãy kết hợp các biểu tượng của bạn dưới dạng SVG, nhập chúng vào một phông chữ bạn chọn vào phạm vi Unicode cá nhân, sử dụng phông chữ đó trong <option>s của bạn ; được hỗ trợ bởi mọi thứ từ IE 8.0, nhỏ và đơn giản.

Câu trả lời:


176

Trong Firefox, bạn chỉ có thể thêm hình nền vào tùy chọn:

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

Tốt hơn nữa, bạn có thể tách HTML và CSS như thế

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

Trong các trình duyệt khác là cách duy nhất để làm điều đó sẽ được sử dụng thư viện một số JS widget, ví dụ như jQuery UI , ví dụ như sử dụng lựa chọn .

Từ jQuery UI 1.11, tiện ích Selectmenu khả dụng, rất gần với những gì bạn muốn.


21
Và bạn có bất kỳ giải pháp hợp lệ W3C nào trong năm 2015 không? Nếu không thực hiện lại chọn hộp?
Ivan Kuckir

13
Năm 2017 thì sao? Vẫn không có giải pháp?
nguyệt quế

28
@IvanKuckir - Pffff. W3C vẫn đang "thảo luận" lý do tại sao và tại sao không nên làm điều này và sau khi thực hiện một nghiên cứu về chủ đề này, một ủy ban sẽ thảo luận về những lợi thế và bất lợi tiềm ẩn của việc cho phép điều này. Sau khi thực hiện, sẽ có một nghiên cứu thực địa về khả năng tương thích ngược. Sau đó, họ sẽ tát một nghiên cứu cho những người mù màu. Sau khi khuyến nghị được đưa ra, sẽ có một nghiên cứu về các tác dụng phụ tiềm ẩn đối với các yếu tố khác (chẳng hạn như hộp kiểm). Sau tất cả những điều đó, họ sẽ có một nghiên cứu để quyết định xem tất cả những nghiên cứu đó có cần thiết hay không.
Greeso

6
Firefox không hỗ trợ phương pháp đã đề cập ở trên nữa.
Roshana Pitigala

14
gần 2020 và chúng tôi vẫn ở giữa thời đại
Đen

27

Giải pháp của tôi là sử dụng FontAwgie và sau đó thêm hình ảnh thư viện dưới dạng văn bản! Bạn chỉ cần Unicodes và chúng được tìm thấy ở đây: Tệp tham chiếu FontAwgie forUnicodes

Dưới đây là một bộ lọc trạng thái ví dụ:

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

Lưu ý họ phông chữ: Arial, FontAwgie; được yêu cầu phải được chỉ định theo kiểu để chọn như được đưa ra trong ví dụ!


2
Đây chính xác là những gì tôi đã cố gắng làm! Tôi thực sự không muốn phải thực hiện một plugin js khác - vì vậy điều này là hoàn hảo vì tôi đã sử dụng các biểu tượng FontAwgie trong trang web của mình.
Quý cô tím

1
giải pháp này không hoạt động trên tùy chọn, chỉ khi được chọn (bút: codepen.io/wtfgraciano/pen/YMwWqK )
graciano

Nó không hoạt động nhưng tính năng phụ thuộc vào trình duyệt. Nó hoạt động tốt trên Chrome trong Windows chẳng hạn.
Tarik

Bạn có ý nghĩa gì khi thêm hình ảnh thư viện dưới dạng văn bản? Xin lỗi tôi không hoàn toàn làm theo, bạn có phiền giải thích không?
RyanN1220

1
@ RyanN1220 Fontawgie là một thư viện có hình ảnh nhỏ. Và mỗi hình ảnh có một văn bản unicode tương ứng mà bạn có thể áp dụng. Xem liên kết trong câu trả lời cho mã văn bản. ( Fontawesome.com/cheatsheet?from=io#social-buttons ) Nothign đặc biệt, chỉ cần làm theo các ví dụ trong các câu trả lời và bạn sẽ được tốt để đi.
Tarik

26

Bạn có thể sử dụng iconelect.js; Chọn biểu tượng / hình ảnh (combobox, thả xuống)

Demo và tải về; http://orms7a.github.io/iconselect.js/

nhập mô tả hình ảnh ở đây

Sử dụng HTML;

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

Sử dụng 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 này có "yêu cầu" kỳ lạ nhất mà tôi từng thấy; CSS và chức năng cuộn bị hỏng nếu bạn đã <!doctype html>xác định.
Ninja kỹ thuật số

23

Bạn đã có một số câu trả lời đề xuất sử dụng JavaScript / jQuery. Tôi sẽ thêm một giải pháp thay thế chỉ sử dụng HTML và CSS mà không có bất kỳ JS nào.

Ý tưởng cơ bản là sử dụng một tập hợp các nút radio và nhãn (sẽ kích hoạt / hủy kích hoạt các nút radio) và với điều khiển CSS chỉ có nhãn liên quan đến nút radio được chọn sẽ được hiển thị. Nếu bạn muốn cho phép chọn nhiều giá trị, bạn có thể đạt được nó bằng cách sử dụng các hộp kiểm thay vì các nút radio.

Đây là một ví dụ. Mã có thể phức tạp hơn một chút (đặc biệt so với các giải pháp khác):

.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
Cần di chuyển chuột ra cho nó sụp đổ. Nó có thể được thực hiện khi nhấp và không di chuột / di chuyển? Điều này sẽ làm việc trên các thiết bị di động / không chuột?
tgkprog

17

Một giải pháp trình duyệt chéo jQuery khác cho vấn đề này là http://designwithpc.com/Plugins/ddSlick , được tạo ra cho chính xác việc sử dụng này.


2
bản demo xem không hoạt động trên máy tính của tôi (Linux Mint + Firefox 44)
RousseauAlexandre

@RousseauAlexandre kiểm tra bảng điều khiển trên trang web khác đó tôi thấy 403 lỗi cho nội dung của tác giả. Tôi đã gửi cho anh ấy một tin nhắn về nó vì phàn nàn ở đây sẽ không làm được gì cả.
jerrygarciuh

bạn nói đúng, tôi đã nhận được my.hellobar.com/45874_63207.js không tìm thấy lỗi & sau đó TypeError: $(...).ddslickkhông phải là một chức năng trong bảng điều khiển của Firefox
RousseauAlexandre

1
Chỉ cần liên kết đến một thư viện không phải là một câu trả lời tốt. Liên kết với nó, giải thích lý do tại sao nó giải quyết vấn đề và cung cấp mã bằng thư viện để làm như vậy giúp cho câu trả lời tốt hơn. Xem: Làm thế nào tôi có thể liên kết với một nguồn tài nguyên bên ngoài theo cách thân thiện với cộng đồng?
Kevin Brown

12

Với các quốc gia, ngôn ngữ hoặc tiền tệ, bạn có thể sử dụng biểu tượng cảm xúc.

Hoạt động với khá nhiều trình duyệt / HĐH hỗ trợ sử dụng biểu tượng cảm xúc.

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
"Hoạt động với khá nhiều trình duyệt / HĐH hỗ trợ sử dụng biểu tượng cảm xúc" .... ngoại trừ việc Windows không hỗ trợ cờ biểu tượng cảm xúc.
skomisa

... và Google Chrome cũng không, ngay cả ngoài Windows :(
Piskvor rời khỏi tòa nhà

2

Đối với hình ảnh hai màu, bạn có thể sử dụng Fontello và nhập bất kỳ glyph tùy chỉnh nào bạn muốn sử dụng. Chỉ cần tạo hình ảnh của bạn trong Illustrator, lưu vào SVG và thả nó vào trang web Fontello, sau đó tải xuống phông chữ tùy chỉnh của bạn đã sẵn sàng để nhập. Không có JavaScript!


1

Tôi đã thử một số tùy chọn dựa trên jquery với hình ảnh, nhưng không có cái nào hoạt động trong bố cục đáp ứng. Cuối cùng tôi cũng đi qua Bootstrap-Chọn. Sau một số sửa đổi, tôi đã có thể tạo mã này.

Mã và github repo ở đây

nhập mô tả hình ảnh ở đây


12
Chỉ cần liên kết đến một thư viện không phải là một câu trả lời tốt. Liên kết với nó, giải thích lý do tại sao nó giải quyết vấn đề và cung cấp mã bằng thư viện để làm như vậy giúp cho câu trả lời tốt hơn. Xem: Làm thế nào tôi có thể liên kết với một nguồn tài nguyên bên ngoài theo cách thân thiện với cộng đồng?
Kevin Brown

1

Đối với những người muốn hiển thị một biểu tượng và chấp nhận giải pháp "đen trắng", một khả năng là sử dụng các thực thể ký tự:

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

Bằng cách mở rộng, các biểu tượng của bạn có thể được lưu trữ trong một phông chữ tùy chỉnh. Dưới đây là một ví dụ sử dụng phông chữ FontAwgie : https://jsfiddle.net/14606fv9/2/ https://jsfiddle.net/14606fv9/2/

Một lợi ích là nó không yêu cầu bất kỳ Javascript nào. Tuy nhiên, hãy chú ý rằng việc tải phông chữ đầy đủ không làm chậm quá trình tải trang của bạn.

Ghi chú: Giải pháp sử dụng hình nền dường như không còn hoạt động nữa trong Firefox (ít nhất là trong phiên bản 57 "Lượng tử"):

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

1

Alvaros JS trả lời miễn phí là một khởi đầu tuyệt vời đối với tôi và tôi thực sự đã cố gắng để có được một câu trả lời thực sự không có JS mà vẫn cung cấp tất cả các chức năng được mong đợi của Chọn với hình ảnh, nhưng các hình thức lồng nhau đáng buồn là sự thất bại. Tôi đang đăng hai giải pháp ở đây; giải pháp chính của tôi sử dụng 1 dòng JavaScript và giải pháp hoàn toàn không có JavaScript sẽ không hoạt động trong một hình thức khác, nhưng có thể hữu ích cho các menu điều hướng.

Thật không may, có một chút lặp lại trong mã, nhưng khi bạn nghĩ về những gì Chọn thì nó có ý nghĩa. Khi bạn nhấp vào một tùy chọn, nó sao chép văn bản đó vào vùng đã chọn, nghĩa là nhấp vào 1 trong 4 tùy chọn sẽ không thay đổi 4 tùy chọn, nhưng trên cùng sẽ lặp lại văn bản bạn đã nhấp. Để làm điều này với hình ảnh sẽ yêu cầu JavaScript, orrrr ... bạn sao chép các mục.

Trong ví dụ của tôi, chúng tôi có một danh sách các trò chơi (Sản phẩm), có các phiên bản. Mỗi sản phẩm cũng có thể có bản mở rộng, cũng có thể có phiên bản. Đối với mỗi Sản phẩm, chúng tôi cung cấp cho người dùng danh sách từng phiên bản nếu có nhiều hơn một, cùng với một văn bản cụ thể về hình ảnh và phiên bản.

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

Sử dụng JS cho việc bỏ qua hộp kiểm, chúng ta có thể có nhiều phiên bản trên một biểu mẫu. Ở đây tôi đã mở rộng để hiển thị một danh sách Mở rộng, cũng có logic tương tự xung quanh các phiên bản.

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

Tất nhiên, điều này đòi hỏi một chút CSS, điều mà tôi chỉ bao gồm trong JSFiddle này để giảm kích thước của câu trả lời đã rất lớn này. Tôi đã sử dụng Bootstrap 4 để giảm số lượng cần thiết và cũng để cho phép nó phù hợp với các điều khiển Bootstrap khác và mọi tùy chỉnh trang web đã được thực hiện.

Hình ảnh được đặt thành 75px, nhưng điều này có thể dễ dàng thay đổi trong 5 dòng trong .rich-select.rich-select-option-body img


0

Tôi đã có cùng một vấn đề. Giải pháp của tôi là một hướng dẫn về các nút radio, với hình ảnh bên phải của nó. Vì bạn chỉ có thể chọn một tùy chọn duy nhất tại radio, nên nó hoạt động (như) một lựa chọn.

Worket tốt cho tôi. Hy vọng nó có thể giúp đỡ người khác.


1
a <select>không nhất thiết phải chọn một giá trị duy nhất
npup

0

Điều này đang sử dụng ms-Dropdown: https://github.com/marghoobsuleman/ms-Dropdown

Tài nguyên dữ liệu là json. Nhưng bạn không cần sử dụng json. Nếu bạn muốn bạn có thể sử dụng với css.

Ví dụ về Css: https://github.com/marghoobsuleman/ms-Dropdown/tree/master/examples

Json Ví dụ: http://jsfiddle.net/tcibikci/w3rdhj4s/6

HTML

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

Kịch bản

<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

CẬP NHẬT: Tính đến năm 2018, điều này dường như hoạt động ngay bây giờ. Đã thử nghiệm trong Chrome, Firefox, IE và 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
Hình ảnh ở đâu?
BBaysinger

2
Tôi đã thay đổi màu nền thay vì hình ảnh trong ví dụ của mình, nhưng lựa chọn kiểu vẫn chứng minh được điểm đó.
Jon

4
Câu trả lời này hoàn toàn không giải quyết được câu hỏi thực tế ( "Làm thế nào để thêm hình ảnh vào danh sách chọn?" ).
skomisa

1
đủ công bằng. Tôi đã không kiểm tra nó bằng hình ảnh, tôi muốn áp dụng phong cách, đó là cách tôi kết thúc câu hỏi này. Tôi đoán rằng {nền-hình ảnh: url (euro.png);} có thể được thay thế cho {nền-màu: xanh lá cây; } trong ví dụ của tôi. Tôi không có khuynh hướng quay lại và kiểm tra nó.
Jon

không giải quyết câu hỏi ban đầu nào cả.
stag hành
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.