selectのデザインを変更したいことがたまにあるのですが、他要素を使って疑似的に表示して、選択した値をJavaScriptを使ってselectに反映するという方法しか知りませんでした。
調べてみるとCSSのみで変更する方法もあるみたいなので、今回はselectのデザイン変更を試してみます。
対応ブラウザ
実装にはappearanceを使用します。
appearanceが対応しているブラウザはこちら。
ベンダープレフィックスが必要なブラウザがほとんどで、IEは11でも対応していません。

selectのデフォルトのスタイル削除
appearance: none;を指定して、selectのデフォルトのスタイルを消してみます。
HTML
<div class="select-wrapper"> <select name="sample"> <option value="">選択肢を選んでください</option> <option value="サンプルA">サンプルA</option> <option value="サンプルB">サンプルB</option> <option value="サンプルC">サンプルC</option> </select> </div>
CSS
select {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
width: 200px;
margin: 0;
border: 0;
outline: none;
padding: 0;
background: transparent;
}
selectのデフォルトのスタイルを消すデモページ
Firefoxやchromeではスタイルを消す事ができましたが、IEではappearanceが非対応のため、以下のように矢印が残ってしまっています。
![]()
IEでも表示をそろえられるように対応してみます。
CSS
.select-wrapper {
width: 200px;
overflow: hidden;
}
select {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
width: 230px;
margin: 0;
border: 0;
outline: none;
padding: 0;
background: transparent;
}
selectに指定したい幅を親要素に指定、selectは矢印分くらい大きくwidthを指定して、親要素にoverflow: hidden;を指定して矢印を隠すようにしています。
selectのデフォルトのスタイルを消すデモページ2
これでIEでもselectのデフォルトのスタイルを消すことができました。
selectにスタイルを設定
selectはwidthを大きめに設定してしまっているので、主にselectの親要素に対してスタイルを指定していきます。
CSS
.select-wrapper {
width: 200px;
overflow: hidden;
border: #999999 1px solid;
border-radius: 5px;
background: url(arrow.png) right center no-repeat;
}
select {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
width: 230px;
margin: 0;
border: 0;
outline: none;
padding: 5px;
background: transparent;
}
paddingだけselectに設定するようにしています。
selectにスタイルを設定のデモページ
これでとりあえず、CSSでのselectのデザイン変更ができました。
【参考サイト】
- レスポンシブWebデザインでも使える、スタイリッシュなセレクトボックスを実現する – ゆめいろデザイン :: フリーランス UX/UIデザイナー
- -moz-appearance – CSS | MDN
コメントが承認されるまで時間がかかります。