選択リストに画像を追加する方法は?


150

性別の選択リストがあります。

コード:

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

ドロップダウンリストの画像をdrop-down-icon.jpegとして使用したい。

ドロップダウンアイコンの代わりにボタンを追加したい。

どうやってするか?



51
もっとポジティブに。スタックオーバーフローコミュニティは友好的なコミュニティです。
Lucas

一般的な解決策として:可能であれば、アイコンを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 UI使っ例えば、選択を

jQuery UI 1.11から、Selectmenuウィジェットを使用できます。これは、希望するものに非常に近いものです。


21
2015年にW3Cで有効なソリューションはありますか?選択ボックスを再実装せずに?
Ivan Kuckir、2015年

13
2017年はどうですか?まだ解決策はありませんか?
ローレント2017

28
@IvanKuckir-Pffff。W3Cは、なぜこれが行われるべきか、なぜ行われないのかについて、「議論」を続けており、このトピックに関する調査を実施した後、委員会はこれを可能にすることの潜在的な長所と短所について議論します。完了すると、下位互換性に関するフィールド調査が行われます。その後、彼らは色覚障害者のための研究をします。推奨事項が作成されたら、他の要素(チェックボックスなど)の潜在的な副作用について調査します。結局のところ、彼らはすべてのそれらの研究が必要であるかどうかを決定するための研究をするでしょう。
Greeso

6
Firefoxは上記の方法をサポートしなくなりました。
Roshana Pitigala

14
ほぼ2020年、私たちはまだ中世にいます
ブラック

27

私の解決策は、FontAwesomeを使用して、ライブラリイメージをテキストとして追加することです。Unicodeが必要なだけで、Unicodeの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>

font-family:Arial、FontAwesomeに注意してください例に示すように、selectのスタイルで割り当てる必要があります!


2
これはまさに私がやろうとしていたことです!私は本当に別のjsプラグインを実装する必要がなかったので、WebサイトですでにFontAwesomeアイコンを使用しているので、これは完璧です。
パープルレディー

1
このソリューションは、選択された場合にのみ、オプションでは機能しません(ペン:codepen.io/wtfgraciano/pen/YMwWqK
graciano

機能しますが、機能はブラウザに依存します。たとえば、WindowsのChromeでうまく機能します。
Tarik

ライブラリ画像をテキストとして追加するとはどういう意味ですか?申し訳ありませんが、よくわかりません。説明してもよろしいですか?
RyanN1220

1
@ RyanN1220 Fontawesomeはライブラリにミニ画像があります。また、各画像には、適用できる対応するUnicodeテキストがあります。テキストコードについては、回答のリンクを参照してください。(fontawesome.com/cheatsheet?from=io#social-buttons)特別なものはありません。答えの例に従うだけで問題ありません。
Tarik

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
このプラグインには、私が今まで見た中で最も奇妙な「要件」があります。<!doctype html>定義すると、CSSとスクロール機能が機能しなくなります。
Digital Ninja

23

JavaScript / jQueryの使用を提案するいくつかの回答があります。JSなしでHTMLとCSSのみを使用する代替を追加します。

基本的な考え方は、ラジオボタンとラベル(ラジオボタンをアクティブ化/非アクティブ化)のセットを使用し、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

この問題に対するもう1つの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

国、言語、通貨で絵文字を使用できます。

絵文字の使用をサポートするほとんどすべてのブラウザー/ OSで動作します。

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
"絵文字の使用をサポートするほとんどすべてのブラウザ/ OSで動作します" .... Windowsが絵文字フラグをサポートしていないことを除きます。
スコミサ

...そしてWindowsの外でもGoogle Chromeはそうではありません:(
Piskvorは

2

2色の画像の場合、Fontelloを使用して、使用するカスタムグリフをインポートできます。Illustratorで画像を作成し、SVGに保存してFontelloサイトにドロップし、インポートする準備ができているカスタムフォントをダウンロードするだけです。JavaScriptなし!


1

画像を使用してjqueryベースのカスタム選択をいくつか試しましたが、レスポンシブレイアウトでは機能しませんでした。最後に、Bootstrap-Selectに遭遇しました。いくつかの変更の後、私はこのコードを生成することができました。

ここにコードとgithubレポ

ここに画像の説明を入力してください


12
ライブラリにリンクするだけでは良い答えではありません。それにリンクし、問題を解決する理由を説明し、ライブラリを使用してコードを提供することで、より良い答えが得られます。参照:コミュニティフレンドリーな方法で外部リソースにリンクするにはどうすればよいですか?
ケビンブラウン

1

アイコンを表示し、「白黒」のソリューションを受け入れる場合、1つの可能性は文字エンティティを使用することです。

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

さらに、アイコンはカスタムフォントで保存できます。FontAwesomeフォントを使用した例を次に示します 。https//jsfiddle.net/14606fv9/2/ https://jsfiddle.net/14606fv9/2/

1つの利点は、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自由回答は私にとって素晴らしいスタートでした。私は本当に、画像付きのSelectに期待されるすべての機能を提供する本当にJSのない回答を取得しようとしましたが、悲しいことにフォームのネストは。ここに2つの解決策を掲載します。JavaScriptの1行を使用する私の主なソリューションと、JavaScriptを使用しない完全に別のフォーム内では機能しないソリューションですが、ナビゲーションメニューには役立つかもしれません。

残念ながら、コードには少し繰り返しがありますが、選択が何をするかを考えるとき、それは理にかなっています。オプションをクリックすると、そのテキストが選択した領域にコピーされます。つまり、4つのオプションの1つをクリックしても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コントロールや行われたサイトのカスタマイズに合わせることができるようにしました。

画像は、75pxに設定されているが、これは容易に5行に変更することができる.rich-select.rich-select-option-body img


0

同じ問題が発生しました。私の解決策は、ラジオボタンのforeachで、その右に画像が表示されていました。ラジオでは1つのオプションしか選択できないので、それは選択のように機能します。

私のためによく働きなさい。それが他の誰かを助けることを願っています。


1
a <select>は必ずしも単一の値を選択するためのものではありません
npup 2014年

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
私の例では、画像の代わりに背景色を変更していましたが、スタイルの選択は依然として重要です。
Jon

4
この回答は、実際の質問(「選択リストに画像を追加する方法」)にはまったく対応していません。
スコミサ

1
けっこうだ。私は画像でそれをテストしなかった、私はスタイルを適用したかった、それが私がこの質問に終わった方法である。{background-image:url(euro.png);}を{background-color:green;の代わりに使用できると思いました。私の例では}。私は戻ってそれをテストする傾向はありません。
Jon

元の質問にはまったく対応していません。
staggart
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.