Pull to refresh

Стилизация элементов ввода без JavaScript

Введение


Всем известно, что некоторые элементы HTML очень плохо поддаются стилизации. То есть нельзя просто так взять и при помощи HTML+CSS заставить, например,
HTML
 выглядеть точно так, как нарисовано в макете. Зачастую верстальщики прибегают к решениям вроде плагинов jQuery. Если хотите узнать, как стилизовать радиокнопки и поля с выпадающим списком на чистом HTML и CSS - добро пожаловать под кат.


Стилизация select


Речь пойдет именно о поле с выпадающим списком.
Единственное, что сложно изменить в нем, используя только HTML и CSS - это кнопка, по которой список раскрывается.
Я тот еще дизайнер, поэтому для примера буду использовать такой рисунок размера 48х24 для кнопки:
habrastorage почему-то не работает
Снизу спрайт для поля с фокусом ввода, сверху - без фокуса.
Придется обернуть в и добавить элемент, который будет выглядеть как кнопка
<div class="select-outer"> <select id="select" name="select" size="1"> <option> Ubuntu </option> <option> Red Hat </option> <option> Debian </option> <option> OpenSuse </option> <option> Fedora </option> </select> <a class="select-button"></a> </div>


Я собираюсь скрыть стандартную кнопку за оберткой, а поверх обертки отобразить стилизованную. При этом кнопка должна быть ниже, чем
CSS
 по оси Z, чтобы клики ею не перехватывались.
select { width: 200px; border: none; height: 22px; /* Меньше, чем рисованная "кнопочка" на ширину нужного border'а */ line-height: 22px; position: relative; /* Это нужно, чтобы работал z-index */ background: none; /* Через прозрачный фон будет видно кнопку */ z-index: 100; } .select-outer { border: #ccc 1px solid; background: #eee; width: 180px; /* На 20px меньше, чем у select'а. Примерно такова ширина стандартной кнопки */ overflow: hidden; /* Кнопка будет находиться за пределами "обертки" */ display: inline-block; position: relative; /* Чтобы элементы с position:absolute позиционировались по "обертке" */ } .select-button { background: url('select.png') center center no-repeat; height: 24px; /* Размеры подготовленной картинки */ width: 24px; position: absolute; /* Размещаем объект по правому краю */ right: 0; top: 0; bottom: 0; z-index: 50; /* И спускаем его на нижний слой - чтобы ссылка */ /* не перехватывала событие щелчка от select'а */ }


Вот и всё! Получилось так:
Да, некрасиво
Фокус

Стилизация радиокнопок


Заменим стандартные радиобатоны на такие:
image
Для этого придется добавить всего один "лишний" тэг и один класс.
HTML

<label for="windows" class="for-radio">
	<input type="radio" name="os" value="windows" id="windows" checked="checked" />
	<span>Windows</span>
</label>
<label for="linux" class="for-radio">
	<input type="radio" name="os" value="linux" id="linux"/>
	<span>Linux</span>
</label>
<label for="macosx" class="for-radio">
	<input type="radio" name="os" value="macosx" id="macosx"/>
	<span>Mac OS X</span>
</label>	




/* Скрываем системный контрол */
input[type="radio"] {
	display: none;
}

label.for-radio span {
	background: url('radio.png') no-repeat;
	padding-left: 26px;		/* Ширина картинки + пара пикселей отступа от нее до текста */
	line-height: 24px;
	height: 24px;
	display: block;
}

/* Смещения для невыбранной и выбранной радиокнопки */

label.for-radio input[type="radio"] + span {
	background-position: top left;
}

label.for-radio input[type="radio"]:checked + span {
	background-position: bottom left;
}


Результат будет таким:
image
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.
Change theme settings