Закругление углов без использования изображений
Евгений, 30 июля 2007
Закругленные углы, одна из популярнейших тенденций в современном веб-дизайне. Есть множество вариантов их реализации часто, заключающихся в размещении изображений по углам контейнера, в худших случаях используются теги img, в лучших свойство background, для некоторых браузеров есть специфические решения, например -moz-border-radius для FireFox, но их полезность сомнительна. Простой и удобный способ скругления уголков без использования изображений или малораспространенных свойств был бы очень полезен.
У закругленных уголков выполненных с помощью изображений есть как несколько недостатков:
- несемантические элементы при верстке,
- дополнительная нагрузка на сервер в виде запросов множества уголков различного цвета и размера (в лучшем случае уголки группируются по 4 в одном изображении),
- не лучший вид страницы, если у пользователя отключена загрузка изображений (особенно если используются img, а не свойство background).
Так и преимущества:
- можно закруглять, что угодно и как угодно.
Но во многих случаях, можно избежать использования изображений. Метод, который я хочу предложить, не оригинален и возможно многим известен, но наверняка, не всем, придуман он не мной, а подсмотрен на GMail, немного развит и адаптирован, для его работы требуется только HTML и CSS.

Для начала, нужно определиться с помощью какого тега будем делать скругляющие блоки. В оригинале используется устаревший тег b, вероятно выбор пал на него по причине краткости написания, имеющей для нас большое значение, так как его придется часто повторять.
Разметка будет достаточно простой:
<div id="rounded-box-3">
<b class="r3"></b><b class="r1"></b><b class="r1"></b>
<div class="inner-box">
<h3>Элемент с закругленными углами R=3px</h3>
<p>Этот способ закругления углов подсмотрен на GMail.</p>
</div>
<b class="r1"></b><b class="r1"></b><b class="r3"></b>
</div>
Дальше все просто, делаем b блочным элементом высотой 1px и задаем ему соответствующие поля.
.r1, .r2, .r3 {
display: block;
height: 1px;
}
.r3 { margin: 0 3px; }
.r2 { margin: 0 2px; }
.r1 { margin: 0 1px; }
Затем указываем цвет фона и отступы
#rounded-box-3 .inner-box, #rounded-box-3 b {
background-color: #CCCCCC;
}
.inner-box {
padding:1em;
}
Для всех нормальных браузеров этого достаточно, но у IE6 есть свое мнение. Пустые блоки, для которых задана высота 1px, растягиваются до 2px, что не способствует закруглению уголков, решить проблему можно указав overflow:hidden
Для старых версий IE, IE в quirks mode и блоков вложенных в таблицы в IE7, по совету читателя tapazukk, добавим правило font-size:1px
.r1, .r2, .r3 {
overflow: hidden;
font-size:1px;
}
Браузерам отличным от IE6 это свойство ничем не мешает, поэтому нет необходимости использовать хаки или условные комментарии.
На этом теоретическую часть можно закончить и перейти к примерам:

простой пример демонстрирующий возможности техники,

реальный пример использования техники.
Внимательный разбор кода примеров поможет понять особенности работы этого метода.
Преимущества метода:
- кроссбраузерность (тестировался в IE6, IE7, Opera 9, FireFox 2)
- никаких дополнительных запросов
- просто реализуется и проще поддержка, чем при работе с изображениями (например, можно поменять цвет блока, изменив только одно значение в CSS, правда это работает и с уголками в виде полупрозрачных изображений).
Недостатки:
- невозможность создания сложных эффектов,
- несемантические элементы при верстке.
Можно пойти дальше и создать на PHP (Ruby, Perl или любом другом языке, которому вы отдаете предпочтение) функцию которая будет генерировать код для уголков, на основе заданного радиуса закругления, что должно упростить шаблоны и поддержку.

















CSS: Закругление углов без использования изображений » Wake Up! 30 июля, 2007 11:44 #
[...] статья на актуальную тему закруглённых углов, показан пример [...]
Шильгия 30 июля, 2007 12:04 #
сомнительное решение. Недостаток в виде несемантических элементов остаётся, их даже больше становится. Гибкость гораздо меньшая - например таким образом существенно сложнее сделать градиент, нежели картинками. Загружаемый объём вряд ли становится меньше. Разве что обращений к серверу в самом деле меньше. Но для того же gmail это актуально, а для менее посещаемых сайтов - вряд ли.
Dmytro Shteflyuk 30 июля, 2007 12:21 #
Альтернатива
Для семантической верстки лучше использовать JavaScript-решения, вроде NiftyCube -- делает то же самое, только не нужно вводить дополнительные элементы.
Gblok 30 июля, 2007 12:25 #
Спасибо за прекрасную статью
В очередной раз выражаю благодарность за полезную информацию...
Денис Талала 30 июля, 2007 13:41 #
Единственный, на мой субъективный взгляд и лично для меня, минус — «пикселеватость» закругленных уголков. Я сейчас как раз бьюсь над этой проблемой (с использованием png-изображений). Но IE6, как известно, не поддерживает этот замечательный графический формат, а функция AlphaImageLoader имеет такой ряд ограничений, что он затмевает все свои возможности. :(
kost 30 июля, 2007 13:43 #
Отступы и поля
Почему вы margin называете полями, а padding -- отступами.
По-моему, нужно наоборот.
Padding -- поля, margin -- отступ.
Евгений 30 июля, 2007 15:17 #
Шильгия
Загружаемый объем сильно не измениться (если количество скругленных углов в разумных пределах), потому что текст эффективно сжимается gzip`пом, который включен практически на любом серьезном проекте.
Конечно, сделать градиенты будет сложно, но эта техника предназначена для простых закруглений и не претендует на универсальность.
Соблюсти семантику элементов можно только при использовании свойства
-moz-border-radiusв остальных случаях она страдает, я тоже не в восторге от этого, но ничего не поделаешь.Dmytro Shteflyuk
Я хотел упомянуть о том, что можно использовать JavaScript и не нарушать семантику документа, но едва ли это может получить широкое распространение.
kost
margin - в переводе на русский "поле", а padding остается называть только "отступом".
ekwo 30 июля, 2007 17:15 #
Спасибо.
Как раз под руку попалось. думал картинкой сделать, а теперь вот так вот попробую.
BrokenBrake 30 июля, 2007 18:12 #
Это бред. Никогда не понимал людей, которые ради сомнительной красивости готовы делать такое уродство в коде.
BrokenBrake 30 июля, 2007 18:14 #
В общем, я за background. И пусть будут острые углы, когда картинки отключены. В этом нет ничего плохого, тем более процент пользователей с отключенными картинками небольшой (хотя сам к ним отношусь).
миша 30 июля, 2007 18:37 #
спасибо
sky 31 июля, 2007 9:15 #
Больше примеров с уголками:
И всё в основном в CSS!
http://www.cssplay.co.uk/boxes/krazy.html
Евгений 31 июля, 2007 11:11 #
И вот еще, неплохой примерчики
http://www.cssplay.co.uk/boxes/chunky.html
http://www.cssplay.co.uk/boxes/snazzy.html
Оказывается очень распространенных метод, а я подсмотрел у Gmail`а чертежи велосипеда :)
Евгений 31 июля, 2007 11:17 #
Список из 50+ способов скругления углов:
http://www.smileycat.com/miaow/archives/000044.php
Tokolist 31 июля, 2007 23:20 #
конечно же велосипед :)
что бы не говорили, а каждый метод имеет право на жизнь. все зависит от конкретной ситуации. более того можно отказаться от уголков вообще :)
Re.Актив 1 августа, 2007 3:34 #
Какой же это велосипед
Это такой же баянистый баян как и Nifty Corners.
BrokenBrake, с точки зрения семантики предложенный способ ни чем не хуже четырех вложенных друг в друга дивов с background-image.
BrokenBrake 1 августа, 2007 8:22 #
Re.Актив, согласен. Но я никогда не использую четыре вложенных divа из-за каких-то там уголков. Скругление я делаю только в том случае, если могу привязаться к естественным элементам, а вводить в структуру всякий мусор для этого мне неприятно.
Я понимаю, что все эти извраты придуманы работающими на дядю верстальщиками, которым во что бы то ни стало надо осуществить задумку дизайнера, какая бы она ни была. Но есть что-то порочное в такой практике, не находите?
Огоньков 1 августа, 2007 14:27 #
да ну... лучше фоны намутить, чем это в коде...
Alinaki 1 августа, 2007 17:52 #
Такой способ позволяет без особых проблем создать закругления с нужного цвета границами. Тот же NiftyCorners сдается перед такой задачей по причинам совместимости.
Ну и ничего не мешает не городить это в коде, а написать простенький скриптик для автоматического добавления этих строк в нужное место.
BrokenBrake 1 августа, 2007 17:56 #
Во-во... давайте еще скриптики писать для скругления углов.
Re.Актив 1 августа, 2007 19:16 #
BrokenBrake, а что тебя смущает в использовании скриптов? На http://wildbit.com/ например, довольно успешно исползуют описанный метод как раз в комбинации со специальным скриптом. В их случае вообще имеют место быть пять блоков с закругленными краями разных цветов и степени насыщенности. Использовать для каждого такого блока фоновые картинки - идиотизм, а закругления предложенным способ - отличное решение. Кстати, не ленитесь, подсмотрите как именно все реализовывается, по моему довольно интересно...
BrokenBrake 1 августа, 2007 20:15 #
Re.Актив, ну просто я не люблю избыточность. Когда ради сомнительных красивостей такое нагромождают. Ну не стоят уголки этого.
Я если и делаю, то там, где можно привязать их (background) к логически обоснованным элементам, либо вообще использую CSS-3, а на неподдерживающие браузеры пофиг - в них тоже будет хорошо смотреться, но без скругления.
tapazukk 12 августа, 2007 21:15 #
Можно еще писать font-size:1px; (для старых ie или для 6-го в quirks mode)
2BrokenBrake
На css3 переходить рановато, очень хорошо сглаживает углы Safari 3 (да собственно у этого браузера все ОК с css3-зачот разработчикам!), что не скажешь даже о мозилле и его возможностях интерпритации стилей (-moz-border-radius как-то коряво отображется, нет сглаживания). Стоит ли делать круглые углы такм способом под два браузера?
Лёлля 13 августа, 2007 8:59 #
А чем плохо использовать графику для создания закругленных или вообще любых уголков?
Евгений 13 августа, 2007 9:15 #
В самом начале статьи об этом написано.
Могу добавить, что многое зависит от того как это будет реализовано. Главное избегать тега
imgон не для декоративных изображений (тем не менее такие варианты периодически появляются, к примеру, Хабр), это очень плохо смотрится если в браузере отключена графика.Vedmak 14 августа, 2007 0:11 #
Наверное ТАКОЕ чувствует себя немного неуютно рядом со статьями про web-стандарты, семантику, микроформаты и т.п. Это возвращение в славные 90-е.
Тег b не устаревший. Он используется и будет использоваться в HTML5:
В данном случае его присутствие абсолютно неуместно.
Денис Талала 14 августа, 2007 1:33 #
> это очень плохо смотрится если в браузере отключена графика
Если отключена графика, то неважно, каким образом вставлена картинка — тегом img, или background'ом к div'у — в любом случае её видно не будет…
Евгений 14 августа, 2007 2:17 #
Мне кажется, что у вас графика включена :)
Если углы закругляются background’ом то при отключении графики мы получим обычный блок с незакругленными углами, что вполне нормально, но если углы закругляются с помощью img то по углам блока мы увидим пустые квадратики под изображения, что гораздо хуже чем просто незакругленные углы.
За примером далеко ходить не будем:

Денис Талала 14 августа, 2007 2:28 #
Точно. Я пользуюсь Oper'ой — там квадратиков нет. :))
Glook 17 августа, 2007 10:50 #
насколько я понял этот способ годится или для блока фиксированной ширины или для блока растянутого на 100% от ширины родительского...
Попытки таким способом задать закругления блоку с плавающей шириной, зависящей от содержимого, успехом НЕ увенчались (речь конечно об IE)
Евгений 17 августа, 2007 11:59 #
Попробовал, сделать блоки плавающей ширины (30%), никаких проблем, вот что получилось, возможно я, не понял, что именно требуется, тогда выложите пример сюда или в контактную форму.
Glook 17 августа, 2007 14:13 #
ширина блока должна соответствовать содержимому, я имел ввиду именно это, говоря о "плавающей ширине", а вы предлагаете сделать её фиксированную, не важно в чём в пикселях или процентах это будет выражено.
Juri 21 августа, 2007 15:22 #
Господа, описанных в статье метод закругления без графики никуда не годится в ИЕ7 при структуре таблиц. Появляются полосочки, причём при очень странных обстоятельствах. При переключении и загрузки контента другого таба :)
Что скажете? Может обсудим технические стороны, а не отдалённые темы о вкусах?
Евгений 21 августа, 2007 15:35 #
Glook
Juri
Выкладывайте примеры, тогда, возможно, найдется решение, а так ничего сделать нельзя.
Juri 22 августа, 2007 15:33 #
В ИЕ7 такие штуки не проходят, но при обстоятельствах довольно странных: когда открыты допустим 2 таба и ты переходишь с таба на таб и загружаешь содержимое. Таким образом структура уголков закругления меняется, баг ИЕ7?
<table> <tr> <td> <div id="rounded-box-5"> <i class="r5"></i> <i class="r3"></i> <i class="r2"></i> <i class="r1"></i> <i class="r1"></i> <div class="inner-box"> <table> <tr> <td> some text </td> </tr> </table> </div> <i class="r1"></i> <i class="r1"></i> <i class="r2"></i> <i class="r3"></i> <i class="r5"></i> </div> </td> </tr> </table>Евгений 22 августа, 2007 16:40 #
Проще всего получить этот глюк с помощью масштабирования (Ctrl + Wheel).
А решение уже есть в комментариях, предложил его tapazukk:
Только нужно это видимо не только для старых и quirks, но и для IE7 если блок вложен в таблицу.
Вот ваш примерчик с этим дополнением.
Glook 29 августа, 2007 11:54 #
я что-то не понимаю, какой пример мне надо привести?
Ещё раз попытаюсь объяснить, в приведённых Вами примерах сам блок имеет определённую ширину. Он или растягивается на всю ширину родительского элемента или имеет ширину заданную в процентах или пикселях. Меня такой вариант не устроил, так как нужен был блок с шириной, определяемой содержимым блока. Увеличилось содержимое — блок растянулся по ширине. Уменьшилось — сжался.
Ваши примеры этого не могут. Тем не менее я нашёл решение, изменив Ваш код. Было бы интересно узнать сможете ли вы сделать такое... )
Saitan 29 августа, 2007 13:22 #
А ты поделись своим опытом со всеми :)
Glook 31 августа, 2007 10:45 #
делюсь:
html
Lorem ipsra ut, nulla. Nulla in is nisl diam sdsdsdsdsdsdsdsds
css
.r1, .r2, .r3 { display: block; line-height:1px;background: #dae0ff; }.r3 { margin: 0 3px; }
.r2 { margin: 0 2px; }
.r1 { margin: 0 1px; }
.window{float:left}
.window-inner{background:#DAE0FF ;padding:0pt 2pt 2px;}
будьте внимательны при копировании
Glook 31 августа, 2007 10:49 #
html не вставляется
возьмите, пожалуйста его из примера на странице, я не менял структуру, только классы...
Евгений 31 августа, 2007 10:50 #
меняйте символ < на < а > на >
проще всего в редакторе, поиск с заменой
Glook 31 августа, 2007 12:05 #
<div class="window">
<div class="r3"> </div><div class="r2"> </div><div class="r1"> </div>
<div class="window-inner">
Lorem ipsra ut, nulla. Nulla in is nisl diam sdsdsdsdsdsdsdsds
</div>
<div class="r1"> </div><div class="r2"> </div><div class="r3"> </div>
</div>
Devgru 12 сентября, 2007 10:08 #
Евгений, скажите, как вы добились чтобы ваши элементы в обоих примерах растягивались на всю ширину элемента-родителя? Я просмотрел Firebug'ом css-стили, но там у Вас нет ни одного указания параметра width. Разве один лишь margin — повод для растягивания?
P.S. Тоже читаете Хабрахабр? :-)
Евгений 12 сентября, 2007 10:58 #
Никак не добивался :)
Если ширина не задана, блочный элемент растягивается на всю ширину родительского блока, а поля только ограничивают его растягивание.
P.S. Кто же его не читает :-)
Devgru 12 сентября, 2007 11:16 #
Офигеть. Я даже и не знал…
P.S. У Вас в CSS-стиле:
#buttons-bar input#quote-selected-button {width:13em;}Маловато 13-то, у меня в FF фраза «Цитировать выделенное» видна полностью (и не выделяется из остальных кнопок) лишь при 14em.
Регина 18 сентября, 2007 16:17 #
В IE 6 эффектом закругления обладает тег fieldset. Конечно, этот тег используется в формах обратной связи. Но его вполне можно применять, как тег div. Если поместить в fieldset несколько параграфов, то получается текстовый блок с закруглениями (небольшими, но довольно приятными для глаза).
Но это я для любящих экспериментировать написала.
Если добавить фон тегу, то закругления исчезают.
Nikita 18 сентября, 2007 21:51 #
IE6 должен умереть.
oqbo 9 октября, 2007 9:53 #
Спасибо, буду более полно использовать css
Sasha 14 октября, 2007 13:56 #
Обясните мне это как ИЕ 6,0 не поддерживает ПНГ. я в шоке!!
Сергей 15 ноября, 2007 13:03 #
Большое спасибо за статью!
Improve your self // Развивай себя » Blog Archive » Сглаженные закругленные углы без использования изображений 15 ноября, 2007 14:37 #
[...] Закругление углов без использования изображений [...]
alecoder 31 января, 2008 8:45 #
А если я хочу сделать a:hover {background-color:#red;}
как можно? кто нибудь написать для мне?
plzzz
Виталий 5 февраля, 2008 18:43 #
Спасибо! Полезная статья! Но как вариант создания уголков округлых с изображениями есть способ попроще, так там в кемментах я видел пример без изображений.
http://www.webpp.ru/blog/okruglye-ugolki-css-urok-1
Nalivaeff 12 марта, 2008 20:19 #
Подскажите пожалуйста как сделать чтобы вокруг была еще "окантовка" другим цветом как здесь: http://www.cssplay.co.uk/boxes/chunky.html
Евгений 12 марта, 2008 20:45 #
Nalivaeff, шутить изволите? даете ссылку на рабочий пример и спрашиваете как сделать. Смотрите исходник примера, который привели.
Nalivaeff 12 марта, 2008 20:52 #
Пардон. Туплю :)) Просто много нерусских букв, вот и растерялся.
klaus 26 марта, 2008 9:47 #
попробовал скрестить пример из статьи евгения с примером окантовки предложенным Nalivaeff -ым. Получилось прикольно, но вот дасада IE нижние скругления считает подругому, в мазиле всё нормально. Немогу понять что за глюк.
вод код разметки:
<b></b><b></b><b></b><b></b><b></b>
Элемент с закругленными углами и обводкой
Этот способ закругления углов подсмотрен на GMail.
<b></b><b></b><b></b><b></b><b></b>
вот стили:
.r1, .r2, .r3, .r4, .r5{
display: block;
overflow: hidden;
font-size:1px;
float: none;
}
.r5{
margin: 0 6px;
height: 1px;
background-color: #000;}
.r4{
margin: 0 4px;
height: 1px;
border-right: 2px solid #000;
border-left: 2px solid #000;
background-color: #CCCCCC;}
.r3{
margin: 0 3px;
height: 1px;
border-right: 1px solid #000;
border-left: 1px solid #000;
background-color: #CCCCCC;}
.r2{
margin: 0 2px;
height: 1px;
border-right: 1px solid #000;
border-left: 1px solid #000;
background-color: #CCCCCC;}
.r1{
margin: 0 1px;
height: 2px;
border-right: 1px solid #000;
border-left: 1px solid #000;
background-color: #CCCCCC;}
.inner-box {
padding:1em;
border-right: 1px solid #000;
border-left: 1px solid #000;
background-color: #CCCCCC;}
Евгений 26 марта, 2008 12:44 #
klaus, WordPress порезал код.
Я поправил плагин который должен пропускать код, попробуйте еще разок пользуйтесь пожалуйста предварительным просмотром.
klaus 26 марта, 2008 14:52 #
код разметки такой
<div class="rounded-box">
<b class="r5"></b><b class="r4"></b><b class="r3"></b><b class="r2"></b><b class="r1"></b>
<div class="inner-box">
<h3>Элемент с закругленными углами и обводкой</h3>
<p>Этот способ закругления углов подсмотрен на GMail.</p>
</div>
<b class="r1"></b><b class="r2"></b><b class="r3"></b><b class="r4"></b><b class="r5"></b>
</div>
klaus 26 марта, 2008 14:53 #
стили и суть проблемы вроде не порезались
Евгений 28 марта, 2008 10:14 #
klaus, в вашем коде у ie6 какие-то проблемы с margin-ами внутренних элементов, если совсем убрать их и пользоваться padding то все нормально, пример.