Красивые градиентные кнопки без картинок для всех браузеров

Красивые градиентные кнопки без картинок для всех браузеров

Всем привет!

Сегодня мы посмотрим как с помощью CSS3 без картинок сделать вот такие отличные кнопки. Для этого мы будет использовать следующие свойства: RGBA цвета, box-shadow, text-shadow и border-radius. Разметка и стили сделаны с использованием принципа graceful degradation, так что пользователи, браузеры которых не поддерживают указанные технологии, увидят кнопки в нормальном, но не таком хорошем качестве.

Рассматриваемые кнопки имеют три состояния (обычное, наведение и нажатие), их можно масштабировать и изменять пропорции.

Данная статья — перевод статьи «Cross-browser CSS gradient buttons».

HTML

Рассмотрим HTML для, например, синей кнопки:

<a href="#" class="button button-blue">
<span>Button</span>
</a>

Вложенный <span> используется для добавления текстуры и верхнего белого бордера:

Красивые градиентные кнопки без картинок

Верхний бордер можно было сделать и с помощью inset box-shadow, но тогда кнопки не подходили бы под понятие graceful degradation. Ниже в статье будет показана разница.

CSS

Для начала рассмотрим общие для всех кнопок (класс button) стили:

.button {
margin: 10px;
text-decoration: none;
font: bold 1.5em 'Trebuchet MS',Arial, Helvetica; /* Изменяйте em для масштабирования кнопки */
display: inline-block;
text-align: center;
color: #fff;

border: 1px solid #9c9c9c; /* Запасной стиль */
border: 1px solid rgba(0, 0, 0, 0.3);

text-shadow: 0 1px 0 rgba(0,0,0,0.4);

box-shadow: 0 0 .05em rgba(0,0,0,0.4);
-moz-box-shadow: 0 0 .05em rgba(0,0,0,0.4);
-webkit-box-shadow: 0 0 .05em rgba(0,0,0,0.4);
}

.button, .button span {
-moz-border-radius: .3em;
border-radius: .3em;
}

.button span {
border-top: 1px solid #fff; /* Fallback style */
border-top: 1px solid rgba(255, 255, 255, 0.5);
display: block;
padding: 0.5em 2.5em;

/* Фоновый паттерн */

background-image: -webkit-gradient(linear, 0 0, 100% 100%, color-stop(.25, rgba(0, 0, 0, 0.05)), color-stop(.25, transparent), to(transparent)),
-webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, rgba(0, 0, 0, 0.05)), color-stop(.25, transparent), to(transparent)),
-webkit-gradient(linear, 0 0, 100% 100%, color-stop(.75, transparent), color-stop(.75, rgba(0, 0, 0, 0.05))),
-webkit-gradient(linear, 0 100%, 100% 0, color-stop(.75, transparent), color-stop(.75, rgba(0, 0, 0, 0.05)));
background-image: -moz-linear-gradient(45deg, rgba(0, 0, 0, 0.05) 25%, transparent 25%, transparent),
-moz-linear-gradient(-45deg, rgba(0, 0, 0, 0.05) 25%, transparent 25%, transparent),
-moz-linear-gradient(45deg, transparent 75%, rgba(0, 0, 0, 0.05) 75%),
-moz-linear-gradient(-45deg, transparent 75%, rgba(0, 0, 0, 0.05) 75%);

/* Настройки паттерна */

-moz-background-size: 3px 3px;
-webkit-background-size: 3px 3px;
}

.button:hover {
box-shadow: 0 0 .1em rgba(0,0,0,0.4);
-moz-box-shadow: 0 0 .1em rgba(0,0,0,0.4);
-webkit-box-shadow: 0 0 .1em rgba(0,0,0,0.4);
}

.button:active {
/* Опускаем на 1px при нажатии */
position: relative;
top: 1px;
}

Теперь посмотрим на нашу синию кнопку:

.button-blue {
background: #4477a1;
background: -webkit-gradient(linear, left top, left bottom, from(#81a8cb), to(#4477a1) );
background: -moz-linear-gradient(-90deg, #81a8cb, #4477a1);
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='#81a8cb', endColorstr='#4477a1');
}

.button-blue:hover {
background: #81a8cb;
background: -webkit-gradient(linear, left top, left bottom, from(#4477a1), to(#81a8cb) );
background: -moz-linear-gradient(-90deg, #4477a1, #81a8cb);
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='#4477a1', endColorstr='#81a8cb');
}

.button-blue:active {
background: #4477a1;
}

Остальные кнопки делаются по аналогии, заменяя цвета.

Поддержка браузерами

Mozilla Firefox 3.6+

Полная поддержка всех свойств, в том числе и паттернов:

Красивые градиентные кнопки без картинок Mozilla Firefox

Webkit (Safari, Chrome)

Все отлично:

Красивые градиентные кнопки без картинок Webkit (Safari, Chrome)

Opera 11

К сожалению, в Опере нет поддержки градиентов CSS, но несмотря на это все остальное работает и кнопки выглядят хорошо:

Красивые градиентные кнопки без картинок

IE 6–8

С помощью фильтров можно добавить градиенты к кнопкам:

Красивые градиентные кнопки без картинок IE 6–8

IE 9

Этот браузер поддерживает градиенты и тени, но с закругленными углами у него не все хорошо:

Красивые градиентные кнопки без картинок IE 9

 

Заключение

Теперь давайте посмотрим примеры кнопок вживую:

Демо

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

Расскажите друзьям

Оцените статью:
  • 1
  • 2
  • 3
  • 4
  • 5

Комментарии — 30

SwaEgo
Отличный пост!Пересмотрел кучу вариантов,этот лучший.Сейчас же применю у себя в блоге.Спасибо!
den1n
Жутко тормозит Firefox, если зайти на страницу с демкой. При наведении любую из кнопок съедается 50-70% процессора.
Версия FF: Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
#
den1n
d1mmmk
подтверждаю слова den1n, проверил под ubuntu 10.10 x64 и win7x64, в FF тормоза
#
d1mmmk  
Бложня
И всё-таки кнопки лучше делать при помощи тега button. Иначе не саментично как-то.
TecHMeat
Для браузеров я бы делал на CSS3, так как описано здесь. Опера конечно пока не поддерживает градиенты, но рано или поздно они это сделают, а опера на клиенте обновляется достаточно оперативно.
Для недобраузеров (всё семейство ослов) хаками делал бы по старинке.
Александр
Фильтры зло зло зло
#
Александр
Dan
Подтверждаю, в Ubuntu FF тормозят.
#
Dan
Alexey
Я бы на месте авторов оригинальной статьи не использовал термин «Cross-browser». Все же конечный результат в IE удручает, а, значит, и смысла особого в этом всем нет. Увы, все равно пока приходится делать все по-старинке, спрайтами.
#
Alexey  
MaxVerona
Кнопки красивые, но съедают много ресурсов.
В Mozilla 3.6.13 - страница демо тормозит.
Google Chrome- все прекрасно.
Не закругляет углы в IE8-9 - конечно разочаровывает.
Вано
Да, в FF тормозит. Видимо проблема в том, что лиса тратит много времени и "сил" на отрисовку кнопочек после наведения курсора, а после отведения опять отрисовывает "дефолтное" состояние кнопки.

Использую этот способ уже месяцев семь, только не меняю при наведении цвет(я считаю наведение курсора не столь важным событием), а делаю более интенсивную тень.

Руководствуюсь я тем, что люди, которые пользуются не продвинутыми браузерами:
либо идут на это сознательно, и для них эти недостатки восполняются другими функциями;
либо не могут ничего изменить (дядя админ не дремлет);
либо не знают что можно использовать другой софт (чайники).

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

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

В любом случае решать вам - или толкать человека к прогрессу (хотя какой тут прогресс - потратить 10 минут на установку), или давать человеку возможность и дальше сидеть на недобраузере и радоваться жизни. Я выбираю первое.

P.S. Простите меня, друзья, за столь длинные посты.
#
Вано
Sergey S.
Мне очень нравится способ с роловерами, когда одна картинка хранит в себе все состояния кнопки, при этом она же с помощью позиционирования и растягивается. У Лебедева на сайте студии есть решение. При этом очень мало лишнего кода и всё вполне кроссбраузерно.
Shustry
Мегавелосипед. Одного тэга контейнера для стандартной кнопки и одного спрайта хватит, чтобы это реализовать совершенно кроссбраузерно :)
#
Shustry
Max
Почитал пост и сразу сделал у себя на сайте. Прочитал отзывы, и все удалил
#
Max
SwaEgo
:)Почитал отзывы,проверил в FF.Вроде нормально всё.Только паттерн другой...Оставлю,дальше посмотрим.
shvets.su
мне ненравится при наведении градиент в другую сторону. лучше будет на тон светлее через opacity
Andy
Вот еще варианты http://ubuwaits.github.com/css3-buttons/
Есть достаточно интересный. И да, верхний бордер можно добавить при помощи тени.
AngryCat
Зато в Опера 11 есть поддержка инлайн SVG.

<svg xmlns="http://www.w3.org/2000/svg" version="1.0">
    <defs>
        <linearGradient id="gradient" x1="0" y1="0" x2="0" y2="100%">
            <stop offset="0%" style="stop-color: #c6c6c6;"/>
            <stop offset="100%" style="stop-color: #dcdcdc;"/>
        </linearGradient>
    </defs>

    <rect x="0" y="0" fill="url(#gradient)" width="100%" height="100%" />
</svg>


Лучше во внешний файл впихнуть, но можно и так:

background-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20version%3D%221.0%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22gradient%22%20x1%3D%220%22%20y1%3D%220%22%20x2%3D%220%22%20y2%3D%22100%25%22%3E%3Cstop%20offset%3D%220%25%22%20style%3D%22stop-color%3A%20%23c6c6c6%3B%22/%3E%3Cstop%20offset%3D%22100%25%22%20style%3D%22stop-color%3A%20%23dcdcdc%3B%22/%3E%3C/linearGradient%3E%3C/defs%3E%3Crect%20x%3D%220%22%20y%3D%220%22%20fill%3D%22url%28%23gradient%29%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20/%3E%3C/svg%3E);
#
AngryCat  
adilahhemmnox
Клёво ! Спс за кнопочки
0001
Отличная статья
#
0001
SwaEgo
Как отписаться от подписки на комментарии?Ни хрена unsubscribe не работает.
Grin
SwaEgo, отписал вас
seeYouSha
Спасибо за кнопочки:)
кстати,если убрать паттерн, то в FF все работает норально)
#
seeYouSha
andreybasel
Классные кнопки! Попробуем.
Flip:Who?
Всё таки считаю, что лучше использовать картинки.
Андрей
Спасибо за классные кнопки!
moran
последняя Opera [11.61] поддерживает градиент!
#
moran
Елена
Спасибо, кнопки очень хорошие. Это лучше, чем картинки. :)
#
Елена

Новый комментарий

как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть
как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть
counter strike mt2 silkroad pvp metin2 metin2 pvp knight pvp gm olarak başlayan pvpler pvp silkroad pvp serverler counter strike serverler msn show cam show görüntülü sohbet oyunlar suskunlar gazete oku