Ильдар Сарибжанов | 02.07.2012

Стилизация select

Понадобилось как-то стилизовать select-ы, ну вроде бы фигня задача, «что в ней может быть сложного?» — подумал я. А когда дошло до дела, то понял, что все не так-то просто. Есть куча jquery плагинов, хаков, но все они, во-первых, требовали подключения дополнительного файла, что, конечно, в наше время многомегабитного интернета — фигня, но тут всплывала вторая проблема, идеологическая — я не понимал как оно работает. Т.е. я знаю, что эти решения подменяют обычный select, div-ами, но как это происходит для меня на тот момент было загадкой. Пока гуглил интернеты наткнулся вот на такую интересность поведения селектов. Вкратце (хотя там и так кратко все описано), если прописать к селекту css-свойство opacity:0; то само окно селекта исчезает, но при этом если ткнуть на то место, где должен располагаться этот самый селект, список вариантов выпадает.

Поскольку, меня устраивал вид выпадающего списка, то родилось решение — устанавливаем полную прозрачность элемента, оборачиваем его в некоторый div, в тот же div добавляем область отображения, например тег «p», в который средствами jqury (ну нравится мне эта библиотека, и она почти на всех наших проекта подключена, этот не был исключением) выводим текст выбранного значения. Теперь можно так же легко и непринудженно стилизовать div родитель, который для пользователя будет выглядить областью select. Думаю, что идея понятна. Теперь немного когда.  Верстка для реализации предложенного подхода выглядит так:

<div class="select_main">
	<p class="selecttitle"></p>
	<select id="calc_region_1" name='calc_region'>
		<option value=''>Выберите регион</option>
		<option value='1'>Москва</option>
		<option value='2'>Любой регион России (кроме Москвы)</option>
		<option value='3'>Вся Россия</option>
		<option value='4'>Вся Россия (за исключением Москвы)</option>
		<option value='5'>Вся Украина</option>
		<option value='6'>Вся Украина и вся Россия</option>
	</select>
</div>

Стили вот такие (да, я пишу стили в одну строку, а не столбиком, мне так удобнее, если сильно не нравится, пишите в комментах)

select{
	width:430px; 
	height:39px; 
	position:reative; 
	border:none; 
	cursor:pointer; 
	opacity:0;
}
.select_main{
	width:430px; 
	height:40px; 
	margin:15px 0 0; 
	position:relative; 
	background: transparent url('img/bg_select.png') no-repeat;
}
.selecttitle{
	width:380px; 
	height:39px; 
	position:absolute; 
	left:0; 
	top:0; 
	padding: 0 30px 0 20px;
	color:#7f7f7f; 
	font-size:18px; 
	line-height:41px; 
	overflow:hidden;
}

И вот так выглядит написанный скрипт

// начальная инициализация отображаемого текста при загрузке страницы
$('select').each(function(){
	$(this).parent().children('.selecttitle').text( $(this).children('option:selected').text() );
});

// изменение текста при изменении select
$('select').change(function(){
	$(this).parent().children('.selecttitle').text( $(this).children('option:selected').text() );
});

Вот и все) Вот так при помощи буханки хлеба и напильника.. Но в моем случае я знаю зачем я это сделал. Думаю, что мое решение элегантнее и «легче» многих вариантов)