Закругленные углы «в идеале»

Каждый, кто хоть раз верстал сайт с блоками, имеющими закругленные углы, задавался вопросом, как это сделать. В сети полно описаний методов и даже подборок а‑ля «38 статей о создании закругленных углов».

Требования к методу

  • минимум HTML‑элементов (в идеале – отсутствие), создающих закругления,
  • минимум картинок,
  • адекватный вид блока у пользователей с отключенной загрузкой изображений,
  • возможность растяжки блока по горизонтали и вертикали,
  • кроссбраузерность (это само собой, однако в сети есть уроки по некроссбраузерному решению этой проблемы – пример 1, пример 2)

Для себя я выработал методику, использующую одно изображение и 4 пустых тега <span>. В Чисто эстетических целях, эти теги можно вставлять в документ каким‑либо JS скриптом. Поскольку почти во всех проектах я использую JS фреймворк jQuery, то его и использую в этих целях.

Достоинства метода

  • кроссбраузерность,
  • использование одного изображения,
  • растяжение блока по вертикали и горизонтали,

Недостатки метода

  • нереализуема тень у блока с закругленными краями,
  • блок с закругленными краями позиционирован относительно своего места (position: relative)

Реализация

Слои в PSD-файлеПонадобится одна картинка – квадратное изображения со всеми четырьмя уголками. Эту картинку мы будем использовать как фон для блоков, образующих углы и спозиционированных внутри родительского блока абсолютно (position:absolute).

Я сделал один PSD‑файл с четырьмя слоями для уголков, закругленных с радиусом в 3, 5, 7 и 9 px.

К слоям применен эффект Stroke, добавляющий серую обводку толщиной в 1 px по внутренней стороне слоя. Поскольку обводка внутренняя, реальная кривизна на 1 px больше, то есть – 4, 6, 8 и 10 px.

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

PSD‑файл со слоями я выкладываю «для ленивых» – достаточно будет сделать видимым нужный слой (названия слоев соответствуют радиусу сглаживания), сменить цвет обводки и, быть может, заливку фона или цвет векторного слоя. Таким образом можно получить не только блоки с обводкой разной толщины и радиуса, но и блоки, отличающиеся по цвету от фона.

Далее – HTML примера:

<div class="nth-corners">
<h1>Блок с углами</h1>
<p>[некий контент]</p>
<!– уголки –>
<span class=”top-right”></span>
<span class=”top-left”></span>

<span class=”bot-right”></span>
<span class=”bot-left”></span>
</div>

Ничего сложного. Четыре <span> в самом конце блока <div> – и есть уголки.

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

.nth-corners {               /* целевой блок */
  width:80%;
  border:1px solid #828282;
  position:relative;
  margin:1em auto;
  padding:1em;
}

.nth-corners span {          /* все блоки, формирующие углы */
  display:block;
  position:absolute;
  width:10px;
  height:10px;
  background-image:url(img/corners.png);
}

.top-right {                 /* верхний правый */
  top:-1px;
  right:-1px;
  background-position:100% 0;
}

.top-left {                  /* верхний левый */
  top:-1px;
  left:-1px;
}

.bot-right {                 /* нижний правый */
  bottom:-1px;
  right:-1px;
  background-position:100% 100%;
}

.bot-left {                  /* нижний левый */
  bottom:-1px;
  left:-1px;
  background-position:0 100%;
}

Как видно, для блоков с абсолютным позиционированием заданы положения по углам целевого блока, фиксированные размеры и единое фоновое изображение, которое смещается для разных углов. Для верхнего левого <span> смещение фоновой картинки не задано, так как не нужно – по умолчанию она выравнивается по верхнему левому краю.

Понадобится добавить еще несколько корректирующих правил для IE6. (см. исходный код примера)

Результат

В результате имеем:

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

Идеальный вариант

А в идеале – чтобы тех <span>, которыми формируются скругления, в коде страницы не было.

Пока не настала эра CSS3, это возможно только с использованием JS. Пример на основе JS‑фреймворка jQuery иллюстрирует такой вариант решения проблемы. JS в данном случае выглядит так:

jQuery(document).ready(function() {
$('.nth-corners').append('<span class="top-right"></span><span class="top-left"></span><span class="bot-right"></span><span class="bot-left"></span>');
});

Принцип действия: находим элемент DOM с классом .nth-corners и добавляем перед закрывающим тегом этого элемента те самые четыре <span>, закругляющие уголки.

Заключение

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

Существует два вполне нормальных плагина jQuery, сглаживающих углы (на самом деле, плагинов то больше, но я говорю только о тех, что создают мягкие сглаживания, без «зазубрин»):

  1. JQuery Curvy Corners (демонстрация)
  2. Nifty Corners Cube (особо интересен этот пример)

Реклама

Позаботьтесь о тепле в доме, поставьте радиаторы чугунные отопительные и у вас всегда будет лето.

Связанные статьи

Комментарии (уже 35)

  1.  Alexey (анонимно) (04.08.2009, 22:28)

    Ну в ie6 все таки есть проблемы с уголками при масштабировании и в твоем примере тоже(чуток, но заметно) .Я всегда для ie6 ставлю просто display:none для уголков чтоб не бесили.А так все гуд).
    Ссылка на комментарий #1
    Ответить
  2.  Николай Громов (04.08.2009, 22:28)

    Алексей, вы правы.

    Я упустил глюк в 1 пиксель для right и bottom при абсолютном позиционировании в IE6.

    На данный момент я подправил примеры и все работает и в этом недобраузере отлично. Использованы expressions.
    Ссылка на комментарий #2
    Ответить
  3.  dmeet (анонимно) (04.08.2009, 22:29)

    Молодец, автор. Я сам примерно так углы делаю и считаю это лучшим способом. Почерпну у тебя fix для осла. А вот некоторые, особо извращенные натуры, умудрятся насовать в контейнер кучу каких-нибудь пустых мелких тегов (типа устаревших ) и затем создавать углы с помощью margin (это у них называется семантика).
    Ссылка на комментарий #3
    Ответить
  4.  dmeet (анонимно) (04.08.2009, 22:29)

    И еще. Думаю, что для IE6 в expressions для определения ширины и высоты блока лучше исползовать clientWidth и clientHeight. Они исключают бордюры. Это может быть полезно, если, например, пытаешься сделать окно, у которого закругляются не все углы, а только нижние, а наверху - какое-то другое оформление и бордюр там не нужен. А иначе придется менять местами цифры -2 и -1.
    Ссылка на комментарий #4
    Ответить
  5.  Виталий (анонимно) (04.08.2009, 22:29)

    здОрово! обязательно попробую применить… мне, как начинающему в MustHave без разговоров. Автору мега-респект, и огромное человеческое спасибо! =)
    Ссылка на комментарий #5
    Ответить
  6.  zyklon (анонимно) (04.08.2009, 22:29)

    Отличная техника, разве что пришлось попереписывать скрипты с выпадающими блоками из-за position:relative (результат применения можно пронаблюдать на указанном сайте (DLE ненавижу, но деваться пока некуда)).
    Ссылка на комментарий #6
    Ответить
  7.  Валентина (анонимно) (19.09.2009, 13:00)

    А вы сами так пробовали делать?
    Ссылка на комментарий #7
    Ответить
  8.  Лена (анонимно) (20.09.2009, 00:43)

    Последний абзац в тему!
    Ссылка на комментарий #8
    Ответить
  9.  друг (анонимно) (07.10.2009, 10:58)

    други, объясните, как единое фоновое изображение зеркально отображается для противоположных углов? Или может можно посмотреть ваше изображение? Чето они у меня все в одну сторону :\..
    Ссылка на комментарий #9
    Ответить
  10.  webarium.blogspot (анонимно) (07.10.2009, 11:22)

    закругленные уголки с помощью абсолютного позиционирования уже не в моде давно... достаточно одного спрайта и немного манипуляций... зачем дополнительно использовать expressions? а вобще сам так верстал раньше, когда был молодым...
    Ссылка на комментарий #10
    Ответить
  11.  друг (анонимно) (07.10.2009, 11:31)

    Я извиняюсь, все стало понятно, текст прочтен был не внимательно. Почему-то у меня в Опере и в ИЕ7 ваш блог отображается без закругленных углов (в том числе и закладки) , в мозиле и хроме все гуд.
    Ссылка на комментарий #11
    Ответить
  12.  Николай Громов (07.10.2009, 23:55)

    @ друг (анонимно):
    технология спрайтов.
    4 квадратных блока одинаковых фиксированных размеров имеют в фоне одно и то же изображение, но с разным горизонтальным и вертикальным выравниванием.
    Ссылка на комментарий #12
    Ответить
  13.  Николай Громов (07.10.2009, 23:58)

    @ webarium.blogspot (анонимно):
    тут и есть один спрайт.
    технические приемы не подвержены моде, они или актуальны (работают и не нарушают спецификаций), или не актуальны (не работают или имеют значимые недостатки).
    Ссылка на комментарий #13
    Ответить
  14.  Николай Громов (08.10.2009, 00:00)

    @ друг (анонимно):
    да, в браузерах, не поддерживающих CSS 3 (к которым относятся, на данный момент, все поколения Opera и IE), мой блог выглядит иначе.
    в Сафари, Хроме и ФФ введена частичная поддержка CSS 3.
    Ссылка на комментарий #14
    Ответить
  15.  webarium.blogspot (анонимно) (09.10.2009, 10:43)

    @ Николай Громов:

    я вижу, что здесь один спрайт.. смысл заключается в верстке более простой и более корректной в плане кроссбраузерности.. имеется в виду, что фиксы аля expressions не обязательны... чем больше абсолютного/относительного позиционирования, тем сложнее становиться выживать ИЕ6/7, особенно когда у нас еще и попапы есть, глубокая вложенность закругленного блока и так далее.. если хотите, посмотрите реализацию на моем блоге webarium.blogspot.com, Вы поймете, что Ваши уголки далеко не "в идеале", так как требуют дополнительных фиксов для работы в ИЕ6. но все же знать expressions и верстку с помощью абсолютного позиционирования всегда пригодится..
    Ссылка на комментарий #15
    Ответить
  16.  Николай Громов (09.10.2009, 15:37)

    @ webarium.blogspot (анонимно):
    тем сложнее становиться выживать ИЕ6/7мягкий знак не ставится :)

    есть другие способы делать закругленные углы, кто ж спорит? только смотреть примеры реализации нужно не у Вас, а, к примеру, у Лебедева, или в сервисах гугла :)

    год назад, когда я писал эту статейку, метод с абсолютным позиционированием казался мне наиболее удобным и правильным. сейчас мое мнение не изменилось, хотя применяю и другие методики, если считаю их более подходящими.
    Ссылка на комментарий #16
    Ответить
  17.  WARTUR (анонимно) (05.11.2009, 20:18)

    Очень интересно было почитать, однако я имею многие замечания:
    1) Слишком сложно реализуемо, не подходит для верстки эксклюзивных сайтов (то есть с индивидуальным дизайном) в промышленном масштабе.
    2) Не в коем случае не использовать плавающие элементы.
    3) Ну что вы, не работает в strict - а верстка в стандарте это главный показатель.
    4) Гораздо дурабильнее, обратно совместимо и быстра верстка с картинками по углам - Другое дело как их туда поставить =), об этом я конечно не буду сильно толковать потому что блог не мой.
    5) Хорошего верстальщика не должны волновать браузеры вообще, потому что они все отображают нормально за исключением некоторых вещей, такие вещи обычно делаются с "запасом прочности" - да еще раз прочитайте пункт 2.

    Ну вот что я хотел по этому поводу сказать.
    ЗЫ к шутке: я однажды увидел метод верстки, когда берут точку, увеличивают до 60-го размера и ставят на округление в угла с абсолютными значениями, во я зверско поржал ))).
    Ссылка на комментарий #17
    Ответить
  18.  Николай Громов (06.11.2009, 17:45)

    1) Слишком сложно реализуемо, не подходит для верстки эксклюзивных сайтов (то есть с индивидуальным дизайном) в промышленном масштабе.
    ежу понятно, что для производства чего-либо индивидуального в промышленных масштабах (логическое противоречие в данной фразе оставим на Вашей совести), никак не получится унифицировать создание элементов (читай слово «индивидуальным»).
    2) Не в коем случае не использовать плавающие элементы.
    уверен, что правила верстки Вы знаете лучше правил русского языка :D
    3) Ну что вы, не работает в strict - а верстка в стандарте это главный показатель.
    работает.
    4) Гораздо дурабильнее, обратно совместимо и быстра верстка с картинками по углам- Другое дело как их туда поставить =), об этом я конечно не буду сильно толковать потому что блог не мой.
    в такой форме этот посыл — натуральное пустозвонство.
    есть несколько способов делать закругленные углы картинками, в моей практике чаще встречаются случаи, когда указанный мною способ наиболее прост и уместен.
    Хорошего верстальщика не должны волновать браузеры вообще
    ерунду сказали. полную и абсолютную. лишь дилетантов не волнует то, как верстка отображается в разных браузерах. а если точнее, то в браузерах и IE6,7.
    ЗЫ к шутке: я однажды увидел метод верстки, когда берут точку, увеличивают до 60-го размера и ставят на округление в угла с абсолютными значениями, во я зверско поржал ))).
    в Gmail сделано примерно так. над чем тут ржать — непонятно.
    Ссылка на комментарий #18
    Ответить
  19.  Максим (анонимно) (07.12.2009, 21:49)

    Уважаю, самый простой и молообемный вариант!
    Ссылка на комментарий #19
    Ответить
  20.  Аноним (анонимно) (16.12.2009, 18:55)

    но если использовать span внутри этих углов - то они наследут его свойства )
    Ссылка на комментарий #20
    Ответить
  21.  Николай Громов (16.12.2009, 19:04)

    @ Аноним (анонимно):
    и зачем это может понадобиться? нет случаев, когда нужный SPAN нельзя прописать рядом с ними.
    Ссылка на комментарий #21
    Ответить
  22.  Den (анонимно) (17.02.2010, 01:24)

    Взял Ваш пример в разработку - работает отлично! Спасибо!
    Есть одно НО, если будет SPAN в тексте - будет не гут, по этому предлагаю немного унифицировать:
    [b].top-right, .top-left, .bot-right, .bot-left вместо .nth-corners span[/b]
    Вот тогда вообще сказка!
    Ссылка на комментарий #22
    Ответить
  23.  SDaniL (16.04.2010, 10:32)

    Спасибо за подробную статью, очень помогла решить проблему с уголками. Особенно понравилось, что img всего один - а это существенно, если разных блоков на странице много.
    Но заметил глюк в 6 "осле"...если изображение меньше 30пикс в высоту, то он пытается "набрать" эти 30 пикс дублями.
    Пришлось делать 10*30 px а так все оч гут ... =)
    Ссылка на комментарий #23
    Ответить
  24.  Николай Громов (16.04.2010, 13:50)

    @ SDaniL:
    эх… если бы не IE, давно бы уже не нужны были картинки для уголков…
    Ссылка на комментарий #24
    Ответить
  25.  awm (анонимно) (07.06.2010, 17:25)

    "в идеале" всё делается через border-radius

    http://www.css3.info/preview/rounded-border/
    https://developer.mozilla.org/en/CSS/-moz-border-radius
    http://border-radius.narod.ru/
    Ссылка на комментарий #25
    Ответить
  26.  Николай Громов (08.06.2010, 02:42)

    @ awm (анонимно):
    http://trends.openstat.ru/global-statistic-browsers — доля IE составляет 37,8%, в версиях 6, 7, 8 он не поддерживает свойства CSS3.
    готовы принеюречь 40% пользователей? :)
    то-то и оно…
    Ссылка на комментарий #26
    Ответить
  27.  Игорь (анонимно) (20.08.2010, 02:37)

    Интересная статья. На сайте какого-то дизайнера я видел как скругления сделаны с помощью дивов, размером в один пиксель и с фоновым цветом. Четыре групы по шесть штук (расположение, примерно, как здесь: ":." - нижний левый угол, ".:" - нижний правый, дальше аналогично).
    А вообще, кому интересно, посмотрите как делают скругления в Студии Лебедева, никаких проблем при стрикте и стандарте и т.д.
    Ссылка на комментарий #27
    Ответить
  28.  Николай Громов (21.08.2010, 12:43)

    @ Игорь (анонимно):
    смотрел, конечно. не устроило.
    Ссылка на комментарий #28
    Ответить
  29.  Максим (анонимно) (24.01.2011, 12:40)

    Блин. Я задолбался уже с этими уголками.
    Куча способов и не одного универсального. Уже думаю может картинки прилепиять. Опять же многие отключают загрузку картинок в браузере, для облегчения загрузки страницы.
    Пока использую border-radius,
    но как было сказано, это не идеальное решение. Опять же надо учитывать если юзер выключит подгруз изображений...

    Появилось что то новое более универсальное?
    Ссылка на комментарий #29
    Ответить
  30.  Михаил (анонимно) (25.01.2011, 01:58)

    А где в этом коде указывать ссылку на изображение закгругленного угла я вот вообще не пойму, прокоментируйте пожалуйста для юзеров!

    Вот я вставил код в чистый html

    Дальше что, где тут изображение подвязывать?
    Ссылка на комментарий #30
    Ответить
  31.  Николай Громов (25.01.2011, 16:06)

    @ Михаил (анонимно):
    дальше добавляем в head страницы CSS и саму картинку кладем на сервере рядом.
    изображения добавляются с помощью CSS — так они не дадут блоков «незагруженная картинка» при отключенных картинках.
    Ссылка на комментарий #31
    Ответить
  32.  Сергей (анонимно) (27.01.2011, 16:06)

    ну если это было год назад, то нормально, но я делаю вложенные div или span style="display:block"(для ссылок), и просто background-ом ложу в нужный мне угол, и это вообще для всех браузеров нормально.
    По поводу еще бордера, все это дело оборачиваем в еще один див и даем ему бордер, а в первом его дочернем div ставим margin:-3px; и все работает без js(единственное для Ie надо прописать z-index хотя бы один, а то виден бордер нижний)
    P.S. если кого интересует могу дать универсалку для углов на ЛЮБОМ!!! фоне (увы только таблицей)
    но вот сейчас придумал как сделать div =)
    Ссылка на комментарий #32
    Ответить
  33.  Николай Громов (27.01.2011, 19:19)

    @ Сергей (анонимно):
    интересно, как вы перемещаете блочные элементы background_ом...
    видимо, Вы имеете в виду абсолютное позиционирование, которое описано в статье.
    загругленные углы таблицами?
    ну-ну... )
    Ссылка на комментарий #33
    Ответить
  34.  Андрей (анонимно) (26.02.2011, 12:45)

    А почему нельзя использовать кириллические комментарии в CSS? можете обьяснить пожалуйста
    Ссылка на комментарий #34
    Ответить
  35.  Николай Громов (26.02.2011, 13:07)

    Ссылка на комментарий #35
    Ответить

Ваш комментарий

Комментарий будет опубликован после проверки.



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







(обязательно)


Дополнительно

RSS-подписка

В этом блоге две категории