Статьи

Используйте Webkit и Imagemagick для создания кросс-браузерных кнопок и других свагов

Итак, вы видели красивые кнопки BonBon и Super Awesome Buttons, и вы действительно хотите использовать их в своем веб-дизайне. Только, как мы все знаем, большинство людей используют Internet Explorer, что делает их рендерингом, как дерьмом.

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

Перед началом работы вам необходимо установить webkit2png и imagemagick .

Теперь давайте начнем с простой кнопки и сохраним ее как /tmp/awesome.html . Мне нравится синий:

 <style> a { background: #222 url(http://www.zurb.com/images/alert-overlay.png) repeat-x; display: inline-block; padding: 5px 10px 6px; color: #fff; text-decoration: none; -moz-border-radius: 5px; -webkit-border-radius: 5px; -moz-box-shadow: 0 1px 3px rgba(0,0,0,0.5); -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.5); text-shadow: 0 -1px 1px rgba(0,0,0,0.25); border-bottom: 1px solid rgba(0,0,0,0.25); cursor: pointer; font-size: 13px; font-weight: bold; line-height: 1; background-color: #ff5c00; } </style> <a href="#">&nbsp;</a> 

Будет отображаться так:

Давайте просто увеличим ширину этой штуки, поскольку мы собираемся сократить ее позже:

 a { ... width: 240px; } 

Так-то лучше:

Теперь, чтобы передать это в изображение, мы, конечно, могли бы просто сделать скриншот. Но это не сохранило бы тонкие альфа-каналы в тени. Итак, давайте разберемся с webkit2png :

 webkit2png --transparent --output=./awesome.png file:///tmp/awesome.html 

Обратите внимание, что вам нужно указать абсолютный путь к входному файлу в качестве второго аргумента, используя протокол file:// .

Это должно дать вам awesome.png экрана в awesome.png 800 × 600 пикселей. Давайте немного урежем это, не так ли? Для этого вам нужно установить imagemagick :

 convert -trim +repage awesome.png awesome.png 

Et voila — изображение теперь 260 × 26 пикселей. Но нам также нужно изображение для эффекта наведения. Так что давайте просто немного откорректируем таблицу стилей. Это должно сделать:

 a { ... background-color: #f90; } 

Сохраните его под новым /tmp/awesome-hover.html . Теперь повторите процесс сверху:

 webkit2png --transparent --output=./awesome-hover.png file:///tmp/awesome-hover.html convert -trim +repage awesome-hover.png awesome-hover.png 

Затем мы склеиваем две части вместе, чтобы создать наш спрайт. Imagemagick снова пригодится:

 montage awesome.png awesome-hover.png -background transparent -tile 1x2 -geometry +0+0 combined.png 

Итак, теперь у нас есть два состояния, представленные в одном спрайте. Хорошо, но нам все еще нужно создать CSS, чтобы использовать его. Давайте создадим новый документ в awesome-sprite.html :

 <style> body { font-family: sans-serif; } a { background: url(combined.png) no-repeat; display: inline-block; padding: 6px 10px 6px; color: #fff; text-decoration: none; text-shadow: 0 -1px 1px rgba(0,0,0,0.25); cursor: pointer; font-size: 13px; font-weight: bold; line-height: 1; width: 240px; } a:hover { background-position: 0 -26px; } </style> <a href="#">Awesome</a> 

Обратите внимание, что я отрегулировал отступы, чтобы компенсировать границы нижней части. Таким образом, общая высота останется неизменной.

Но ждать. Это хорошо и все, но этот спрайт заблокирован на фиксированную ширину 260 пикселей. Что, если мы хотим сделать это жидким? Для этого мы можем использовать технику раздвижных дверей :

 <style> body { font-family: sans-serif; } a { background: url(combined.png) no-repeat; background-position: right 0; display: inline-block; padding-right: 10px; } a span { background: url(combined.png) no-repeat; background-position: left 0; display: inline-block; padding-top: 6px; padding-bottom: 6px; padding-left: 10px; color: #fff; text-decoration: none; text-shadow: 0 -1px 1px rgba(0,0,0,0.25); cursor: pointer; font-size: 13px; font-weight: bold; line-height: 1; } a:hover { background-position: right -26px; } a:hover span { background-position: left -26px; } </style> <a href="#"><span>Awesome</span></a> 

Я переместил большую часть стиля во внутренний span и оставил некоторые отступы, чтобы освободить место для концов спрайта. Это достаточно близко, но есть проблема:

Посмотрите на стороны этой вещи!

Поскольку наш спрайт прозрачен, мы не можем просто наложить изображения таким образом. Нам нужно сделать некоторую операцию спрайтам. Сначала давайте нарежем концы во временное изображение:

 convert sprite.png -gravity west -crop 250x52+0+0 +repage left.png convert sprite.png -gravity east -crop 10x52+0+0 -background transparent -extent 250x52 right.png 

Это разрезает спрайт на левую и правую стороны, где непрерывный фон находится вместе с левой частью.

И наконец, давайте объединим их обратно в один спрайт:

 montage left.png right.png -background transparent -tile 1x2 -geometry +0+0 sprite_final.png 

В итоге мы получаем спрайт, который выглядит так:

Затем просто настройте смещения на этих фонах:

 <style> body { font-family: sans-serif; } a { background: url(sprite_final.png) no-repeat; background-position: right 0; display: inline-block; padding-right: 10px; } a span { background: url(sprite_final.png) no-repeat; background-position: left 0; display: inline-block; padding-top: 6px; padding-bottom: 6px; padding-left: 10px; color: #fff; text-decoration: none; text-shadow: 0 -1px 1px rgba(0,0,0,0.25); cursor: pointer; font-size: 13px; font-weight: bold; line-height: 1; } a:hover { background-position: right -26px; } a:hover span { background-position: left -26px; } </style> <a href="#"><span>Awesome</span></a> 

И вот мы здесь. Действительно здорово.

Вы можете повторить эту формулу, вставив ее в скрипт оболочки, и у вас будет своя маленькая фабрика кнопок. На самом деле, будучи Рождеством и всем, я сделал всю работу за тебя Просто сохраните фрагмент как webkit_sprite и сделайте его исполняемым ( chmod +x webkit_sprite ), и вы можете вызвать его следующим образом:

 PADDING=10 HTML_NORMAL=normal.html HTML_HOVER=hover.html ./webkit_sprite