Закругление углов без использования изображений
Евгений, 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 или любом другом языке, которому вы отдаете предпочтение) функцию которая будет генерировать код для уголков, на основе заданного радиуса закругления, что должно упростить шаблоны и поддержку.

















сомнительное решение. Недостаток в виде несемантических элементов остаётся, их даже больше становится. Гибкость гораздо меньшая - например таким образом существенно сложнее сделать градиент, нежели картинками. Загружаемый объём вряд ли становится меньше. Разве что обращений к серверу в самом деле меньше. Но для того же gmail это актуально, а для менее посещаемых сайтов - вряд ли.
Для семантической верстки лучше использовать JavaScript-решения, вроде NiftyCube -- делает то же самое, только не нужно вводить дополнительные элементы.
Единственный, на мой субъективный взгляд и лично для меня, минус — «пикселеватость» закругленных уголков. Я сейчас как раз бьюсь над этой проблемой (с использованием png-изображений). Но IE6, как известно, не поддерживает этот замечательный графический формат, а функция AlphaImageLoader имеет такой ряд ограничений, что он затмевает все свои возможности. :(
Почему вы margin называете полями, а padding -- отступами.
По-моему, нужно наоборот.
Padding -- поля, margin -- отступ.
Шильгия
Загружаемый объем сильно не измениться (если количество скругленных углов в разумных пределах), потому что текст эффективно сжимается gzip`пом, который включен практически на любом серьезном проекте.
Конечно, сделать градиенты будет сложно, но эта техника предназначена для простых закруглений и не претендует на универсальность.
Соблюсти семантику элементов можно только при использовании свойства
-moz-border-radiusв остальных случаях она страдает, я тоже не в восторге от этого, но ничего не поделаешь.Dmytro Shteflyuk
Я хотел упомянуть о том, что можно использовать JavaScript и не нарушать семантику документа, но едва ли это может получить широкое распространение.
kost
margin - в переводе на русский "поле", а padding остается называть только "отступом".
Спасибо.
Как раз под руку попалось. думал картинкой сделать, а теперь вот так вот попробую.
Это бред. Никогда не понимал людей, которые ради сомнительной красивости готовы делать такое уродство в коде.
В общем, я за background. И пусть будут острые углы, когда картинки отключены. В этом нет ничего плохого, тем более процент пользователей с отключенными картинками небольшой (хотя сам к ним отношусь).
Больше примеров с уголками:
И всё в основном в CSS!
http://www.cssplay.co.uk/boxes/krazy.html
И вот еще, неплохой примерчики
http://www.cssplay.co.uk/boxes/chunky.html
http://www.cssplay.co.uk/boxes/snazzy.html
Оказывается очень распространенных метод, а я подсмотрел у Gmail`а чертежи велосипеда :)
Список из 50+ способов скругления углов:
http://www.smileycat.com/miaow/archives/000044.php
конечно же велосипед :)
что бы не говорили, а каждый метод имеет право на жизнь. все зависит от конкретной ситуации. более того можно отказаться от уголков вообще :)
Какой же это велосипед
Это такой же баянистый баян как и Nifty Corners.
BrokenBrake, с точки зрения семантики предложенный способ ни чем не хуже четырех вложенных друг в друга дивов с background-image.
Re.Актив, согласен. Но я никогда не использую четыре вложенных divа из-за каких-то там уголков. Скругление я делаю только в том случае, если могу привязаться к естественным элементам, а вводить в структуру всякий мусор для этого мне неприятно.
Я понимаю, что все эти извраты придуманы работающими на дядю верстальщиками, которым во что бы то ни стало надо осуществить задумку дизайнера, какая бы она ни была. Но есть что-то порочное в такой практике, не находите?
Такой способ позволяет без особых проблем создать закругления с нужного цвета границами. Тот же NiftyCorners сдается перед такой задачей по причинам совместимости.
Ну и ничего не мешает не городить это в коде, а написать простенький скриптик для автоматического добавления этих строк в нужное место.
Во-во... давайте еще скриптики писать для скругления углов.
BrokenBrake, а что тебя смущает в использовании скриптов? На http://wildbit.com/ например, довольно успешно исползуют описанный метод как раз в комбинации со специальным скриптом. В их случае вообще имеют место быть пять блоков с закругленными краями разных цветов и степени насыщенности. Использовать для каждого такого блока фоновые картинки - идиотизм, а закругления предложенным способ - отличное решение. Кстати, не ленитесь, подсмотрите как именно все реализовывается, по моему довольно интересно...
Re.Актив, ну просто я не люблю избыточность. Когда ради сомнительных красивостей такое нагромождают. Ну не стоят уголки этого.
Я если и делаю, то там, где можно привязать их (background) к логически обоснованным элементам, либо вообще использую CSS-3, а на неподдерживающие браузеры пофиг - в них тоже будет хорошо смотреться, но без скругления.
Можно еще писать font-size:1px; (для старых ie или для 6-го в quirks mode)
2BrokenBrake
На css3 переходить рановато, очень хорошо сглаживает углы Safari 3 (да собственно у этого браузера все ОК с css3-зачот разработчикам!), что не скажешь даже о мозилле и его возможностях интерпритации стилей (-moz-border-radius как-то коряво отображется, нет сглаживания). Стоит ли делать круглые углы такм способом под два браузера?
А чем плохо использовать графику для создания закругленных или вообще любых уголков?
В самом начале статьи об этом написано.
Могу добавить, что многое зависит от того как это будет реализовано. Главное избегать тега
imgон не для декоративных изображений (тем не менее такие варианты периодически появляются, к примеру, Хабр), это очень плохо смотрится если в браузере отключена графика.Наверное ТАКОЕ чувствует себя немного неуютно рядом со статьями про web-стандарты, семантику, микроформаты и т.п. Это возвращение в славные 90-е.
Тег b не устаревший. Он используется и будет использоваться в HTML5:
В данном случае его присутствие абсолютно неуместно.
> это очень плохо смотрится если в браузере отключена графика
Если отключена графика, то неважно, каким образом вставлена картинка — тегом img, или background'ом к div'у — в любом случае её видно не будет…
Мне кажется, что у вас графика включена :)
Если углы закругляются background’ом то при отключении графики мы получим обычный блок с незакругленными углами, что вполне нормально, но если углы закругляются с помощью img то по углам блока мы увидим пустые квадратики под изображения, что гораздо хуже чем просто незакругленные углы.
За примером далеко ходить не будем:

Точно. Я пользуюсь Oper'ой — там квадратиков нет. :))
насколько я понял этот способ годится или для блока фиксированной ширины или для блока растянутого на 100% от ширины родительского...
Попытки таким способом задать закругления блоку с плавающей шириной, зависящей от содержимого, успехом НЕ увенчались (речь конечно об IE)
Попробовал, сделать блоки плавающей ширины (30%), никаких проблем, вот что получилось, возможно я, не понял, что именно требуется, тогда выложите пример сюда или в контактную форму.
ширина блока должна соответствовать содержимому, я имел ввиду именно это, говоря о "плавающей ширине", а вы предлагаете сделать её фиксированную, не важно в чём в пикселях или процентах это будет выражено.
Господа, описанных в статье метод закругления без графики никуда не годится в ИЕ7 при структуре таблиц. Появляются полосочки, причём при очень странных обстоятельствах. При переключении и загрузки контента другого таба :)
Что скажете? Может обсудим технические стороны, а не отдалённые темы о вкусах?
Glook
Juri
Выкладывайте примеры, тогда, возможно, найдется решение, а так ничего сделать нельзя.
В ИЕ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>Проще всего получить этот глюк с помощью масштабирования (Ctrl + Wheel).
А решение уже есть в комментариях, предложил его tapazukk:
Только нужно это видимо не только для старых и quirks, но и для IE7 если блок вложен в таблицу.
Вот ваш примерчик с этим дополнением.
я что-то не понимаю, какой пример мне надо привести?
Ещё раз попытаюсь объяснить, в приведённых Вами примерах сам блок имеет определённую ширину. Он или растягивается на всю ширину родительского элемента или имеет ширину заданную в процентах или пикселях. Меня такой вариант не устроил, так как нужен был блок с шириной, определяемой содержимым блока. Увеличилось содержимое — блок растянулся по ширине. Уменьшилось — сжался.
Ваши примеры этого не могут. Тем не менее я нашёл решение, изменив Ваш код. Было бы интересно узнать сможете ли вы сделать такое... )
А ты поделись своим опытом со всеми :)
делюсь:
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;}
будьте внимательны при копировании
html не вставляется
возьмите, пожалуйста его из примера на странице, я не менял структуру, только классы...
меняйте символ < на < а > на >
проще всего в редакторе, поиск с заменой
<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>
Евгений, скажите, как вы добились чтобы ваши элементы в обоих примерах растягивались на всю ширину элемента-родителя? Я просмотрел Firebug'ом css-стили, но там у Вас нет ни одного указания параметра width. Разве один лишь margin — повод для растягивания?
P.S. Тоже читаете Хабрахабр? :-)
Никак не добивался :)
Если ширина не задана, блочный элемент растягивается на всю ширину родительского блока, а поля только ограничивают его растягивание.
P.S. Кто же его не читает :-)
Офигеть. Я даже и не знал…
P.S. У Вас в CSS-стиле:
#buttons-bar input#quote-selected-button {width:13em;}Маловато 13-то, у меня в FF фраза «Цитировать выделенное» видна полностью (и не выделяется из остальных кнопок) лишь при 14em.
В IE 6 эффектом закругления обладает тег fieldset. Конечно, этот тег используется в формах обратной связи. Но его вполне можно применять, как тег div. Если поместить в fieldset несколько параграфов, то получается текстовый блок с закруглениями (небольшими, но довольно приятными для глаза).
Но это я для любящих экспериментировать написала.
Если добавить фон тегу, то закругления исчезают.
IE6 должен умереть.
Спасибо, буду более полно использовать css
Обясните мне это как ИЕ 6,0 не поддерживает ПНГ. я в шоке!!
А если я хочу сделать a:hover {background-color:#red;}
как можно? кто нибудь написать для мне?
plzzz
Спасибо! Полезная статья! Но как вариант создания уголков округлых с изображениями есть способ попроще, так там в кемментах я видел пример без изображений.
http://www.webpp.ru/blog/okruglye-ugolki-css-urok-1
Подскажите пожалуйста как сделать чтобы вокруг была еще "окантовка" другим цветом как здесь: http://www.cssplay.co.uk/boxes/chunky.html
Nalivaeff, шутить изволите? даете ссылку на рабочий пример и спрашиваете как сделать. Смотрите исходник примера, который привели.
Пардон. Туплю :)) Просто много нерусских букв, вот и растерялся.
попробовал скрестить пример из статьи евгения с примером окантовки предложенным 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;}
klaus, WordPress порезал код.
Я поправил плагин который должен пропускать код, попробуйте еще разок пользуйтесь пожалуйста предварительным просмотром.
код разметки такой
<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, в вашем коде у ie6 какие-то проблемы с margin-ами внутренних элементов, если совсем убрать их и пользоваться padding то все нормально, пример.
Способ рисования толстой рамки с закрулёнными углами
Кстати, этот же метод использует jQuery плагин Corners. Он, к тому же, может создавать и сглаженные уголки. Плюс его использования в том, что исходный код не засорен всей этой кучей дивов. Ну, а минусы, думаю, понимаете сами.
Насчет CSS свойств, можно сделать закругленные уголки и черех них, о чем писалось в начале статьи. -moz-border-radius для FF движков, -webkit-border-radius для Safari и Google Chrome, и закругленными SVG для Opera. ИЕ, конечно, курит в сторонке, но для некоторых вариантов подойдет.
http://www.roundedcornr.com/
вот очень интересный сайт
Автору спасибо, буду использовать
Отличный метод! Использую в своих проектах.
Валидатор XHTML 1.0 Strict ругается на пустые теги, даже пробел между тегами не прокатывает. Что делать в этом случае?
попробуйте вместо пробела использовать
В метод с использованием изображений иногда можно обойтись и без несемантических элементов.(Меня задело такое безоговорочное утверждение о несемантических элементах и в начале статьи, и в комментариях...)
не совсем понял как общая высота блока регулируется...