Антон Шевчук // Web-разработчик

CSS для начинающих. CSS кнопки это просто // HTML and CSS

CSS Buttons Article

Решил я начать новую серию статей – “CSS для начинающих”, надеюсь, будет полезно многим. Первый урок будет посвящен кнопкам…

Рисуем кнопку

Для начала нам необходимо нарисовать кнопку, вроде этой:

CSS Button Preview

Для этого лучше всего нам подойдет инструмент “Rounded Rectangle Tool” в Photoshop, с него и начнем – нарисуем нечто вроде:

Button in Photoshop - Step 0

Изменяя параметр Radius вы сможете задать желаемое загругление кнопок ( в примере для наглядности контент полностью прозрачный (“Fill Opacity” => 0%)):

Button in Photoshop - Step 1

Ширина объекта в данном примере 320px – т.е. я предполагаю, что кнопок большего размера не будет.

Границу выводим с помощью “Stroke” (из “Blending Options”), тип – градиент – от #000000 до #676767:

Button in Photoshop - Step 2

Теперь не мешало бы и залить кнопочку градиентом (сверху указан параметр opacity, внизу цвет; инструмент “Gradient Overlay” из “Blending Options”):

Button in Photoshop - Step 4

Результат:

Button in Photoshop - Step 3

Результат с залитой границей:

CSS Button Photoshop Result

Если мы сделаем цветной фон:

CSS Button Photoshop Result
CSS Button Photoshop Result
CSS Button Photoshop Result

Ну вот – кнопочка и готова, приступим к следующему шагу…

Простая CSS кнопка

Самый простой вариант – у нас все кнопки одного размера и одного/двух цветов, соответственно готовим небольшой “спрайт” на все случаи жизни (простым копированием слоя с кнопкой):

CSS Buttons Sprite

Теперь нам остается лишь слегка подправить CSS для таких кнопок:

.button {
    cursor:pointer;
    display:block;
    height:70px;
    width:320px;
    line-height:70px;
    text-align:center;
    background-image:url('images/buttons.png');
    background-repeat:no-repeat;
}
.button.green { background-position:0 0 } /* зеленая кнопка */
.button.green:hover { background-position:0 -350px } /* активная зеленая кнопка */
/* и т.д. */

Сам HTML код элементарен:

<a href="#" title="Label" class="button green">Label</a>
<a href="#" title="Label" class="button white">Label</a>
<a href="#" title="Label" class="button black">Label</a>
<a href="#" title="Label" class="button orange">Label</a>
<a href="#" title="Label" class="button red">Label</a>

Результат предсказуем:

CSS Button Sprite Result

Резиновая CSS кнопка

Теперь усложним задачу – мы не имеем представления какого цвета будут кнопки, и какого размера, мы лишь предполагаем, что кнопки не будут больше 320px в ширину.

Строим DOM

Каждая кнопка будет представлять из себя элемент <a>, обернутый в <li>. Элемент <em> нам так же понадобится для создания резиновых кнопок, чтобы внести ясность приведу следующий скрин:

HTML Button

Ну и сам HTML код:

    &amp;lt;ul class=&amp;quot;small&amp;quot;&amp;gt;
        &amp;lt;li class=&amp;quot;button&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; title=&amp;quot;Label&amp;quot;&amp;gt;Label&amp;lt;em&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;li class=&amp;quot;button green&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; title=&amp;quot;Label&amp;quot;&amp;gt;Label&amp;lt;em&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;li class=&amp;quot;button white&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; title=&amp;quot;Label&amp;quot;&amp;gt;Label&amp;lt;em&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;li class=&amp;quot;button black&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; title=&amp;quot;Label&amp;quot;&amp;gt;Label&amp;lt;em&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;li class=&amp;quot;button orange&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; title=&amp;quot;Label&amp;quot;&amp;gt;Label&amp;lt;em&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;li class=&amp;quot;button red&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; title=&amp;quot;Label&amp;quot;&amp;gt;Label&amp;lt;em&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;

Примечание: можно использовать практически любые другие HTML теги, это дело вкуса, так что таким же образом вы можете изменить и элементы формы. Для упрощения HTML’а можно воспользоваться JavaScript’ом. Приведу пример:

&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
    $(document).ready(function(){
        $('form :button, form :submit').each(function(){
            var className = $(this).attr('class');
            
            $(this).wrap('&amp;lt;div class=&amp;quot;button '+className+'&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;');
            $(this).after('&amp;lt;em&amp;gt;&amp;lt;/em&amp;gt;');
        });
    }); 
&amp;lt;/script&amp;gt;
&amp;lt;form class=&amp;quot;rubber&amp;quot; onsubmit=&amp;quot;return false;&amp;quot;&amp;gt;
    &amp;lt;input type=&amp;quot;button&amp;quot; class=&amp;quot;green&amp;quot; title=&amp;quot;Button&amp;quot; value=&amp;quot;Button&amp;quot;/&amp;gt;
    &amp;lt;input type=&amp;quot;submit&amp;quot; class=&amp;quot;red&amp;quot; title=&amp;quot;Submit&amp;quot; value=&amp;quot;Submit&amp;quot;/&amp;gt;
&amp;lt;/form&amp;gt;

Пишем CSS

Читаем комментарии по коду:

.button {
    /* 
      у нас кнопка с закруглением - значит нам необходимо 
      у DOM элемента так же скруглить углы
     */
    border-radius:10px;
    -moz-border-radius:10px;
    -khtml-border-radius:10px;
    -webkit-border-radius: 10px;
    
    /*
      внутренний элемент &amp;lt;a&amp;gt; должен быть смещен относительно &amp;lt;li&amp;gt;
      на 20px - освобождаем место для &amp;lt;em&amp;gt;
     */
    padding-right:20px;

    /* 
       данные элемент будет relative - т.е. 
       все элементы внутри него с абсолютным 
       позиционированием будут плясать от него
    */
    position:relative;
}
.button a, .button em{
    /* ссылке и элементу em задаем одинаковое фоновое изображение */
    background-image:url('css/images/button.png');
    background-repeat:no-repeat;
}
.button a{
    /* 
       ссылку делаем блочным элементом
       задаем высоту элемента, а так же свойство
       line-height - с его помощью мы выравниваем текст по вертикали
    */
    display:block;
    height:52px;
    line-height:52px;

    outline:none;
    color:#333;
    font-size:18px;
    text-indent:20px;
    text-decoration:none;  
    text-align:center;
    text-shadow: #333 0px -1px 0px;   
}
.button em{
    /*
       внутренний элемент так же будет блочным
       с размером 52х20, с абсолютной позиционированием
    */
    display:block;         
    position:absolute;
    background-position:100% 0;
    width:20px;
    height:52px;
    top:0px;
    right:0px;
}
/* цвет шрифта для некоторых кнопок лучше поменять */
.button.green a,
.button.black a,
.button.red a
{
    color:#fff;
}
/* тут указываем цвет наших кнопок */
.button.green { background-color:#009e0f }
.button.green:hover{ background-color:#068612 }
.button.white{ background-color:#f0f0f0 }
.button.white:hover{ background-color:#c0c0c0 }
.button.black{ background-color:#000 }
.button.black:hover{ background-color:#333 }
.button.orange{ background-color:#ff7800 }
.button.orange:hover{ background-color:#c60 }
.button.red{ background-color:#f00 }
.button.red:hover{ background-color:#c00 }

Наблюдаем результат

Сравним результат наших трудов в разных браузерах:

CSS Button Compare Result

Как вы можете заметить, есть несколько проблем с данной реализацией:

  • полупрозрачность в IE6 не работает – можем докрутит хаки, но зачем – IE6 можно считать умершим
  • box-radius в IE и Opera не работает – либо отказываемся от данной фичи, либо зарисовываем свободное пространство фоновым цветом (для IE так же есть грязный хак, см.: Curved corner (border-radius) cross browser)

Кнопочки можно пощупать на демо, все сорцы доступны по следующей ссылке:

Еще ссылки по теме:

© Антон Шевчук 2007-2023