selectのテキストを中心に揃えようとすると、safariでは select の text-align:center が効かず、左に揃ってしまう。
なんとかしたいという要望に、調査・対応。
目次
方法の調査
方法1: selectそのものの幅を、selectされたoptionの幅に合わせる
方法2: 幅を決めて、その中に(やや強引に)中心寄せする
案2を採用しました。
方法2の注意点
余計なcssを削除したり、paddingやmarginを調整する
html
上記リンクでは、要素を指定するのにclassを使っているが、複数ある場合はidで指定したほうが無難か。
<div class="btn-select" style="">
<p id="hoge_label" class="label"><?php // ここにSELECTED値 ?></p>
<select id="select_hoge_id" class='select' name="hoge_id">
<option value=''>Categories</option>
<option value='1'>Option 1</option>
<option value='2'>Option 2</option>
<option value='3'>Option 3</option>
</select>
</div>
のように、selected な値をpに入れる。
css
.btn-select {
width: 200px; ← 幅
height:40px; ← hとする
padding:5px 0; ← pとする
position: relative;
background: #f8f8f8; ← select部の背景色
border-radius: 6px;
cursor: pointer;
vertical-align:bottom; ← inlineでキレイに見せるため
display:inline-block; ← inlineでキレイに見せるため
margin: 0 10px; ← 左右に隙間を入れる
border:1px solid #d3d3d3;← select部の枠
}
.btn-select .label {
position: absolute;
width: 100%;
z-index: 1;
}
.btn-select .select {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
display: block;
cursor: pointer;
width: 100%;
height:30px; ← h-2*p の値 にするとキレイに見える。 40 - 5*2 = 30
border: none;
padding: 0px;
opacity: 0;
position: relative;
z-index: 2;
}
.btn-select .select::-ms-expand {
display: none;
}
.btn-select .select:focus {
z-index: -1;
opacity: 1;
}
js
javascriptは、classで指定してもいいが、複数ある場合はidで指定したほうが無難か。
<script>
// selectと同じようにonchangeでラベルを変えたいときはJSを用いる
jQuery('select#select_hoge_id').on('change', function(){
var $this = jQuery(this)
var $option = $this.find('option:selected');
jQuery('#hoge_label').text($option.text());
// onchange後にフォーカスしてるのが嫌な場合
$this.blur();
});
</script>
