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

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

Всем привет!

Сегодня мы посмотрим как с помощью 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

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

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
Елена
Спасибо, кнопки очень хорошие. Это лучше, чем картинки. :)
#
Елена
DarkGhost
Полезный материал! Кнопки стильные и непременно станут изюминкой интернет-страницы
html
Как всегда, только полезное. Единственное, я бы не менял направление градиента по вертикали, а просто затемнял кнопку. К сожалению, рисовать не умею, поэтому придется ваше решение.
#
html
surricane
Спасибо за ссылочку, описано всё предельно просто.
#
surricane
Алексей
Отличные кнопки! Обязательно использую. И вам Спасибо. :)
Алексей
Громадное спасибо за статью
Alexa
мне понравилось! у себя применю! спасибо автору за статью!

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

как выглядит какой тег
жирный текст <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>
разрешенные теги или посмотреть как будет выглядеть

metin2 pvp metin2 pvp serverler pvp serverler