20.10.2009

Верстка простой кнопки

Проблема, которую мы будем решать, заключается в том, что обычные кнопки, сформированные тегом <input type=”submit”> выглядят в разных браузерах по разному. Кроме того, при изменении стандартного размера кнопки, некоторые браузеры отображают ее просто ужасно.

Оказывается можно приложить немного усилий и из обычной кнопки по умолчанию сделать стильную и модную, да еще и во всех популярных браузерах кнопка будет выглядеть одинаково хорошо (ну или почти во всех, почти хорошо). Теперь поговорим об этом подробно.

Каждый браузер имеет свое мнение

Препарировать будем для троицы популярных браузеров:

  • Mozilla Firefox 3.5
  • Opera 9.63
  • IE6 (с оглядкой на IE7, чтоб ему!)

Вот как интерпретируют простой код <input type=”submit”> наши подопытные: Отображение кнопки популярными браузерами В принципе, ничего криминального. Вот только пунктирная обводка кнопки в браузере FF, при попадании на нее фокуса ввода, смотрится не красиво. Ее можно убрать. Для этого укажем следующее свойство CSS для кнопки класса button:

.button::-moz-focus-inner { border: 0; }

Теперь давайте сделаем большую модную кнопку и ужаснемся ее внешнему виду по умолчанию.

Верстаем большую модную кнопку

Как не странно, но кнопка подчиняется заданным через CSS размерам. Поэтому смело добавляем кнопке класса button директивы ширины и высоты:

 .button{ width:175px; height:55px; } 

Теперь посмотрим, каким образом выглядит наша большая кнопка в трех подопытных браузерах: Внешний вид большой кнопки в браузерах Своим уродством поражает кнопка в IE6. Кстати,  в IE7 она выглядит ни чуть не лучше. Поэтому кнопка по умолчанию нам не подходит и мы будем верстать свою собственную кнопку.

Верстка кнопки

Итак, ширину и высоту для кнопки мы уже задали, тем самым сформировали кнопку такого размера, как нам надо.

Остается превратить уродину в красавицу.

Для начала нарисуем кнопку в обычном состоянии,в состоянии при наведении мыши и при клике. Эти изображения сохраним в одном файле. Т.е. применим технологию спрайтов.

В одном из предыдущих видеоуроков я наглядно продемонстрировал принципы создания графического файла, содержащего оба состояния кнопки и ее верстку по технологии раздвижных дверей с применением технологии спрайтов.

Данный графический файл мы будем применять в качестве фона для нашей кнопки (свойство CSS background-image).

Фоновое изображение будет перемещаться при наведении на кнопку указателя мыши и при клике по ней. В результате будет создавать ощущение того, что кнопка нажимается.

Вот как выглядит фоновое изображение для кнопки:

Фоновое изображение для кнопки. Технология спрайтов.

  • В случае по умолчанию background-position:0 (можно не указывать).
  • При наведении мыши нужно переместить фоновое изображение вверх на высоту одной секции background-position:0 –56px (горизонтальное смещение не происходит, изменяется только вертикальная координата).
  • При клике необходимо сместить фон еще на одну секцию вверх background-position:0 100%.

Вместе со смещением фона неплохо было бы смещать и текст на кнопке, это добавит реалистичности в ощущение нажатия.

При наведении на кнопку указателя мыши я смещаю текст вниз на высоту тени под кнопкой. Получается весьма реалистично.

Размер смещения для надписи (при наведении мыши)

Надпись внутри кнопки смещается путем задания свойства padding.

  • При наведении указателя мыши padding-top: 4px

Дополнительной наглядности можно добиться путем смены указателя мыши при наведении на кнопку, со стрелки на лапку. Сделать это очень просто, всего-на-всего указать свойство cursor:pointer.

Изменение стиля кнопки при наведении мыши и клике

Здесь есть два пути: с использованием JavaScript-ов и без них. Понятно, что самый простой и приятный способ, без использования скриптов, не работает в IE, но мы все равно с ним познакомимся.

Способ без использования JavaScript

Для смены стилей при наведении указателя мыши и при клике можно использовать псевдоклассы :hover и :active.

Для кнопки класса button при наведении, благодаря псевдоклассу :hover, будет применен следующий стиль:

.button:hover{
    background-position:0 -56px;
    padding-top:4px;
}

Свойство background-position сместит фоновое изображение во второе положение, а отступ padding-top сместит надпись внутри кнопки.

Применить нужные свойства при клике можно используя псевдокласс :active

 .button:active{ background-position:0 100%;} 

Свойство background-position смещает фоновое изображение в третье положение при клике мыши.

Вышеописанный способ не подходит для IE6, т.к. в нем псевдоклассы :hover и :active работают только для тега ссылки a. Не смотря на то, что IE7 нормально работает с этими псевдоклассами, из-за своей глючности он ужасно интерпретирует данный код (добавляет несуществующие бордеры, смещает кнопку при клике).

В результате этот способ применять можно, т.к. IE6 отживает свое, пользуются им только из-за того, что он предустановлен в Windows XP; IE7 – глючный недобраузер, на смену которому пришел IE8.

Но все же, если вы хотите сделать динамическую кнопку и для IE, то следующий способ вполне пригодится.

Способ с использованием JavaScript

К тегу, формирующему кнопку применяем инструкции:

  • Функция OnMouseOver – срабатывает при попадании указателя мыши в границы объекта и применяет инструкции, расположенные в ее содержимом.
  • Функция OnMouseOut – содержимое применяется при выходе указателя мыши за границы объекта.
  • Функция OnMouseDown – срабатывает при нажатии клавиши мыши.
  • Функция OnMouseUP – срабатывает при отпускании клавиши мыши.

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

Желающие могут познакомится с CSS и HTML-кодом, иллюстрирующим все вышенаписанное (обязательно посмотрите исходный код страницы, там спрятаны подробные комментарии).

Отправка данных формы ссылкой

Можно и вообще не заморачиваться с кнопками, а сделать отправку данных формы при помощи ссылки. А уж как из ссылки сделать кнопку мы с вами, уважаемый читатель, весьма подробно обсуждали.

Теперь рассмотрим, как формируется такой скрипт.

Вот форма отправки:

<form name="myform" action="handle-data.php">
    Поиск: <input type="text" name="query">
    <a href="javascript: submitform()">Найти</a>
</form>

Данный кусок HTML, как вы наверное догадались, формирует строку ввода поискового запроса, подтверждением для начала поиска является клик по ссылке “Найти”.

Кликнув по ссылке “Найти” посетитель запустит JavaScript, который и отправит данные из формы обработчику:

<SCRIPT language="JavaScript">
    function submitform(){
        document.myform.submit();
    }
</SCRIPT>

Данный скрипт осуществит отправку (метод submit() ) содержимого полей формы обработчику.

Будьте внимательны! Не допускайте попадания в форму myform элементов с name=”submit” , иначе скрипт отправки будет обращаться к этому элементу, а не производить передачу данных.

Желающим более подробно разобраться с JavaScript предлагаю ознакомится с моими видеоуроками, посвященными программированию на данном языке. Непосредственно в пятом видеоуроке по JavaScript я рассказываю об особенностях обращения к форме по атрибуту name.

С уважением, Андрей Морковин.



  Post to Twitter



Если статья вам понравилась и вы не хотите пропустить свежие публикации, то подписывайтесь на RSS-ленту или получайте обновления сайта на эл. почту.


Похожие материалы:


Отзывов: 14 на «Верстка простой кнопки»

  1. Автор: Владимир, 21.10.2009 в 11:06

    Спасибо, а можно при помощь 1px картинки белого цвета сделать так что бы кнопка станавилась светлей??

    • Автор: Андрей Морковин, 21.10.2009 в 19:05

      Ого, вот так подход. Честно сказать, понятия не имею и не знаю зачем такое извращение может понадобится. :)

      Лучше сделать более светлую кнопку в Photoshop.

  2. Автор: Дмитрий, 21.10.2009 в 20:15

    Здравствуйте, Андрей!

    Чего-то я туповат для таких вещей. Не получается у меня простая кнопка. Цвет ее при наведении не меняется, да и сама она убого серая и без рамочки. Видать что-то ее такой делает, но понять что именно я не могу. Поэтому я сделал финт ушами и скопировал (сприткскринил) вашу кнопку Подписаться, тупо Снагитом, а затем вставил ее как картинку для кнопки. Получилось практически так как я хотел. Вот такой вот из меня хреновый мастер CSS получается. Но, вам все равно спасибо вам за столь подробную и информативную статью.

    • Автор: Андрей Морковин, 21.10.2009 в 23:10

      Здравствуйте, Дмитрий!

      Странно, если Вы все делаете по инструкции, то должно получится. Зашлите Ваш код, который не работает, мне на мыло (архивом, вместе с картинкой кнопки, HTML и CSS) постараюсь Вам помочь.

  3. Автор: Гений, 25.10.2009 в 14:25

    <– я даже вот про это не знал, во чайник :( спс.

  4. Автор: Человек_без_именИ, 29.10.2009 в 20:02

    Андрей, огромное спасибо и за эту стасью, и особенно за курс Блочной верстки. Я начинающий верстальщик, и с вашими уроками за 2 недели я много чего добился. Про кнопки даже и не задумывался, но, делал на днях тестовое задание для трудоустройства, там как раз понадобилось В) … как к стате … Вообщем то там ещё понадобилось поле для ввода, оно просто необычное, я бы так сказал растянутый овал. Попытался таким же образом попытаться сделать, ничего не вышло. Поле для ввода получается высоким, а проблема оказалось в том, что в Opera текс в поле не по середине, а прижимается к верху, в других браузерах по середине, из-за своей неопытности, плюнул на всё и просто положил input поверх div(с рисунком) В)

    • Автор: Андрей Морковин, 30.10.2009 в 18:24

      Рад, что мои видеоуроки Вам помогли.

      И хорошо, что вы самостоятельно, применив другой подход, смогли добиться желаемого результата. Дело в том, что определенная задача в верстке может иметь несколько правильных решений и, каждое из них, будет обладать своими плюсами и минусами. Если написанный код соответствует стандартам, имеет логичную структуру, то можно считать, что задача решена правильно.

      • Автор: Человек_без_именИ, 01.11.2009 в 10:10

        У меня ещё вопрос. Может ли быть ссылка в ссылке, и при этом ничего не будет “путаться”?
        Объясняю проблему. Верстаю страницу, где нужно всплывающее меню, мне подсказали что можно сделать div т.е.
        a div {display: none}
        а:hover div {display:block}
        Ну и к тому же в самом div есть ещё ссылки
        2 проблемы:
        1. Ругается Dreamweaver (не столь важно)
        2. Не работает в IE6 и FF. (блок с ссылками)
        Без ссылок блок исчезает и появляется во всех браузерах.
        Заранее спасибо!

  5. Автор: Never Lex, 15.12.2009 в 00:25

    Спасибо. Статья отличная! Подробно и с примерами, так держать!

    А вот передавать данные из формы жаваскриптом – то ещё извращение.

  1. Блог-шоу - выпуск 29 - Продвижение сайтов, веб-дизайн и креатив — 23.10.2009 в 18:14

Ваш отзыв