CSSだけで<select>ドロップダウンをスタイルするにはどうすればよいですか?


1333

CSSのみでスタイルを設定する方法はありますか <select>ドロップダウンますか?

<select>JavaScriptを使用せずに、人間が可能な限りフォームのスタイルを設定する必要があります。CSSでこれを行うために使用できるプロパティは何ですか?

このコードは、すべての主要なブラウザーと互換性がある必要があります。

  • Internet Explorer 6、7、および8
  • Firefox
  • サファリ

私はJavaScript:例でそれを作ることができることを知っています。

そして、私は単純なスタイリングについて話しているのではありません。CSSだけで何ができるのか知りたい。

Stack Overflowで同様の質問を見つけました。

そして、これはDoctype.comにあります。


1
グーグルのみのjsソリューションにはあまりありません
Jitendra Vyas

41
私はそれが正当な質問だと感じていますが、答えは「いいえ、本当ではない」または「あなたが望む方法ではない」です。しかし、誰も(私も)それについて100%確信しているわけではありません。この曖昧さの感覚が読者の肌の下を這い、質問の正当性が疑問視されます。
ZJR 2009

1
@Jitendra、私はあなたが何をしているのか知っています。質問をより明確にしていただければ幸いです。さらに、あなたが探しているものを見つけたと思います。これは実験的なものですが、確認してください:cappuccino.org/aristo/showcase
jeremyosborne 2009

1
@jeremyosborne-返信ありがとうございます。私はjavascriptでそれを作ることができることを知っています。あなたのeaxmpleリンクはJSに基づいています。私が知りたかったので、なぜ私がこの質問をしたのですか?cssだけで何ができるかについて誰もが知っていますか
Jitendra Vyas

@Jitendra質問を更新していただきありがとうございます。持っている制約(CSSのみでJSなし)で確実に実行できる最善の方法は、書体(フォント)、背景と前景(テキスト)の色、境界線のサイズ、外観と色、配置、およびサイズ(通常はタイプを介して)を変更することです。フォントによる設定)。それでも、すべてのブラウザで同じように見えるようにするには、おそらくいくつかの調整が必要になります。それよりも良い答えを知っていればいいのですが、見逃したことがありますが、そうは思いません。
jeremyosborne 2009

回答:


1027

3つのソリューションがあります。

ソリューション#1-外観:なし-Internet Explorer 10から11の回避策(デモ

-

appearance: noneselect要素に設定されているデフォルトの矢印を非表示にするには、独自のカスタム矢印を追加しますbackground-image

select {
   -webkit-appearance: none;
   -moz-appearance: none;
   appearance: none;       /* Remove default arrow */
   background-image: url(...);   /* Add custom arrow */
}

ブラウザサポート:

appearance: noneは非常に優れたブラウザサポート(caniuse)を備えています-Internet Explorer 11以降およびFirefox 34以降を除きます。

以下を追加することにより、この手法を改善し、Internet Explorer 10およびInternet Explorer 11のサポートを追加できます。

select::-ms-expand {
    display: none; /* Hide the default arrow in Internet Explorer 10 and Internet Explorer 11 */
}

Internet Explorer 9が問題である場合、デフォルトの矢印を削除する方法はありません(つまり、2つの矢印があることになります)が、ファンキーなInternet Explorer 9セレクターを使用できます。

少なくともカスタム矢印を元に戻すには-デフォルトの選択矢印をそのままにします。

/* Target Internet Explorer 9 to undo the custom arrow */
@media screen and (min-width:0\0) {
    select {
        background-image:none\9;
        padding: 5px\9;
    }
}

すべて一緒に:

このソリューションは簡単で、ブラウザが適切にサポートされています。通常はこれで十分です。


Internet Explorer 9(およびそれ以降)およびFirefox 34(およびそれ以降)のブラウザーサポートが必要な場合は、読み続けてください...

ソリューション#2 select要素を切り捨ててデフォルトの矢印を非表示にする(デモ

-

(詳細はこちら)

ラップselectでのdiv内の要素を一定の幅overflow:hidden

次に、select要素にdivよりも20ピクセル大きい幅を与えますます。

その結果、select要素のデフォルトのドロップダウン矢印が非表示になります(overflow:hiddenコンテナー上にあるため)、必要な背景画像をdivの右側に配置できます。

このアプローチの利点は、クロスブラウザー(Internet Explorer 8以降、WebKitGecko)であることです。ただし、このアプローチの欠点は、オプションのドロップダウンが右側に突き出ていることです(オプションエレメントがselectエレメントの幅を取るため、非表示にした20ピクセル分)。

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

[ただし、カスタムのselect要素がモバイルデバイスにのみ必要な場合、上記の問題は当てはまりません。各電話機がネイティブでselect要素を開く方法が原因です。したがって、モバイルの場合、これが最善の解決策になる可能性があります。]


Firefoxでカスタム矢印が必要な場合- バージョン35より前が、古いバージョンのInternet Explorerをサポートする必要がない場合は、読み続けてください...

解決策#3- pointer-eventsプロパティを使用する(デモ

-

(詳細はこちら)

ここでのアイデアは、ネイティブのドロップダウン矢印の上に要素をオーバーレイし(カスタムドロップダウン矢印を作成するため)、その上でのポインターイベントを許可しないことです。

利点: WebKitとGeckoでうまく機能します。それも見栄えが良い(option要素を突き出さない)。

欠点: Internet Explorer(Internet Explorer 10以前)はサポートしていませんpointer-events以前。つまり、カスタム矢印をクリックできません。また、この方法のもう1つの(明らかな)欠点は、ホバーエフェクトまたはハンドカーソルを使用して新しい矢印の画像をターゲットにできないことです。

ただし、この方法では、Modernizerまたは条件付きコメントを使用して、Internet Explorerを標準の組み込み矢印に戻すことができます。

注意: Internet Explorer 10はconditional commentsもうサポートしていません。このアプローチを使用する場合は、おそらくModernizrを使用する必要があります。ただし、ここで説明するCSSハックを使用して、ポインタイベントCSSをInternet Explorer 10から除外することは可能です


1
これらの2つの方法のうち、あなたに合ったものはどれですか。
Jitendra Vyas

3
設計要件によって異なります。ドロップダウンが突き出ていても問題ない場合は、クロスブラウザー(IMO allbrowsers + IE8 +はクロスブラウザーと見なすことができる)であるため、これが最適ですが、多くの人がそうだと思いますが、そうはいきません。したがって、上記の実際の説明では、アプローチ#2が最良であることを意味しました。
Danield

4
また、私が投稿したフィドルは、IEがデフォルトの矢印を使用できるように、条件付きステートメントを使用したアプローチ#2を使用しています。
Danield

3
@AlexisLeclerc divの修正と同じ幅への選択は、Chromeなどの-webkitブラウザーでのみ機能します。(ルールを含めたため-webkit-appearance:none;)ただし、これは、firefoxなどの他のブラウザでは機能しません
Danield

4
私がアプローチ#1の改善を提案するかもしれない場合、私は個人的に右側の境界線の欠如または選択ハローの欠如が非常に迷惑であることに気づきます。私は現在のプロジェクトで使用しているjsfiddle.net/YvCHW/1745でフィドルを更新しました。あなたの考えを教えてください!
Alexis Leclerc

233

それは可能ですが、残念ながら、ほとんどがWebKitベースのブラウザーで、開発者として必要な範囲で行われます。以下は、組み込みの開発者ツールインスペクタを介してChromeオプションパネルから収集されたCSSスタイル設定の例です。最新のほとんどのブラウザで現在サポートされているCSSプロパティと一致するように改善されています。

select {
    -webkit-appearance: button;
    -moz-appearance: button;
    -webkit-user-select: none;
    -moz-user-select: none;
    -webkit-padding-end: 20px;
    -moz-padding-end: 20px;
    -webkit-padding-start: 2px;
    -moz-padding-start: 2px;
    background-color: #F07575; /* Fallback color if gradients are not supported */
    background-image: url(../images/select-arrow.png), -webkit-linear-gradient(top, #E5E5E5, #F4F4F4); /* For Chrome and Safari */
    background-image: url(../images/select-arrow.png), -moz-linear-gradient(top, #E5E5E5, #F4F4F4); /* For old Firefox (3.6 to 15) */
    background-image: url(../images/select-arrow.png), -ms-linear-gradient(top, #E5E5E5, #F4F4F4); /* For pre-releases of Internet Explorer  10*/
    background-image: url(../images/select-arrow.png), -o-linear-gradient(top, #E5E5E5, #F4F4F4); /* For old Opera (11.1 to 12.0) */
    background-image: url(../images/select-arrow.png), linear-gradient(to bottom, #E5E5E5, #F4F4F4); /* Standard syntax; must be last */
    background-position: center right;
    background-repeat: no-repeat;
    border: 1px solid #AAA;
    border-radius: 2px;
    box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);
    color: #555;
    font-size: inherit;
    margin: 0;
    overflow: hidden;
    padding-top: 2px;
    padding-bottom: 2px;
    text-overflow: ellipsis;
    white-space: nowrap;
}

WebKitベースのブラウザー内の任意のページでこのコードを実行すると、選択ボックスの外観が変更され、標準のOS矢印を削除してPNG矢印を追加し、ラベルの前後にほとんど何でもスペースを入れます。

最も重要な部分はappearanceプロパティであり、要素の動作を変更します。

GeckoはappearanceWebKit ほどサポートしていないようですが、モバイルブラウザーを含むほぼすべてのWebKitベースのブラウザーで完全に機能します。


4
ねえ、Firefox 12の時点で選択ボックスの外観が非常に異なっており(Chrome(Macを持っている)のように見えます)に気づき、FF 12はより多くの外観属性をサポートしているようです。
CWSpear 2012

3
クロムのみのソリューション...私もこれもクライアントにも支払いません。Xブラウザーソリューションについては、@ Dianeldの回答を参照してください。
Adrien Be 14

41
@AdrienBe私のソリューションはほぼ3年前に提案されました。当時は、JavaScriptライブラリやプラグインを使用せずに選択ボックスのスタイルを変更する唯一の合理的な方法でした。接頭辞付きの属性を削除することを決定した場合でも実行可能ですが、Webkitベースのブラウザー(Safari、新しいOpera + Androidも同様)でのみ確実に機能します。現在、より良い解決策があるかもしれないので、無意味なコメントを追加する代わりに、あなたがより良いと思う解決策に投票し、将来的には「回答済み」の日付を確認してください。ありがとう。
Matthew Morek、2014

4
@MatthewMorek:3年前でさえ、より良い解決策がありました。ダニエルの答えは、ブラウザー間のサポート(IE8以降、WebKit、およびGeckoをサポート)に関してはるかに優れています。質問は、「コードはすべての主要なブラウザーと互換性がある必要があります:Internet Explorer 6,7および8、Firefox&Safari」です。このxブラウザーの要件は、2013年にPaul Sweatteによって追加された可能性があります...その場合は申し訳ありません。
Adrien Be

3
追加text-indent: 0.01px; text-overflow: "";するとさらにうまくいきます
Ivan

64

選択要素とそのドロップダウン機能のスタイルを設定するの困難です。

Chris Heilmannによる select要素のスタイル属性は、最初の回答へのコメントでRyan Doheryが言ったことを確認します。

「select要素は、ブラウザのクロムではなく、オペレーティングシステムの一部です。そのため、スタイルを設定することは非常に信頼できず、とにかく試すことは必ずしも意味がありません。」


47

私はこれとまったく同じ問題を抱えていましたが、画像を使用できず、ブラウザのサポートによる制限もありませんでした。これは「仕様どおり」であり、運が良ければどこでも動作するようになります。

擬似要素は選択要素では機能しないため、レイヤー化された回転背景レイヤーを使用してドロップダウン矢印を「切り取り」ます。

編集:この更新バージョンでは、CSS変数と小さなテーマシステムを使用しています。

:root {
  --radius: 2px;
  --baseFg: dimgray;
  --baseBg: white;
  --accentFg: #006fc2;
  --accentBg: #bae1ff;
}

.theme-pink {
  --radius: 2em;
  --baseFg: #c70062;
  --baseBg: #ffe3f1;
  --accentFg: #c70062;
  --accentBg: #ffaad4;
}

.theme-construction {
  --radius: 0;
  --baseFg: white;
  --baseBg: black;
  --accentFg: black;
  --accentBg: orange;
}

select {
  font: 400 12px/1.3 sans-serif;
  -webkit-appearance: none;
  appearance: none;
  color: var(--baseFg);
  border: 1px solid var(--baseFg);
  line-height: 1;
  outline: 0;
  padding: 0.65em 2.5em 0.55em 0.75em;
  border-radius: var(--radius);
  background-color: var(--baseBg);
  background-image: linear-gradient(var(--baseFg), var(--baseFg)),
    linear-gradient(-135deg, transparent 50%, var(--accentBg) 50%),
    linear-gradient(-225deg, transparent 50%, var(--accentBg) 50%),
    linear-gradient(var(--accentBg) 42%, var(--accentFg) 42%);
  background-repeat: no-repeat, no-repeat, no-repeat, no-repeat;
  background-size: 1px 100%, 20px 22px, 20px 22px, 20px 100%;
  background-position: right 20px center, right bottom, right bottom, right bottom;   
}

select:hover {
  background-image: linear-gradient(var(--accentFg), var(--accentFg)),
    linear-gradient(-135deg, transparent 50%, var(--accentFg) 50%),
    linear-gradient(-225deg, transparent 50%, var(--accentFg) 50%),
    linear-gradient(var(--accentFg) 42%, var(--accentBg) 42%);
}

select:active {
  background-image: linear-gradient(var(--accentFg), var(--accentFg)),
    linear-gradient(-135deg, transparent 50%, var(--accentFg) 50%),
    linear-gradient(-225deg, transparent 50%, var(--accentFg) 50%),
    linear-gradient(var(--accentFg) 42%, var(--accentBg) 42%);
  color: var(--accentBg);
  border-color: var(--accentFg);
  background-color: var(--accentFg);
}
<select>
  <option>So many options</option>
  <option>...</option>
</select>

<select class="theme-pink">
  <option>So many options</option>
  <option>...</option>
</select>

<select class="theme-construction">
  <option>So many options</option>
  <option>...</option>
</select>


5
うわー、これは私が見た中で最もクールなソリューションの一つです。MacのChromeとSafariの最新バージョンで動作します。他のブラウザはどうですか?
Tintin81 2017年

2
次のものを追加してFirefoxで動作します-moz-appearance: none;
Zac

45

選択ドロップダウンのスタイル設定で気付いた最大の矛盾は、SafariGoogle Chromeのレンダリングです(FirefoxはCSSを介して完全にカスタマイズ可能です)。インターネットのあいまいな深さをいくつか検索した後、私は以下に出くわしました。これにより、WebKitによる私の不安はほぼ完全に解決されます。

SafariとGoogle Chromeの修正

select {
  -webkit-appearance: none;
}

ただし、ドロップダウン矢印は削除されます。div背景、負のマージン、または選択したドロップダウンの上に絶対的に配置されたを使用して、ドロップダウン矢印を追加できます。

*詳細およびその他の変数は、CSSプロパティ-webkit-appearanceで利用できます。


1
その後、スタイリングを追加することを忘れないでください;)しかし、私は今日このコメントを読んでとても嬉しく思います。
teewuane、

1
「FirefoxはCSSを介して完全にカスタマイズ可能です」という説明を詳しく教えていただけますか?FirefoxはAppearenceプロパティをサポートしていないようです... Firefoxでこれをどのように行うのでしょうか?
Danield

36

<select>タグは、ブラウザーでレンダリングされたHTMLページ上の他のHTML要素と同様に、CSSを介してスタイルを設定できます。以下は、ページ上に選択要素を配置し、オプションのテキストを青色で表示する(非常に単純な)例です。

HTMLファイルの例(selectExample.html):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  <title>Select Styling</title>
  <link href="selectExample.css" rel="stylesheet">
</head>
<body>
<select id="styledSelect" class="blueText">
  <option value="apple">Apple</option>
  <option value="orange">Orange</option>
  <option value="cherry">Cherry</option>
</select>
</body>
</html>

CSSファイルの例(selectExample.css):

/* All select elements on page */
select {
  position: relative;
}

/* Style by class. Effects the text of the contained options. */
.blueText {
  color: #0000FF;
}

/* Style by id. Effects position of the select drop down. */
#styledSelect {
  left: 100px;
}

30
すごい、初めて「おばあちゃん」がインターネットにかかわっているのを失礼なことなく見た。+1!
BaL 2012

34
この答えはこの質問を解決しません。選択入力のみをスタイル設定し、ドロップダウンはスタイル設定しません
Kyborek

14
この回答では、ブラウザー間の整合性を保つためにドロップダウンリストをスタイルするという課題を完全に無視しています。これは非常に簡単な答えです。
BentOnCoding

18

ブログ投稿How to CSS form drop down style JavaScriptが機能しませんが、Operaでは失敗します:

select {
  border: 0 none;
  color: #FFFFFF;
  background: transparent;
  font-size: 20px;
  font-weight: bold;
  padding: 2px 10px;
  width: 378px;
  *width: 350px;
  *background: #58B14C;
}

#mainselection {
  overflow: hidden;
  width: 350px;
  -moz-border-radius: 9px 9px 9px 9px;
  -webkit-border-radius: 9px 9px 9px 9px;
  border-radius: 9px 9px 9px 9px;
  box-shadow: 1px 1px 11px #330033;
  background: url("arrow.gif") no-repeat scroll 319px 5px #58B14C;
}
<div id="mainselection">
  <select>
    <option>Select an Option</option>
    <option>Option 1</option>
    <option>Option 2</option>
  </select>
</div>


17

ここにすべての最新のブラウザで動作するバージョンがあります。キーを使用しappearance:noneて、デフォルトのフォーマットを削除します。すべての書式設定がなくなったので、選択と入力を視覚的に区別する矢印を追加する必要があります。

作業例:https : //jsfiddle.net/gs2q1c7p/

select:not([multiple]) {
    -webkit-appearance: none;
    -moz-appearance: none;
    background-position: right 50%;
    background-repeat: no-repeat;
    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAMCAYAAABSgIzaAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDZFNDEwNjlGNzFEMTFFMkJEQ0VDRTM1N0RCMzMyMkIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDZFNDEwNkFGNzFEMTFFMkJEQ0VDRTM1N0RCMzMyMkIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0NkU0MTA2N0Y3MUQxMUUyQkRDRUNFMzU3REIzMzIyQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0NkU0MTA2OEY3MUQxMUUyQkRDRUNFMzU3REIzMzIyQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PuGsgwQAAAA5SURBVHjaYvz//z8DOYCJgUxAf42MQIzTk0D/M+KzkRGPoQSdykiKJrBGpOhgJFYTWNEIiEeAAAMAzNENEOH+do8AAAAASUVORK5CYII=);
    padding: .5em;
    padding-right: 1.5em
}

#mySelect {
    border-radius: 0
}
<select id="mySelect">
    <option>Option 1</option>
    <option>Option 2</option>
</select>


16

Bootstrapを使用してあなたのケースに行きました。これが機能する最も簡単なソリューションです。

select.form-control {
    -moz-appearance: none;
    -webkit-appearance: none;
    appearance: none;
    background-position: right center;
    background-repeat: no-repeat;
    background-size: 1ex;
    background-origin: content-box;
    background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0ic3ZnMiIKICAgdmlld0JveD0iMCAwIDM1Ljk3MDk4MyAyMy4wOTE1MTgiCiAgIGhlaWdodD0iNi41MTY5Mzk2bW0iCiAgIHdpZHRoPSIxMC4xNTE4MTFtbSI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjAyLjAxNDUxLC00MDcuMTIyMjUpIgogICAgIGlkPSJsYXllcjEiPgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0MzMzNiIKICAgICAgIHk9IjYyOS41MDUwNyIKICAgICAgIHg9IjI5MS40Mjg1NiIKICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOjQwcHg7bGluZS1oZWlnaHQ6MTI1JTtmb250LWZhbWlseTpzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIj48dHNwYW4KICAgICAgICAgeT0iNjI5LjUwNTA3IgogICAgICAgICB4PSIyOTEuNDI4NTYiCiAgICAgICAgIGlkPSJ0c3BhbjMzMzgiPjwvdHNwYW4+PC90ZXh0PgogICAgPGcKICAgICAgIGlkPSJ0ZXh0MzM0MCIKICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZTo0MHB4O2xpbmUtaGVpZ2h0OjEyNSU7Zm9udC1mYW1pbHk6Rm9udEF3ZXNvbWU7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpGb250QXdlc29tZTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIj4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGgzMzQ1IgogICAgICAgICBzdHlsZT0iZmlsbDojMzMzMzMzO2ZpbGwtb3BhY2l0eToxIgogICAgICAgICBkPSJtIDIzNy41NjY5Niw0MTMuMjU1MDcgYyAwLjU1ODA0LC0wLjU1ODA0IDAuNTU4MDQsLTEuNDczMjIgMCwtMi4wMzEyNSBsIC0zLjcwNTM1LC0zLjY4MzA0IGMgLTAuNTU4MDQsLTAuNTU4MDQgLTEuNDUwOSwtMC41NTgwNCAtMi4wMDg5MywwIEwgMjIwLDQxOS4zOTM0NiAyMDguMTQ3MzIsNDA3LjU0MDc4IGMgLTAuNTU4MDMsLTAuNTU4MDQgLTEuNDUwODksLTAuNTU4MDQgLTIuMDA4OTMsMCBsIC0zLjcwNTM1LDMuNjgzMDQgYyAtMC41NTgwNCwwLjU1ODAzIC0wLjU1ODA0LDEuNDczMjEgMCwyLjAzMTI1IGwgMTYuNTYyNSwxNi41NDAxNyBjIDAuNTU4MDMsMC41NTgwNCAxLjQ1MDg5LDAuNTU4MDQgMi4wMDg5MiwwIGwgMTYuNTYyNSwtMTYuNTQwMTcgeiIgLz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo=");
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" />
<section class="container">
  <form class="form-horizontal">
    <select class="form-control">
      <option>One</option>
      <option>Two</option>
    </select>
  </form>
</section>

注:base64のものはfa-chevron-downSVGにあります。


12

最近のブラウザでは<select>、CSSでスタイルを設定するのは比較的簡単です。appearance: none(それはあなたが望むものの場合)だけトリッキーな部分は、矢印を置き換えています。data:プレーンテキストのSVGでインラインURIを使用するソリューションは次のとおりです。

select {
  -moz-appearance: none;
  -webkit-appearance: none;
  appearance: none;
  
  background-repeat: no-repeat;
  background-size: 0.5em auto;
  background-position: right 0.25em center;
  padding-right: 1em;
  
  background-image: url("data:image/svg+xml;charset=utf-8, \
    <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 60 40'> \
      <polygon points='0,0 60,0 30,40' style='fill:black;'/> \
    </svg>");
}
<select>
  <option>Option 1</option>
  <option>Option 2</option>
</select>

<select style="font-size: 2rem;">
  <option>Option 1</option>
  <option>Option 2</option>
</select>

残りのスタイリング(境界線、パディング、色など)はかなり単純です。

これは私が試したすべてのブラウザー(Firefox 50、Chrome 55、Edge 38、およびSafari 10)で機能します。Firefoxに関する注意点の1つ#は、データURIで文字を使用する場合(たとえばfill: #000)、エスケープする必要がある(fill: %23000)ことです。


1
CSSプロパティの代わりに、タグのheightand / or width属性を使用してSVGのサイズを変更することもでき<svg>ますbackground-size
gitaarik

10
select  {
    outline: 0;
    overflow: hidden;
    height: 30px;
    background: #2c343c;
    color: #747a80;
    border: #2c343c;
    padding: 5px 3px 5px 10px;
    -moz-border-radius: 6px;
    -webkit-border-radius: 6px;
    border-radius: 10px;
}

select option {border: 1px solid #000; background: #010;}

現在のChromeではそれで何も選択できません。
Vitaly Zdanevich 2018年

9

カスタム選択CSSスタイル

Internet Explorer(10および11)、Edge、Firefox、Chromeでテスト済み

select::-ms-expand {
  display: none;
}
select {
  display: inline-block;
  box-sizing: border-box;
  padding: 0.5em 2em 0.5em 0.5em;
  border: 1px solid #eee;
  font: inherit;
  line-height: inherit;
  -webkit-appearance: none;
  -moz-appearance: none;
  -ms-appearance: none;
  appearance: none;
  background-repeat: no-repeat;
  background-image: linear-gradient(45deg, transparent 50%, currentColor 50%), linear-gradient(135deg, currentColor 50%, transparent 50%);
  background-position: right 15px top 1em, right 10px top 1em;
  background-size: 5px 5px, 5px 5px;
}
<select name="">
  <option value="">Lorem</option>
  <option value="">Lorem Ipsum</option>
</select>

<select name="" disabled>
  <option value="">Disabled</option>
</select>

<select name="" style="color:red;">
  <option value="">Color!</option>
  <option value="">Lorem Ipsum</option>
</select>


やや適応性が高い(ただし、すべてのブラウザでテストされていない):background-position: right 15px center, right 10px center;
Robin Stewart

8

clipプロパティを使用して、境界線と矢印をトリミングしますselect要素の独自の置換スタイルをラッパーに追加します。

    <!DOCTYPE html>
    <html>
      <head>
        <style>
          select { position: absolute; clip:rect(2px 49px 19px 2px); z-index:2; }
          body > span { display:block; position: relative; width: 64px; height: 21px; border: 2px solid green;  background: url(http://www.stackoverflow.com/favicon.ico) right 1px no-repeat; }
        </style>
      </head>
      <span>
        <select>
          <option value="">Alpha</option>
          <option value="">Beta</option>
          <option value="">Charlie</option>
        </select>
      </span>
    </html>

不透明度がゼロの2番目の選択を使用して、ボタンをクリック可能にします。

    <!DOCTYPE html>
    <html>
      <head>
        <style>
          #real { position: absolute; clip:rect(2px 51px 19px 2px); z-index:2; }
          #fake { position: absolute; opacity: 0; }
    
          body > span { display:block; position: relative; width: 64px; height: 21px; background: url(http://www.stackoverflow.com/favicon.ico) right 1px no-repeat; }
        </style>
      </head>
      <span>
        <select id="real">
          <option value="">Alpha</option>
          <option value="">Beta</option>
          <option value="">Charlie</option>
        </select>
        <select id="fake">
          <option value="">Alpha</option>
          <option value="">Beta</option>
          <option value="">Charlie</option>
        </select>
      </span>
    </html>

Webkitと他のブラウザーでは座標が異なりますが、@ mediaクエリで対応できます

参考文献


1
少なくともChromeでは、私にとってはうまく機能しています。クリップ:rect(2px 85px 128px 2px); z-index:2; padding-left:18px; padding-right:18px; マージン:7px自動; 色:#555; font-size:継承。背景色:透明;
BrianFreud、2012年

1
IE7では、選択範囲の境界線を制御できないため、矢印のトリミングは半分しか機能しないことがわかりました。
CpILL


1
@PaulSweatte、すごい、これはあなたの20番目のネクロマンサーです!おめでとうございます。また、金色のネクロマンサーバッジに対する私のすべてのクエリを上回りました。
Nemo

5

トリックを使用:after:beforeて行う非常に優れた例は、CSS3を使用したセレクトボックスのスタイル設定です。CSSDeck


1
はい。ただし、問題の要件はInternet Explorer 6、7、8と互換性があったはずです
Jitendra Vyas 2013

2
はい、それはIEと互換性がありませんが、私が探していた最新のソリューションを探している人のために共有するのが大好きでした。
Ahmad Ajmi 2013

5

この要素を編集することはお勧めしませんが、試したい場合は他のHTML要素と同じです。

例を編集:

/* Edit select */
select {
    /* CSS style here */
}

/* Edit option */
option {
    /* CSS style here */
}

/* Edit selected option */
/* element  attr    attr value */
option[selected="selected"] {
    /* CSS style here */
}
<select>
    <option >Something #1</option>
    <option selected="selected">Something #2</option>
    <option >Something #3</option>
</select>

2
@MikkoP:編集を提案する際、よりわかりやすい編集の要約を提供していただけますか?「メッセージの改善」は、私たちのレビュアーにとって高レベルの要約としてはあまり役に立ちません。ありがとう。
ジャン=フランソワ・コルベット

1
@Jean-FrançoisCorbettより具体的に説明します:)
MikkoP

1
オプション要素をスタイルすることはできません(このSOの回答をご覧ください:stackoverflow.com/a/7208814/703717
Danield

4
label {
    position: relative;
    display: inline-block;
}
select {
    display: inline-block;
    padding: 4px 3px 5px 5px;
    width: 150px;
    outline: none;
    color: black;
    border: 1px solid #C8BFC4;
    border-radius: 4px;
    box-shadow: inset 1px 1px 2px #ddd8dc;
    background-color: lightblue;
}

これは、選択した要素の背景色を使用し、画像を削除しました。


4

はい。次のように、タグ名でHTML要素のスタイルを設定できます。

select {
  font-weight: bold;
}

もちろん、他の要素と同様に、CSSクラスを使用してスタイルを設定することもできます。

<select class="important">
  <option>Important Option</option>
  <option>Another Important Option</option>
</select>

<style type="text/css">
  .important {
    font-weight: bold;
  }
</style>

6
私はこのような話をしていません。ドロップダウン矢印を別のものに変更したいのです。
Jitendra Vyas

5
ドロップダウン矢印を別の画像にスタイルすることはできません。OSによって制御されます。本当に必要な場合は、DHTMLドロップダウンウィジェットを使用することをお勧めします。
ライアンドハーティ

3
CSSプロパティは、CSSを介してのみ変更できます。マージン、パディング、フォントプロパティ、背景色などを変更できます。完全に異なって見えるようにしたい場合は、基本的にJavaScriptを介して実行時にグラフィックスで置き換える必要があります(うまくいけば、ひどい解決策ではありません) )。
Dave Ward、

4

これは、このディスカッションからの私のお気に入りのアイデアに基づくソリューションです。これにより、追加のマークアップなしで<select>要素を直接スタイルできます。

これはInternet Explorer 10以降で動作し、Internet Explorer 8/9の安全なフォールバックを備えています。これらのブラウザの注意点の1つは、背景画像を配置し、ネイティブの展開コントロールの背後に隠れるために十分に小さくする必要があることです。

HTML

<select name='options'>
  <option value='option-1'>Option 1</option>
  <option value='option-2'>Option 2</option>
  <option value='option-3'>Option 3</option>
</select>

SCSS

body {
  padding: 4em 40%;
  text-align: center;
}

select {
  $bg-color: lightcyan;
  $text-color: black;
  appearance: none; // Using -prefix-free http://leaverou.github.io/prefixfree/
  background: {
    color: $bg-color;
    image: url("https://s3-us-west-2.amazonaws.com/s.cdpn.io/1255/caret--down-15.png");
    position: right;
    repeat: no-repeat;
  }
  border: {
    color: mix($bg-color, black, 80%);
    radius: .2em;
    style: solid;
    width: 1px;
    right-color: mix($bg-color, black, 60%);
    bottom-color: mix($bg-color, black, 60%);
  }
  color: $text-color;
  padding: .33em .5em;
  width: 100%;
}

// Removes default arrow for Internet Explorer 10 (and later)
// Internet Explorer 8/9 gets the default arrow which covers the caret
// image as long as the caret image is smaller than and positioned
// behind the default arrow
select::-ms-expand {
    display: none;
}

CodePen

http://codepen.io/ralgh/pen/gpgbGx


3

Internet Explorer 10以降では、::-ms-expand疑似要素セレクターを使用して、ドロップダウン矢印要素のスタイルを設定し、非表示にできます。

select::-ms-expand {
    display:none;
    /* or visibility: hidden; to keep it's space/hitbox */
}

残りのスタイリングは他のブラウザーと同様でなければなりません。

IE10のサポートを適用するDanieldのjsfiddleの基本的なフォークは次のとおりです


3

簡単な方法があります。

このフィドルをチェックして、私に過度のスタイルを許してください: ください https //jsfiddle.net/dkellner/7ac9us70/

裏技:<select>タグが "size"と呼ばれるプロパティを取得するとすぐに、高さが固定されたリストとして動作し、突然、なんらかの理由で、その外にスタイルを設定できます。厳密に言えば、固定リストは副作用ですが、「ドロップダウンされた外観」に使用するため、さらに役立ちます。

最小限の例:

<style>

    .stylish span   {position:relative;}
    .stylish select {position:absolute;left:0px;display:none}

</style>
...
<div class="stylish">
    <label> Choose your superhero: </label>
    <span>
        <input onclick="$(this).closest('div').find('select').slideToggle(110)"><br>
        <select size=15 onclick="$(this).hide().closest('div').find('input').val($(this).find('option:selected').text());">

            <optgroup label="Fantasy"></optgroup>
            <option value="1">  Gandalf        </option>
            <option value="2">  Harry Potter   </option>
            <option value="3">  Jon Snow       </option>

            <!-- ... and so on -->

        </select>
    </span>
</div>

(簡単にするために、jQueryでそれを行いましたが、それなしでも同じことができます)

サイドノート

  • このソリューションは、単なる選択以上のものを提供します。値は手動で編集することもできます。デフォルトの選択制限付きの方法を使用する場合は、readonlyプロパティを使用します。

  • スタイリングの可能性を最大化するために、<optgroup>タグは子の周りではなく、それらの前に移動さます。それは意図的なものであり、視覚的に明確であり、彼らはこのように動作することを喜んでいます。心配しないでください。

  • Javascripts:はい、OPが「Javascriptはありません」と言っていることは知っ ていますがプラグインを気にしないでください。これにはライブラリは必要ありません。私が言ったように、jQueryでさえも、それは例を明確にするためだけのものです。



2

ドロップダウンにホバースタイルを追加することもできます。

select {position:relative; float:left; width:21.4%; height:34px; background:#f9f9e0; border:1px solid #41533f; padding:0px 10px 0px 10px; color:#41533f; margin:-10px 0px 0px 20px; background: transparent; font-size: 12px; -webkit-appearance: none; -moz-appearance: none; appearance: none; background: url(https://alt-fit.com/images/global/select-button.png) 100% / 15% no-repeat #f9f9e0;}
select:hover {background: url(https://alt-fit.com/images/global/select-button.png) 100% / 15% no-repeat #fff;}
<html>
<head>
</head>
<body>
<select name="type" class="select"><option style="color:#41533f;" value="Select option">Select option</option>
<option value="Option 1">Option 1</option>
<option value="Option 2">Option 2</option>
<option value="Option 3">Option 3</option>
</select>
</body>
</html>


2

ダニエルの答えの3番目の方法、ホバー効果やその他のマウスイベントを処理するように改善できます。「button」要素がマークアップのselect要素の直後に来ることを確認してください。次に、+ CSSセレクターを使用してターゲットを設定します。

HTML:

<select class="select-input">...</select>
<div class="select-button"></div>

CSS:

.select-input:hover+.select-button {
    <Hover styles here>
}

ただし、「ボタン」だけでなく、select-elementのどこかにホバーするとホバー効果が表示されます。

私はこの方法をAngularと組み合わせて(プロジェクトがたまたまAngularアプリケーションであるため)、select-element全体をカバーし、Angularに "button"エレメントの選択されたオプションのテキストを表示させます。この場合、選択範囲のどこかにホバーするとホバー効果が適用されることは完全に理にかなっています。

ただし、JavaScriptなしでは機能しません。そのため、JavaScriptなしでサイトを機能させる必要がある場合は、拡張に必要な要素とクラスをスクリプトに追加する必要があります。このようにして、JavaScriptを使用しないブラウザーは、正しく更新されないスタイル付きバッジの代わりに、通常のスタイルなしの選択を取得します。


1
反対票の理由を知りたいので、改善する方法を知ることができます。🙂
エイドリアン・シュミット

1

CSSとHTMLのみのソリューション

Chrome、Firefox、Internet Explorer 11と互換性があるようですが、他のWebブラウザーについてはフィードバックを残してください。

Danieldの回答で示唆されているように、期待どおりの動作を実現するために、選択をdiv(xブラウザーの互換性のために2つのdivでも)でラップします。

http://jsfiddle.net/bjap2/を参照してください

HTML:

<div class="sort-options-wrapper">
    <div class="sort-options-wrapper-2">
        <select class="sort-options">
                <option value="choiceOne">choiceOne</option>
                <option value="choiceOne">choiceThree</option>
                <option value="choiceOne">choiceFour</option>
                <option value="choiceFiveLongTestPurpose">choiceFiveLongTestPurpose</option>
        </select>
    </div>
    <div class="search-select-arrow-down"></div>
</div>

2つのdivラッパーに注目してください。

また、下矢印ボタンを好きな場所(絶対位置)に配置するために追加されたdivに注意してください。ここでは、左側に配置しています。

CSS

.sort-options-wrapper {
    display: inline-block;
    position: relative;
    border: 1px solid #83837F;
}

/* This second wrapper is needed for x-browser compatibility */
.sort-options-wrapper-2 {
    overflow: hidden;
}

select {
    margin-right: -19px; /* That's what is hiding the default-provided browser arrow */
    padding-left: 13px;
    margin-left: 0;
    border: none;
    background: none;

    /* margin-top & margin-bottom must be set since some
       browsers have default values for select elements */
    margin-bottom: 1px;
    margin-top: 1px;
}

select:focus {
    outline: none; /* Removing default browsers outline on focus */
}
.search-select-arrow-down {
    position: absolute;
    height: 10px;
    width: 12px;
    background: url(http://i.imgur.com/pHIYN06.png) scroll no-repeat 2px 0px;
    left: 1px;
    top: 5px;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.