вторник, 17 марта 2009 г.

CSS кнопка (кроссбраузерная)

В этот раз речь пойдет о том как заменить стандартные кнопки браузера своими собственными. При этом главная цель сохранить их функциональность и одинаковую отрисовку во всех браузерах.

Я нарисовал свою собственную кнопку которая напоминает стиль Windows Vista Button:


Для того чтобы сверстать такую кнопку я использую следующую конструкцию:

<a class="button" href="#">
<img class="head" src="blank.png" /><input type="submit" value="Button"/><img class="tail" src="blank.png" />
</a>

Я не зря обрамил три элемента именно в тег <A>. IE6 понимает псевдокласс hover только для этого элемента, поэтому если в дальнейшем мы захотим чтобы кнопка изменяла свой вид при наведении на нее мышкой - это будет какраз кстати. Также учтите, что все элементы являются инлайновыми(inline) и любой пробел или перенос строки между ними приведет к возникновению пустого пространства, а нам этого не надо. Поэтому сохраните форматирование именно так (все 3 внутренних элемента в одной строке).

И так, как Вы уже заметили, кнопка состоит их трех основных элементов: элемент img который выполняет роль левой части, элемент img - правая часть и input, который будет растягиваться посредине. Для верстки нам понадобятся 3 составные картинки этой кнопки. Вырежьте их в каком-то графическом редакторе типа Photoshop или GIMP. У Вас должно получиться следующее:

     

ВАЖНО! Дополнительно вырежьте картинку размером 1x1 пикселя полностью прозрачного фона. Об этом чуть дальше.

Настало время для самой верстки:

.button { text-decoration:none; }
.button * {
border:0;
height:37px;
cursor:pointer;
vertical-align:middle;
}

.button img.head {
background:url("button-left.png") no-repeat;
width:7px;
}

.button img.tail {
background:url("button-right.png") no-repeat;
width:7px;
}

.button input {
background:url("button-bg.png") repeat-x;
color:#eee;
width:100px;
padding-bottom:2px;
font-size:15px;
}
Подробно рассмотрим каждый селектор:

.button * задает каждому элементу высоту в 37 пикселей, убирает бордер и устанавливает курсор в виде руки(это по желанию).

Далее опишем два класса head и tail. Установите на бекграунд заведомо вырезанные рисунки. Я устанавливаю их с помощью CSS опять же для hover'a. Теперь, как и обещал, вернемся к нашей прозрачной однопиксельной картинке. В этом примере я назвал ее blank.png и поставил ее на оба тега img. Это нужно сделать так как картинка без указанного атрибута src вовсе не будет отрисовываться.

Наконец устанавливаем CSS свойства для нашей кнопки. Ставим фоновый рисунок и растягиваем его по горизонтали. Задаем cерый цвет шрифта, верхний паддинг чтобы центрировать текст по вертикали и размер фонта 15 пикселей.

Ну вот и все. Кроссбраузерная CSS кнопка готова.

Если захотите установить hover, достаточно добавить всего 3 коротких селектора:
.button:hover .head { background:url("button-left-hover.png") no-repeat;}
.button:hover input { background:url("button-bg-hover.png") repeat-x; }
.button:hover .tail { background:url("button-right-hover.png") no-repeat;}

9 комментариев:

win-kim комментирует...

Хорошая статья! Спасибо!
Я использовал информацию в своем проекте.

Razor комментирует...

Спасибо!
Есть небольшая поправка: вместо инпута типа Submit лучше использовать тип Button. А то прийдется ставить onclick='return false;' чтобы форма не сабмитилась, если таковая есть и нам этого не нужно.

Анонимный комментирует...

Отвратительная реализация.

Razor комментирует...

спасибо, товарищ "анонимный"... наверное, вы знаете получше.. поделитесь..

а если вас пугает размер html кода, то данный способ обычно используется вместе с javascript'ом, врапят кнопки автоматически..

Анонимный комментирует...

Pretty nice place you've got here. Thanks for it. I like such topics and everything connected to this matter. I would like to read a bit more on that blog soon.

Truly yours
Jeph Normic

Анонимный комментирует...

Спасибо, помогло)

Анонимный комментирует...

Почему то ссылки не работают в эксплорере т.е. работают только если счелкнкуть по краешку кнопки а середина не реагирует. ???
Причем в мозиле все работает.
Strange это как -то так хотя мож я и где то накосячил:(

Razor комментирует...

только что специально проверил в ИЕ6. все работает. проверьте, может где-то в с тегами ошиблись.

Sevalad комментирует...

класс... спасибо, очень помогло... это отличный пост просто, хоть и устаревший. Не знаю почему кому-то не нравится реализация, но мне так очень понравилась. Все легко и просто и очень пригодилось мне в моем проекте.