Геометрические фигуры с помощью CSS

Простую фигуру на CSS рисует один блок div: размеры, цвет и border-radius. Для треугольников и многоугольников нужны трюки с границами, псевдоэлементами или свойство clip-path. Ниже – код 21 фигуры и советы, когда какой приём брать. Листинги можно копировать в свою страницу; там, где фигуре нужно место вокруг, это оговорено.

Во всех примерах фигура – это div с идентификатором из названия фигуры; только в разделе про clip-path вместо идентификаторов стоят классы. Для нужных вам размеров меняйте числа в CSS, остальное оставляйте как есть.

Вадим Дворниковавтор материала

Простые фигуры: круг, квадрат, прямоугольник, овал...

Окружность

Зелёная окружность, нарисованная на CSS

Окружность – это квадрат с полностью скруглёнными углами. Задайте равные width и height, а радиус поставьте в 50%. Тогда фигура остаётся кругом при любом размере.

<div id="circle"></div>
#circle {
    width: 120px;
    height: 120px;
    background: #7fee1d;
    border-radius: 50%;
}

Если размер задаёт родитель, замените высоту на aspect-ratio: 1. Блок сам поддержит квадратные пропорции.

Квадрат

Розовый квадрат, нарисованный на CSS

Квадрату нужны равные ширина и высота и цвет фона.

<div id="square"></div>
#square {
    width: 120px;
    height: 120px;
    background: #f447ff;
}

Прямоугольник

Синий прямоугольник, нарисованный на CSS

Здесь ширина больше высоты.

<div id="rectangle"></div>
#rectangle {
    width: 220px;
    height: 120px;
    background: #4da1f7;
}

Овал

Розовый овал, нарисованный на CSS

Овал – прямоугольник, у которого радиус скругления равен половине сторон. Запись 100px / 50px задаёт горизонтальный и вертикальный радиусы отдельно.

<div id="oval"></div>
#oval {
    width: 200px;
    height: 100px;
    background: #e9337c;
    border-radius: 100px / 50px;
}

Яйцо

Жёлтое яйцо, нарисованное на CSS

Яйцо – тот же овал, но вытянутый по высоте, с разными радиусами сверху и снизу. Верхние углы скругляются на 60% высоты, нижние – на 40%. Проценты подстраиваются под размер блока, поэтому пиксельный вариант радиуса не нужен.

<div id="egg"></div>
#egg {
    width: 136px;
    height: 190px;
    background: #ffc000;
    border-radius: 50% 50% 50% 50% / 60% 60% 40% 40%;
}

Параллелограмм

Фиолетовый параллелограмм, нарисованный на CSS

Функция skew() наклоняет блок по горизонтали. При положительном угле нижний край уходит вправо, а верхний влево. Это наклон, а не поворот.

<div id="parallelogram"></div>
#parallelogram {
    width: 160px;
    height: 100px;
    background: #8734f7;
    transform: skew(30deg);
}

Текст внутри наклоняется вместе с блоком. Чтобы выровнять его, вложите в фигуру элемент и наклоните его в обратную сторону: transform: skew(-30deg).

Треугольники и трапеция на границах

Как границы превращаются в треугольник

Если у блока нет ширины и высоты, от него остаются одни границы. В углах они сходятся по диагонали, и каждая граница получается трапецией. Когда у блока width: 0 и height: 0, трапеции сжимаются в треугольники.

Закрасьте одну границу, а соседние сделайте transparent – останется один треугольник. Толщина границ задаёт размер: основание равно сумме боковых границ, высота – толщине закрашенной. На этом держатся все фигуры этого раздела.

Треугольник

Жёлтый треугольник вершиной вверх, нарисованный на CSS

Закрашена нижняя граница, боковые прозрачны, поэтому вершина смотрит вверх.

<div id="triangle"></div>
#triangle {
    width: 0;
    height: 0;
    border-bottom: 140px solid #fcf921;
    border-left: 70px solid transparent;
    border-right: 70px solid transparent;
}

Треугольник вниз

Бирюзовый треугольник вершиной вниз, нарисованный на CSS

Чтобы перевернуть фигуру, закрасьте верхнюю границу.

<div id="triangle_down"></div>
#triangle_down {
    width: 0;
    height: 0;
    border-top: 140px solid #20a3bf;
    border-left: 70px solid transparent;
    border-right: 70px solid transparent;
}

Треугольник влево

Зелёный треугольник вершиной влево, нарисованный на CSS

Вершина смотрит влево, когда закрашена правая граница, а верхняя и нижняя прозрачны.

<div id="triangle_left"></div>
#triangle_left {
    width: 0;
    height: 0;
    border-top: 70px solid transparent;
    border-right: 140px solid #6bbf20;
    border-bottom: 70px solid transparent;
}

Треугольник вправо

Оранжевый треугольник вершиной вправо, нарисованный на CSS

Для обратного направления закрасьте левую границу.

<div id="triangle_right"></div>
#triangle_right {
    width: 0;
    height: 0;
    border-top: 70px solid transparent;
    border-left: 140px solid #ff5a00;
    border-bottom: 70px solid transparent;
}

Трапеция

Красная трапеция, нарисованная на CSS

У трапеции ширина не нулевая. Она задаёт длину короткого основания, а закрашенная нижняя граница с прозрачными боковыми – длинное.

<div id="trapezium"></div>
#trapezium {
    height: 0;
    width: 120px;
    border-bottom: 120px solid #ec3504;
    border-left: 60px solid transparent;
    border-right: 60px solid transparent;
}

Многоугольники и звёзды

Ромб

Зелёный ромб, нарисованный на CSS

Ромб – квадрат, повёрнутый на 45°. Повёрнутый блок занимает больше места, чем исходный квадрат, поэтому нужен внешний отступ margin, иначе фигура залезет на соседей. Для стороны 120px хватает 30px.

<div id="diamond"></div>
#diamond {
    width: 120px;
    height: 120px;
    background: #1eff00;
    transform: rotate(45deg);
    margin: 30px;
}

Пятиугольник

Синий пятиугольник, нарисованный на CSS

Пятиугольник собирают из двух частей: трапеции из границ самого блока и треугольника сверху из псевдоэлемента :before. Псевдоэлемент стоит на абсолютной позиции и цепляется к блоку через position: relative.

<div id="pentagon"></div>
#pentagon {
    width: 54px;
    position: relative;
    margin-top: 90px;
    border-width: 50px 18px 0;
    border-style: solid;
    border-color: #277bab transparent;
}

#pentagon:before {
    content: "";
    height: 0;
    width: 0;
    position: absolute;
    top: -85px;
    left: -18px;
    border-width: 0 45px 35px;
    border-style: solid;
    border-color: transparent transparent #277bab;
}

Треугольник выходит за верхний край блока на 35px. Отступ margin-top: 90px оставляет для него место с запасом, чтобы фигура не наехала на соседей.

Шестиугольник

Красный шестиугольник, нарисованный на CSS

Шестиугольник – прямоугольник с двумя треугольниками: один растёт вверх из :before, другой вниз из :after. Ширина треугольников равна ширине прямоугольника. Каждый выходит за блок на 25px, поэтому вертикальный отступ margin: 30px auto оставляет им место, а auto по бокам центрирует фигуру.

<div id="hexagon"></div>
#hexagon {
    width: 100px;
    height: 55px;
    background: #fc5e5e;
    position: relative;
    margin: 30px auto;
}

#hexagon:before {
    content: "";
    width: 0;
    height: 0;
    position: absolute;
    top: -25px;
    left: 0;
    border-left: 50px solid transparent;
    border-right: 50px solid transparent;
    border-bottom: 25px solid #fc5e5e;
}

#hexagon:after {
    content: "";
    width: 0;
    height: 0;
    position: absolute;
    bottom: -25px;
    left: 0;
    border-left: 50px solid transparent;
    border-right: 50px solid transparent;
    border-top: 25px solid #fc5e5e;
}

Восьмиугольник

Фиолетовый восьмиугольник, нарисованный на CSS

Квадрат с двумя трапециями сверху и снизу даёт восьмиугольник. Трапеции получаются из границ: одна граница закрашена цветом фигуры, боковые – цветом фона страницы, чтобы «срезать» углы.

<div id="octagon"></div>
#octagon {
    width: 100px;
    height: 100px;
    background: #ac60ec;
    position: relative;
}

#octagon:before {
    content: "";
    width: 42px;
    height: 0;
    position: absolute;
    top: 0;
    left: 0;
    border-bottom: 29px solid #ac60ec;
    border-left: 29px solid #f4f4f4;
    border-right: 29px solid #f4f4f4;
}

#octagon:after {
    content: "";
    width: 42px;
    height: 0;
    position: absolute;
    bottom: 0;
    left: 0;
    border-top: 29px solid #ac60ec;
    border-left: 29px solid #f4f4f4;
    border-right: 29px solid #f4f4f4;
}

Срезы закрашены цветом #f4f4f4. Это цвет фона страницы в примере. На другом фоне замените его на свой, иначе в углах будут заметны серые квадраты. Прозрачность для срезов не подходит: сквозь них виден квадрат. Если фон переменный или фигура лежит на картинке, берите clip-path из следующего раздела.

Звезда

Красная пятиконечная звезда, нарисованная на CSS

Пятиконечная звезда собирается из трёх треугольников. Основной – сам блок, повёрнутый на 35°. Два других – псевдоэлементы, которые поворачиваются в другую сторону и накладываются на него. Псевдоэлементы вынесены за границы блока (left: -65px и left: -105px), поэтому звезда занимает больше места, чем сам div. Оставьте вокруг неё свободное поле или оберните в контейнер с внутренними отступами, иначе она наедет на соседний текст.

<div id="star"></div>
#star {
    width: 0;
    height: 0;
    margin: 50px 0;
    position: relative;
    display: block;
    border-right: 100px solid transparent;
    border-bottom: 70px solid #fc2e5a;
    border-left: 100px solid transparent;
    transform: rotate(35deg);
}

#star:before {
    content: "";
    height: 0;
    width: 0;
    position: absolute;
    display: block;
    top: -45px;
    left: -65px;
    border-bottom: 80px solid #fc2e5a;
    border-left: 30px solid transparent;
    border-right: 30px solid transparent;
    transform: rotate(-35deg);
}

#star:after {
    content: "";
    width: 0;
    height: 0;
    position: absolute;
    display: block;
    top: 3px;
    left: -105px;
    border-right: 100px solid transparent;
    border-bottom: 70px solid #fc2e5a;
    border-left: 100px solid transparent;
    transform: rotate(-70deg);
}

Числа подобраны под конкретный размер. Хотите звезду другой величины – проще взять clip-path.

Шестиконечная звезда

Розовая шестиконечная звезда, нарисованная на CSS

Шестиконечная звезда – два одинаковых треугольника, направленных в противоположные стороны. Первый строит сам блок, второй – псевдоэлемент :after, сдвинутый вниз. Блок стоит в потоке через position: relative, а нижний отступ 40px оставляет место под второй треугольник: он выходит за границы блока.

<div id="star_six_points"></div>
#star_six_points {
    width: 0;
    height: 0;
    display: block;
    position: relative;
    border-left: 50px solid transparent;
    border-right: 50px solid transparent;
    border-bottom: 100px solid #de34f7;
    margin: 10px auto 40px;
}

#star_six_points:after {
    content: "";
    width: 0;
    height: 0;
    position: absolute;
    border-left: 50px solid transparent;
    border-right: 50px solid transparent;
    border-top: 100px solid #de34f7;
    margin: 30px 0 0 -50px;
}

Многоугольники через clip-path

Свойство clip-path обрезает блок по контуру. Задайте polygon() с координатами вершин в процентах, и всё вне контура исчезнет. Заливка – обычный background, поэтому фон страницы не играет роли, а размер задаётся одними width и height. Функции circle() и ellipse() вырезают круг и эллипс.

Поддержку сверяйте до публикации. MDN относит clip-path к широко доступным возможностям, но таблица совместимости Can I use у Safari и iOS Safari показывает частичную поддержку. Если вам нужны старые версии этих браузеров, проверьте их на caniuse.com и в таблице совместимости на MDN, а на реальном устройстве откройте страницу с фигурой. Для старых Safari бывает нужен префикс -webkit-clip-path: добавьте его строкой перед обычной записью.

Каждая вершина – пара «x y» от левого верхнего угла блока. Треугольник вершиной вверх выглядит так:

<div class="clip-triangle"></div>
.clip-triangle {
    width: 140px;
    height: 140px;
    background: #fcf921;
    clip-path: polygon(50% 0, 100% 100%, 0 100%);
}

Шестиугольник – шесть вершин. Высота блока около 87% ширины, тогда стороны получаются равными.

<div class="clip-hexagon"></div>
.clip-hexagon {
    width: 120px;
    height: 104px;
    background: #fc5e5e;
    clip-path: polygon(25% 0, 75% 0, 100% 50%, 75% 100%, 25% 100%, 0 50%);
}

Пятиконечная звезда – десять вершин: внешние и внутренние поочерёдно.

<div class="clip-star"></div>
.clip-star {
    width: 140px;
    height: 140px;
    background: #fc2e5a;
    clip-path: polygon(50% 0, 61% 35%, 98% 35%, 68% 57%, 79% 91%,
                       50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%);
}

Так же строятся пятиугольник и восьмиугольник: polygon(50% 0, 100% 38%, 82% 100%, 18% 100%, 0 38%) и polygon(30% 0, 70% 0, 100% 30%, 100% 70%, 70% 100%, 30% 100%, 0 70%, 0 30%).

Сложные фигуры: сердце, бесконечность, бабл, Pacman

Сердце

Красное сердце, нарисованное на CSS

Сердце – две «половинки» с закруглённым верхом, повёрнутые в разные стороны. Каждая – псевдоэлемент. Повороты идут вокруг нижнего угла, за это отвечает transform-origin. Блоку нужны размеры: половинки стоят на абсолютной позиции и не задают их сами.

<div id="heart"></div>
#heart {
    position: relative;
    width: 140px;
    height: 115px;
}

#heart:before,
#heart:after {
    content: "";
    width: 70px;
    height: 115px;
    position: absolute;
    background: red;
    left: 70px;
    top: 0;
    border-radius: 50px 50px 0 0;
    transform: rotate(-45deg);
    transform-origin: 0 100%;
}

#heart:after {
    left: 0;
    transform: rotate(45deg);
    transform-origin: 100% 100%;
}

Бесконечность

Зелёный знак бесконечности, нарисованный на CSS

Знак бесконечности – две петли из квадратов с толстой границей. У каждого квадрата скруглены три угла, а сам он повёрнут на 45°: левый в одну сторону, правый в другую.

<div id="infinity"></div>
#infinity {
    width: 220px;
    height: 100px;
    position: relative;
}

#infinity:before,
#infinity:after {
    content: "";
    width: 60px;
    height: 60px;
    position: absolute;
    top: 0;
    left: 0;
    border: 20px solid #06c999;
    border-radius: 50px 50px 0 50px;
    transform: rotate(-45deg);
}

#infinity:after {
    left: auto;
    right: 0;
    border-radius: 50px 50px 50px 0;
    transform: rotate(45deg);
}

Бабл для комментария

Голубой бабл для комментария с хвостиком слева, нарисованный на CSS

Бабл – прямоугольник со скруглёнными углами, к левой стороне которого псевдоэлемент :before приклеивает маленький треугольник. Свойство right: 100% ставит треугольник вплотную к левому краю.

<div id="comment_bubble"></div>
#comment_bubble {
    width: 140px;
    height: 100px;
    background: #088cb7;
    position: relative;
    border-radius: 12px;
}

#comment_bubble:before {
    content: "";
    width: 0;
    height: 0;
    right: 100%;
    top: 38px;
    position: absolute;
    border-top: 13px solid transparent;
    border-right: 26px solid #088cb7;
    border-bottom: 13px solid transparent;
}

Pacman

Жёлтый Pacman с открытым вправо ртом, нарисованный на CSS

Pacman – окружность с открытой правой стороной. Прозрачная правая граница вырезает «рот», а остальные три границы, скруглённые радиусом 70px, дают круглое тело.

<div id="pacman"></div>
#pacman {
    width: 0;
    height: 0;
    border-right: 70px solid transparent;
    border-top: 70px solid #ffde00;
    border-left: 70px solid #ffde00;
    border-bottom: 70px solid #ffde00;
    border-radius: 70px;
}

Border, clip-path или SVG: что выбрать

Приёмы отличаются тем, как ведут себя фигуры на живой странице.

ПриёмКогда братьОграничения
Границы и псевдоэлементыМаленькие стрелки, хвостики баблов, простые треугольникиРазмеры подбираются вручную, сложные фигуры собираются из нескольких элементов
clip-pathМногоугольники и звёзды любого размера, фигура на фоне-картинкеОбласть вне контура не реагирует на клик; рамка блока обрезается вместе с ним; поддержку в старых Safari сверяйте
SVGКривые, сложные контуры, иконки, анимация точекОтдельная разметка; стили меняются другими свойствами

Заключение

Простые фигуры делайте через border-radius и transform. Маленькие треугольники, например стрелки у подсказок, удобно рисовать границами. Многоугольники и звёзды берите через clip-path: они масштабируются по проценту и не зависят от фона. Перед выкладкой сверьте поддержку в нужных вам браузерах. Если нужна кривая сложнее эллипса или иконка, которую вы будете использовать в разных местах, рисуйте её в SVG.

Комментарии

Оставьте свой комментарий
Алиса К.

1 это круг, а не окружность !!!

ОА
Олег А.

Квадратики, это конечно интересно,
но нигде не нашёл, как вот такую фигуру слепить, как на скриншоте.
Возможно такое ?

А
Анд

Скопирована с хаба

АА
Александр А.

Спасибо!

ВМ
Вячеслав М.

Добрый день.
Вы можете подсказать как нарисовать в css такой круг?

AL
Alexey L.

Генератор треугольников, если кому интересно:

http://apps.eky.hk/css-triangle-generator/

AL
Alexey L.

http://htmlforum.ru/index.php?showtopic=49661#entry368125

Вот тут я подробно написал по какому принципу выполнить звезду.

AL
Alexey L.

Ну и нулевую высоту имеет смысл указывать только если в блоке предполагается содержимое. Если мы зададим нулевую высоту, то содержимое не будет растягивать блок.

AL
Alexey L.

Ну а в последнем примере вместо последних четырёх свойств можно было указать одно: border-radius: 70px. Впрочем, возможно, примеры подобраны так, чтоб показать что одни и те же свойства можно задавать иногда разными свойствами.

AL
Alexey L.

Чтоб понять как работает восьмиугольник нужно сделать его на белом фоне. Тогда видно, что грани не обрезаются, а просто граница, с помощью которой сделан эффект перехода, совпадает по цвету с фоном, в котором находится восьмиугольник. Для того, чтоб не зависеть от фона, нужно сделать исходным не квадрат, а прямоугольник и к нему приделать две трапеции.
Интересно соотношение размеров. 29 ширина перехода + 42 ширина грани + 29 ширина второго перехода = 100 пикселей, равен квадрату.
При этом, если исходить из того, что грани должны быть равны, то 29 пикселей перехода должны образовывать грань в 42 пикселя. Поскольку 29 пикселей это катет прямоугольного треугольника, а грань - его гипотенуза, то, по теореме Пифагора, 29 в квадрате (841) + ещё столько же (сумма квадратов катетов 1682) должна быть равна 42 в квадрате (1764).
Ну, почти... 🙂

Загрузить еще