CSS оформление select
15-01-2011Есть наверное куча плагинов предоставляющие возможность изменения обычных select на необычные, или такие которые хотя бы отображались бы во всех браузерах одинаково. Но нам же это не интересно
, сейчас попробуем сделать из обычного селекта необычный т.е. будет выглядеть примерно так:

В демке представлено 4 селекта смотрим.
Вконтакте извините я спер у вас оформление и цвета селекта
.
Возьмем обычный select с несколькими option примерно вот:
<select id="ourselect1">
<option value="eee">Значение 19</option>
<option value="222">Значение 18</option>
<option value="444">Значение 17</option>
<option value="123">Значение 16</option>
<option value="122">Значение 15</option>
<option value="113">Значение 14</option>
<option value="124">Значение 13</option>
</select>
Обернем его в div с классом “sel_wrap”, в начале которого выстроим структуру нашего селекта дивами. Если представить это все дело на картинке то получится следующая картина:

А код получится следующим:
<div class="sel_wrap">
<div class="sel_imul">
<div class="sel_selected">
<div class="selected-text">Значение 19</div><div class="sel_arraw"></div>
</div>
<div class="sel_options">
<div class="sel_option" value="eee">Значение 19</div>
<div class="sel_option" value="222">Значение 18</div>
<div class="sel_option" value="444">Значение 17</div>
<div class="sel_option" value="123">Значение 16</div>
<div class="sel_option" value="122">Значение 15</div>
<div class="sel_option" value="113">Значение 14</div>
<div class="sel_option" value="124">Значение 13</div>
</div>
</div>
<select id="ourselect1">
<option value="eee">Значение 19</option>
<option value="222">Значение 18</option>
<option value="444">Значение 17</option>
<option value="123">Значение 16</option>
<option value="122">Значение 15</option>
<option value="113">Значение 14</option>
<option value="124">Значение 13</option>
</select>
</div>
Далее приступим к стилям. Естественно скрываем наш обычный селект, а структуру эмилирующую селект стилизуем как нам хочется:
.sel_wrap{
background:#efefef;
margin-bottom:5px;
padding:7px;
}
.sel_wrap select{
display:none;
}
.sel_imul{
width:300px;
}
.sel_imul .sel_selected{
background:#fff;
border:1px solid #bbb;
padding:3px 6px;
font-size:14px;
font-family:Times;
cursor:pointer;
position:relative;
}
.sel_imul.act .sel_selected{
background:#efefef;
}
.sel_selected .sel_arraw{
height:100%;
width:20px;
background:url('http://bit.ly/gudLNa') 50% 50% no-repeat;
position:absolute;
top:0px;
right:0px;
}
.sel_imul:hover .sel_selected .sel_arraw{
background-color:#e0e0e0;
border-left:1px solid #bbb;
}
.sel_imul.act .sel_selected .sel_arraw{
background-color:#e0e0e0;
border-left:1px solid #bbb;
}
.sel_imul .sel_options{
background:#fff;
border:1px solid #dbdbdb;
border-top:none;
overflow:auto;
position:absolute;
width:298px;
display:none;
z-index:10;
}
.sel_options .sel_option{
padding:3px 4px;
font-size:14px;
font-family:Times;
border:1px solid #fff;
border-right:none;
border-left:none;
}
.sel_options .sel_option:hover{
border-color:#dbdbdb;
cursor:pointer;
}
.sel_options .sel_option.sel_ed{
background:#dbdbdb;
border-color:#dbdbdb;
}
/*second variant*/
.sec .sel_imul{
width:200px;
}
.sec .sel_imul .sel_selected{
border:1px solid #C0CAD5;
}
.sel_imul.act .sel_selected{
background:#fff;
}
.sec .sel_imul:hover .sel_selected .sel_arraw{
background-color:#e1e8ed;
border-left:1px solid #d2dbe0;
}
.sec .sel_imul.act .sel_selected .sel_arraw{
background-color:#e1e8ed;
border-left:1px solid #d2dbe0;
}
.sec .sel_imul .sel_options{
background:#fff;
border:1px solid #d2dbe0;
width:198px;
}
.sec.overf .sel_imul .sel_options{
height:100px;
}
.sec .sel_options .sel_option:hover, .sec .sel_options .sel_option.sel_ed{
background:#587da1;
border:1px solid #2a5883;
color:#fff;
cursor:pointer;
}
.sec .sel_imul .sel_selected .sel_arraw{
background-image:url('http://vkontakte.ru/images/darr_dd_out.gif');
}
.sec.round .sel_imul .sel_selected{
-webkit-border-radius:5px;
}
.sec.round .sel_imul .sel_selected .sel_arraw{
-webkit-border-radius:0 5px 5px 0;
}
.sec.round .sel_imul .sel_options{
-webkit-border-radius:0 0 5px 5px;
}
/*green*/
.sec.green .sel_imul .sel_selected{
border-color:#FFAD99;
}
.sec.green .sel_imul:hover .sel_selected .sel_arraw,
.sec.green .sel_imul.act .sel_selected .sel_arraw{
background-color:#FFD6CC;
border-left:1px solid #FFAD99;
}
.sec.green .sel_options .sel_option:hover,
.sec.green .sel_options .sel_option.sel_ed{
background:#FF9980;
border:1px solid #FF704D;
color:#fff;
cursor:pointer;
}
Здесь уже стили предусматривающие работу javascript’а, и несколько типов селектов.
Дальше приступим к javascript‘у. Во первых сделаем так чтобы при клике на див эмулирующий select, открывался или закрывался список option’ов:
$('.sel_imul').live('click', function() {
$('.sel_imul').removeClass('act');
$(this).addClass('act');
if ($(this).children('.sel_options').is(':visible')) {
$('.sel_options').hide();
}
else {
$('.sel_options').hide();
$(this).children('.sel_options').show();
}
});
Теперь пишем событие которое будт менять значение обычного, скрытого, селекта и значение у эмулирующего селекта:
$('.sel_option').live('click', function() {
//меняем значение на выбранное
var tektext = $(this).html();
$(this).parent('.sel_options').parent('.sel_imul').children('.sel_selected').children('.selected-text').html(tektext);
//активируем текущий
$(this).parent('.sel_options').children('.sel_option').removeClass('sel_ed');
$(this).addClass('sel_ed');
//устанавливаем значение для селекта
var tekval = $(this).attr('value');
tekval = typeof(tekval) != 'undefined' ? tekval : tektext;
$(this).parent('.sel_options').parent('.sel_imul').parent('.sel_wrap').children('select').children('option').removeAttr('selected').each(function() {
if ($(this).val() == tekval) {
$(this).attr('selected', 'select');
}
});
});
Ну еще напишем меленький код который будет закрывать селект при холостом клике, blur так зказать:
var selenter = false;
$('.sel_imul').live('mouseenter', function() {
selenter = true;
});
$('.sel_imul').live('mouseleave', function() {
selenter = false;
});
$(document).click(function() {
if (!selenter) {
$('.sel_options').hide();
$('.sel_imul').removeClass('act');
}
});
Напишем функцию которая будет превращать из обычного селекта такой т.е. писать за нас код, назовем его reselect():
function reselect(select, addclass) {
addclass = typeof(addclass) != 'undefined' ? addclass : '';
$(select).wrap('<div class="sel_wrap ' + addclass + '"/>');
var sel_options = '';
$(select).children('option').each(function() {
sel_options = sel_options + '<div class="sel_option" value="' + $(this).val() + '">' + $(this).html() + '</div>';
});
var sel_imul = '<div class="sel_imul">\
<div class="sel_selected">\
<div class="selected-text">' + $(select).children('option').first().html() + '</div>\
<div class="sel_arraw"></div>\
</div>\
<div class="sel_options">' + sel_options + '</div>\
</div>';
$(select).before(sel_imul);
}
Здесь что то нормально не удается показать функцию, можете посмотреть ее в демке


