Стилизация 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() ); });
Вот и все) Вот так при помощи буханки хлеба и напильника.. Но в моем случае я знаю зачем я это сделал. Думаю, что мое решение элегантнее и «легче» многих вариантов)