Сглаженные закругленные углы без использования изображений

Различные фишки и приемы с использованием CSS всегда привлекали и привлекают мое внимание. В их числе находится и способ закругления углов блока без использования какой-либо графики.

Вот несколько статей, описывающих технику закругления углов, о которой я веду речь в этой статье:

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

Итак, моя задача заключалась в реализации с помощью CSS вот такой рамки, абсолютно не используя изображения:

Рамка с закругленными углами с использованием изображений

Увеличенное изображение угла выглядит следующим образом:

Увеличенное изображение угла

Я сделал абсолютно идентичный вариант с помощью CSS. За основу был взят предложенный ранее вариант. Чтобы добавить дополнительные пиксели, которые придадут углам сглаженность, я использовал несколько вложенных тегов, каждый из которых состоит из одной буквы (b, i, q). Это позволяет максимально оптимизировать HTML-код.

HTML

<div class="b1"><b></b></div>
<div class="b2"><b><i><q></q></i></b></div>
<div class="b3"><b><i></i></b></div>
<div class="b4"><b></b></div>
<div class="b5"><b></b></div>
  <div class="text">

CSS - это здорово!

  </div>
<div class="b5"><b></b></div>
<div class="b4"><b></b></div>
<div class="b3"><b><i></i></b></div>
<div class="b2"><b><i><q></q></i></b></div>
<div class="b1"><b></b></div>

Получилась довольно-таки некрасивая конструкция, что “попахивает” извращением, но я лично готов пожертвовать этим ради возможности обойтись без графики. Если сравнивать размер HTML-кода с “несглаженным” вариантом, то разница не такая уж и значительная.

CSS

.b1, .b2, .b3, .b4, .b5,
.b1 i, .b2 i, .b3 i, .b4 i, .b5 i,
.b1 b, .b2 b, .b3 b, .b4 b, .b5 b,
.b1 q, .b2 q, .b3 q, .b4 q, .b5 q {
	height: 1px;
	font-size: 1px;
	overflow: hidden;
	border-style: solid;
	border-width: 0 1px;
	display: block;
}
.b1 {
  margin: 0 2px;
	background: #EBEEF0;
	border: none;
}
.b1 b {
 margin: 0 1px;
 background: #B8C3C8;
 border-color: #CBD3D7;
}
.b2 {margin: 0 1px;	border-color: #D6DCDF;}
.b2 b {border-color: #B8C3C8;}
.b2 i {border-color: #E4E8EA;}
.b2 q {border-color: #F7F8F9;}
.b3 {border-color: #EBEEEF;}
.b3 b {border-color: #BCC6CB;}
.b3 i {border-color: #F9FAFB;}
.b4 {border-color: #CAD2D6;}
.b4 b {border-color: #E5E9EB;}
.b5 {border-color: #B5C0C6;}
.b5 b {border-color: #FAFBFB;}
.text {
	border: 1px solid #B0BCC2;
	border-width: 0 1px;
	padding: 0 12px;
}

Примеры решения

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

Что мы имеем в результате:

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

Из минусов данной модели стоит отметить лишь несемантическую верстку и размер кода, который, имхо, не так существенен.

Комментарии (72)

  1. Валентин
    31 января 2008 г. в 15:06

    Спасибо большое , оригинальное решение! Ещё раз спасибо!

  2. dr_pepper
    6 февраля 2008 г. в 11:52

    Класс, очень познавательный и интересный материал, особенно хотелось бы отметить рекламу виагры наверху

  3. az
    7 февраля 2008 г. в 19:17

    вот вариант со скриптом:
    http://www.html.it/articoli/niftycube/index.html

  4. 11 февраля 2008 г. в 16:07

    Гран Мерси за уголки! Если пришлете комментарии к моему первенцу (www.eniounits.com), будет всем Гран мерси с поясным поклоном.

  5. Дмитрий
    14 апреля 2008 г. в 14:21

    [quote comment=”1302″]40*(1282-174)*1000000/1024/1024/1024=41,275391 гига трафа лишнего почти 42 гига тока на уголках[/quote]вот только все картинки кэшируются браузером и загружаются с сервера только один раз, а html грузиться постоянно, так что если на странице с десяток “окошек” с такими рюшечками и грузяться они миллион раз в сутки, то вот здесь-то и будет лишний траффик!

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

  6. Макс
    13 июля 2008 г. в 13:10

    Спасибо! очень инфа пригодилась!

  7. Андрей
    10 сентября 2008 г. в 17:17

    А теперь предлагаю автору с помощью его метода сделать загругленные углы радиусом эдак пикселей 30 (для больших блоков часто бывает нужно).

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

    Вобщем любое решение в данном случае компромисное, до тех пор, пока не появится официальная поддержка браузерами CSS3.

  8. wz
    18 сентября 2008 г. в 17:16

    Оригинально, но не актуально :)

  9. blagoy
    30 октября 2008 г. в 16:33

    Подскажите, как убрать черные точки в левух углах. Они появляются в ФФ и ГуглХром

  10. 30 октября 2008 г. в 18:31

    blagoy, не наблюдаю в этих браузерах никаких черных точек.

  11. 30 октября 2008 г. в 18:40

    keep4u.ru/imgs/b/081030/c4/c49db4b8bc66da5242.jpg

    сайт vykza.ru

  12. 30 октября 2008 г. в 18:44

    Может быть где-то не тот цвет указан. В моем примере же нет черных точек.

  13. blagoy
    31 октября 2008 г. в 13:38

    Dimox, я брал блок из вашего примера, не меняя. Заметил такую особенность: точки в ФФ3 и ГХ видно под Windows Vista, в XP не видно :-)

  14. 31 октября 2008 г. в 15:37

    blagoy, в XP тоже видно. Весьма загадочная ситуация. Могу лишь сказать, что эти левые точки появляются, когда в этот код:

    <div class="b2"><b><i><q></q></i></b></div>

    между <q> и </q> вставлен какой-то текст. Но текста у вас я там не вижу, поэтому…

  15. Виктор
    15 декабря 2008 г. в 15:53

    Опытным путем выяснилось, что FF3 неправильно показывает пустой тег . Если в коде заменить- проблема устраняется. Проверено в Опере9.6, IE6, FF3.0.4

  16. 15 декабря 2008 г. в 16:15

    Виктор, спасибо за информацию! Будем знать.

  17. 9 февраля 2009 г. в 16:53

    Пример хороший, только если в странице таких блоков 20-50 вес страниці превратится в проблему. Я думаю что данній метод хорош для малого количества блоков а с картинками всетаки для большого.

  18. amir
    15 февраля 2009 г. в 03:30

    и все таки – извращение.

    верстайте уж таблицами тогда,если не по душе семантика.
    на мой взгляд,применение изображений более оправдано,
    для браузеров не дружащих с возможностями css3,
    нежели хлам в html коде.

  19. vbnzq
    26 февраля 2009 г. в 10:09

    если цвет фона изменить, задолбаешься цвета блоков подбирать :D

  20. Sergey_lans
    3 марта 2009 г. в 11:46

    Лично я считаю, что на дворе 21 век, и лишние изображения (тем паче, в формате png) – не проблема. Хотя сама мысль интересна.

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

Жирный текст

Ссылка

Цитата

Внутристрочный код

CSS-код

HTML-код

JavaScript-код

PHP-код