Геометрические фигуры на CSS

http://css-tricks.com/examples/ShapesOfCSS/
  • Перевод
Отличная подборка, как нарисовать различные геометрические фигуры одним элементом HTML.

Квадрат



#square {
	width: 100px;
	height: 100px;
	background: red;
}


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



#rectangle {
	width: 200px;
	height: 100px;
	background: red;
}


Круг



#circle {
	width: 100px;
	height: 100px;
	background: red;
	-moz-border-radius: 50px;
	-webkit-border-radius: 50px;
	border-radius: 50px;
}


Овал



#oval {
	width: 200px;
	height: 100px;
	background: red;
	-moz-border-radius: 100px / 50px;
	-webkit-border-radius: 100px / 50px;
	border-radius: 100px / 50px;
}


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



#triangle-up {
	width: 0;
	height: 0;
	border-left: 50px solid transparent;
	border-right: 50px solid transparent;
	border-bottom: 100px solid red;
}


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



#triangle-down {
	width: 0;
	height: 0;
	border-left: 50px solid transparent;
	border-right: 50px solid transparent;
	border-top: 100px solid red;
}


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



#triangle-left {
	width: 0;
	height: 0;
	border-top: 50px solid transparent;
	border-right: 100px solid red;
	border-bottom: 50px solid transparent;
}


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



#triangle-right {
	width: 0;
	height: 0;
	border-top: 50px solid transparent;
	border-left: 100px solid red;
	border-bottom: 50px solid transparent;
}


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



#triangle-topleft {
	width: 0;
	height: 0;
	border-top: 100px solid red; 
	border-right: 100px solid transparent;			
}


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



#triangle-topright {
	width: 0;
	height: 0;
	border-top: 100px solid red; 
	border-left: 100px solid transparent;
	
}


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



#triangle-bottomleft {
	width: 0;
	height: 0;
	border-bottom: 100px solid red; 
	border-right: 100px solid transparent;	
}


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



#triangle-bottomright {
	width: 0;
	height: 0;
	border-bottom: 100px solid red; 
	border-left: 100px solid transparent;
}


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



#parallelogram {
	width: 150px;
	height: 100px;
	-webkit-transform: skew(20deg);
	   -moz-transform: skew(20deg);
	     -o-transform: skew(20deg);
	background: red;
}


Трапеция



#trapezoid {
	border-bottom: 100px solid red;
	border-left: 50px solid transparent;
	border-right: 50px solid transparent;
	height: 0;
	width: 100px;
}


Звезда (6-конечная)



#star-six {
	width: 0;
	height: 0;
	border-left: 50px solid transparent;
	border-right: 50px solid transparent;
	border-bottom: 100px solid red;
	position: relative;
}
#star-six:after {
	width: 0;
	height: 0;
	border-left: 50px solid transparent;
	border-right: 50px solid transparent;
	border-top: 100px solid red;
	position: absolute;
	content: "";
	top: 30px;
	left: -50px;
}


Звезда (5-конечная)




#star-five {
   margin: 50px 0;
   position: relative;
   display: block;
   color: red;
   width: 0px;
   height: 0px;
   border-right:  100px solid transparent;
   border-bottom: 70px  solid red;
   border-left:   100px solid transparent;
   -moz-transform:    rotate(35deg);
   -webkit-transform: rotate(35deg);
   -ms-transform:     rotate(35deg);
   -o-transform:      rotate(35deg);
}
#star-five:before {
   border-bottom: 80px solid red;
   border-left: 30px solid transparent;
   border-right: 30px solid transparent;
   position: absolute;
   height: 0;
   width: 0;
   top: -45px;
   left: -65px;
   display: block;
   content: '';
   -webkit-transform: rotate(-35deg);
   -moz-transform:    rotate(-35deg);
   -ms-transform:     rotate(-35deg);
   -o-transform:      rotate(-35deg);
   
}
#star-five:after {
   position: absolute;
   display: block;
   color: red;
   top: 3px;
   left: -105px;
   width: 0px;
   height: 0px;
   border-right: 100px solid transparent;
   border-bottom: 70px solid red;
   border-left: 100px solid transparent;
   -webkit-transform: rotate(-70deg);
   -moz-transform:    rotate(-70deg);
   -ms-transform:     rotate(-70deg);
   -o-transform:      rotate(-70deg);
   content: '';
}


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



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


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



#hexagon {
	width: 100px;
	height: 55px;
	background: red;
	position: relative;
}
#hexagon:before {
	content: "";
	position: absolute;
	top: -25px; 
	left: 0;
	width: 0;
	height: 0;
	border-left: 50px solid transparent;
	border-right: 50px solid transparent;
	border-bottom: 25px solid red;
}
#hexagon:after {
	content: "";
	position: absolute;
	bottom: -25px; 
	left: 0;
	width: 0;
	height: 0;
	border-left: 50px solid transparent;
	border-right: 50px solid transparent;
	border-top: 25px solid red;
}


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



#octagon {
	width: 100px;
	height: 100px;
	background: red;
	position: relative;
}
 
#octagon:before {
	content: "";
	position: absolute;
	top: 0;
	left: 0;    
	border-bottom: 29px solid red;
	border-left: 29px solid #eee;
	border-right: 29px solid #eee;
	width: 42px;
	height: 0;
}
 
#octagon:after {
	content: "";
	position: absolute;
	bottom: 0;
	left: 0;    
	border-top: 29px solid red;
	border-left: 29px solid #eee;
	border-right: 29px solid #eee;
	width: 42px;
	height: 0;
}


Сердечко



#heart {
    position: relative;
    width: 100px;
    height: 90px;
}
#heart:before,
#heart:after {
    position: absolute;
    content: "";
    left: 50px;
    top: 0;
    width: 50px;
    height: 80px;
    background: red;
    -moz-border-radius: 50px 50px 0 0;
    border-radius: 50px 50px 0 0;
    -webkit-transform: rotate(-45deg);
       -moz-transform: rotate(-45deg);
        -ms-transform: rotate(-45deg);
         -o-transform: rotate(-45deg);
            transform: rotate(-45deg);
    -webkit-transform-origin: 0 100%;
       -moz-transform-origin: 0 100%;
        -ms-transform-origin: 0 100%;
         -o-transform-origin: 0 100%;
            transform-origin: 0 100%;
}
#heart:after {
    left: 0;
    -webkit-transform: rotate(45deg);
       -moz-transform: rotate(45deg);
        -ms-transform: rotate(45deg);
         -o-transform: rotate(45deg);
            transform: rotate(45deg);
    -webkit-transform-origin: 100% 100%;
       -moz-transform-origin: 100% 100%;
        -ms-transform-origin: 100% 100%;
         -o-transform-origin: 100% 100%;
            transform-origin :100% 100%;
}


Знак бесконечности



#infinity {
    position: relative;
    width: 212px;
    height: 100px;
}
 
#infinity:before,
#infinity:after {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    width: 60px;
    height: 60px;    
    border: 20px solid red;
    -moz-border-radius: 50px 50px 0 50px;
         border-radius: 50px 50px 0 50px;
    -webkit-transform: rotate(-45deg);
       -moz-transform: rotate(-45deg);
        -ms-transform: rotate(-45deg);
         -o-transform: rotate(-45deg);
            transform: rotate(-45deg);
}
 
#infinity:after {
    left: auto;
    right: 0;
    -moz-border-radius: 50px 50px 50px 0;
         border-radius: 50px 50px 50px 0;
    -webkit-transform:rotate(45deg);
       -moz-transform:rotate(45deg);
        -ms-transform:rotate(45deg);
         -o-transform:rotate(45deg);
            transform:rotate(45deg);
}
Поделиться публикацией

Похожие публикации

Комментарии 103
    +121
    По мере приближения к концу статьи мои глаза становились всë больше и больше О_О
    Класс!
      +171
      А когда я увидел, кто автор, они чуть не вывалились!
        +8
        Ализар не автор какбэ, а переводчик.
          +7
          Думаю, это был сарказм (вставил бы Шелдона, да карма плохая)
            +10
            Он автор поста, который является переводом.
            Думаю, все знакомы с его творчеством и я никого не ввел в заблуждение.
          0
          А когда открываешь в ИЕ, они опять становятся обычними:(
          –1
          Потрясающе! Респект, жалко что пока, еще живы разные динозавры, которые это не поддерживают, придется верстать с поддержкой устаревших браузеров, а значит без этих возможностей.
            +5
            А зачем вам это? :) Картинкой те же фигуры займут меньше места :)
              +3
              Да нежели? «Бесконечность» вот 2.1 кб весит, ксс байт 500 минус один запрос к серверу + покажется моментально в т.ч. в режиме без графики. Минусы тоже есть конечно, но весить будет точно меньше.
                +11
                В свг она весит около 200 байт. Используйте вектор уже, его даже в сам документ без доп. запросов внедрять можно при использовании правильного доктайпа.
                  0
                  А как же отделение данных от представления?
                    0
                    Да и глянул описание SVG на вики, там один доктайп и корневой элмент больше 200 байт на взгляд занимает.
                      0
                      А при чём здесь разделение? Если у вас картинка — элемент оформления, то выносите, если является контентом — инлайните. Работает так, как вам надо.
                    +14
                    Знак бесконечности не столько фигура, сколько текстовый символ. Потому, юзаем Unicode. :)
                    +1
                    Такие фигуры более гибки и лёгко могут быть редактированы посредством JS и CSS, нежели статичные картинки — анимиции, масштабирование, смена цвета и тд.

                    Уголки и треугольники можно свободно использовать не беспокоясь о динозаврах, только сложные фигуры будут весить тяжелее картинок.
                      +3
                      SVG. Причём тут статичные картинки?
                      +13
                      я вам больше скажу — чаще всего достаточно и такого: jsfiddle.net/DrLdx/ )))
                        0
                        Занятная вещица, помню такую же на лабах в универе писали
                          +2
                          Шрифт wingdings — windows only
                            +1
                            Ничто не мешает впилить шрифт в страницу.
                              0
                              Копирайт мешает, да и шрифт много весит и не во всех браузерах будет нормально отображаться.
                          0
                          А если текстом, то еще меньше места займет jrgraphix.net/r/Unicode/25A0-25FF. Только статья ведь не об этом.
                            0
                            А я и не на статью отвечаю, а не конкретный комментарий.
                              0
                              Тьфу. «На конкретный».
                        0
                        Супер! Но насколько эти решения кроссбраузерны? Сейчас буду тестить! Спасибо за статью!

                        +1
                        Спасибо за упорядоченную подборку, а то в интернете как-то кусками раскидано.
                          0
                          На сайтах будущего вообще не будет картинок)))
                          А что? Градиенты можно, фигуры можно, логотип составят и вперёд.
                            +2
                            SVG же
                            +16
                            Отличный перевод!
                              –3
                              А мне не понравился
                                +3
                                только при переводе куда то делся Nicolas Gallagher…
                                +43
                                аlizar уже не тот…
                                  +10
                                  Кто первый нарисует советский знак качества?
                                    +3
                                    Мне это не очень понятно. Во-первых, CSS код для рисования, скажем, сердечка явно превзойдёт по количеству байтов эквивалентный PNG, а во-вторых, создавать содержание при помощи CSS есть грехъ.
                                      0
                                      Какое ещё содержание? Это такое же оформление как и любой другой буллет, только в данном случае вы не грузите лишние байты в картинке.
                                        0
                                        давайте тогда всю графику заменим на ASCII (или CSS?) art :))
                                          0
                                          Но грузите лишние байты в CSS. В чём разница тогда?
                                            0
                                            В том, что запрос к серверу один, а это время, которое в сумме может быть заметно пользователю.
                                              0
                                              dataURI
                                          0
                                          Сердечку можно добавить динамики — простым скриптом.
                                            0
                                            Тогда уже base64 или svg
                                              +1
                                              Спорт высших достижений.
                                                0
                                                а во-вторых, создавать содержание при помощи CSS есть грехъ.

                                                Следует различать ситуации когда изображение является содержанием, а когда оформлением.
                                              • НЛО прилетело и опубликовало эту надпись здесь
                                                  0
                                                  переводил у себя на блоге) отличная статья
                                                    –11
                                                    Этот «класс» не работает даже в IE8, остальное не волнует, пока у IE такая доля рынка.

                                                    А то я могу сам написать браузер, который будет по #putin{portrait:putin} кое-чей портрет выводить )))
                                                      +20
                                                      > Этот «класс» не работает даже в IE8

                                                      А как оно в Netscape Navigator 4.0?
                                                        +5
                                                        в Mosaic тоже не работает! не буду пользоваться!
                                                          +1
                                                          CSS3 PIE может кое что подправить в плане поддержки свойств CSS3 в IE8.
                                                            +6
                                                            +1 lynx тоже нифига не кажет
                                                              0
                                                              >Этот «класс» не работает даже в IE8

                                                              Думаете, кто-то удивился?
                                                                +1
                                                                Круто вы все меня тут засрали, а себе орденов навешали.
                                                                Желаю вам хороших работ со знаком бесконечности «чисто цсской», на «нелоховских» браузерах радующих ваших посетителей.

                                                                Рекомендую еще вешать надписи:«Этот сайт оптимизирован под ..., если у вас другой, то на месте прямоугольника должна быть восьмерка». Т.е. не с прямоугольным вас марта, а с восьмым)
                                                                +20
                                                                  +2
                                                                  Только разница в голосовании +6 и +233. В чём, интересно, секрет? Неужели надо было всего лишь перевести слова Square и Circle?)
                                                                  +7
                                                                  Ждем фракталов на CSS =)
                                                                    0
                                                                    transform и radius более или менее понятны.
                                                                    а вот треугольники несколько удивили, почему border-bottom выдает треугольник? нормальное техничное объяснение есть? (не то что легко находится в интернете — треугольники мол появляются и стремятся к друг другу если ширина/высота 0)
                                                                      +2
                                                                      Есть. Попробуй нарисовать рамку конечной ширины вокруг объекта нулевого размера. А терерь убери все грани рамки, кроме одной. Получишь такой клинышек.
                                                                        0
                                                                        Не border-bottom выдает треугольник, а border-bottom одного цвета + border-left и border-right другого.
                                                                        Когда вы указываете для разных бордеров разную ширину, их граница друг c другом делится в равных пропорциях.
                                                                          0
                                                                          Сумбурность пояснения постараюсь компенсировать наглядностью :)
                                                                          habrahabr.ru/blogs/webdev/46033/
                                                                        –10
                                                                        У меня только один единственный вопрос: а нахуя?
                                                                        (хотя треугольники в немного измененном виде я использую что бы приделывать «хлятики» к облакам с сообщениями)
                                                                          –5
                                                                          Зачем квадрату ( #square ) и width и height, если он квадрат?
                                                                            –3
                                                                            Потому что в IE надо задавать и height и width.
                                                                              +3
                                                                              А другие браузеры что будут отображать квадрат, если одного из этих свойств убрать? Что то Вы не то говорите.
                                                                              +4
                                                                              А в чем собственно проблема?

                                                                              Квадрат – правильный четырёхугольник, у которого все стороны и углы равны между собой.

                                                                              В контексте CSS это означает, что у данного блока пара свойств height и width должны быть равны между собой.
                                                                                –4
                                                                                На лицо лишняя сущность. Либо одно из свойств у square, либо сам square.
                                                                                  +3
                                                                                  А по мойму Вы просто не учитываете контекст.
                                                                                    –5
                                                                                    Может быть. Поясните, пожалуйста.

                                                                                    1) Зачем делать #square с равными сторонами, если можно сделать #rectangle с равными сторонами? Ради экономии 3-х символов текста?
                                                                                    2) Что будет, если сделать #square с не равными сторонами?
                                                                                      +1
                                                                                      Семантика же.
                                                                                      +4
                                                                                      Верно, контекст не тот. Извините.
                                                                                +2
                                                                                Действительно стоящая статья. Вроде простой код, а делает такие вещи!)
                                                                                  0
                                                                                  Спасибо автору за статью, с трапецией придумал интересную анимацию.
                                                                                    +1
                                                                                    Бесконечность — ахренеть можно…
                                                                                      0
                                                                                      Где те люди, которые скажут: «это фотошоп»?
                                                                                        0
                                                                                        Есть же место где это все можно увидеть НЕ картинками:
                                                                                        css-tricks.com/examples/ShapesOfCSS
                                                                                        Так что тут все честно.
                                                                                          0
                                                                                          я шутил.
                                                                                            0
                                                                                            Да, я понял. ;)
                                                                                            В живую интересней смотреть, чем картинками.
                                                                                        +18
                                                                                        Тоже мне фокус. Нафига вообще CSS:
                                                                                        ♥❤❥ ▰▲►▼◄●◖◟◡◢◪◥◭☭☻⿹✦✿★∞
                                                                                          –1
                                                                                          Попробуй поставить в качестве фона на странице и узнаешь нафига CSS нужен.
                                                                                            0
                                                                                            div-ы выше сделать фоном можно разве что абсолютно/фиксированно позиционируя, да растягивая на весь экран. Точно так же и символы, которые привел savostin, могут стать фоновыми. И мне явно больше нравится последний вариант.
                                                                                          +1
                                                                                          Чтобы отделять данные от оформления?
                                                                                          +3
                                                                                          Дык, css из топика тоже нифига фоном не становится.
                                                                                          Вернее становится, как отдельный слой.
                                                                                          Впрочем как и символ.
                                                                                          Вот только символ масштабировать можно. Кстати вместе с текстом.
                                                                                            +1
                                                                                            пардон, промазал, это ↑↑↑↑↑↑
                                                                                              0
                                                                                              Способом, описанным в посте, сможете создавать геометрические фигуры с нужными размерами.

                                                                                              Школьный курс → чистый css :)
                                                                                              image
                                                                                                0
                                                                                                Вы имеете в виду углы всякие? Потому что общие размеры естественно можно задавать размером шрифта.
                                                                                                  0
                                                                                                  Да, и углы тоже. Например, мне нужен был правильный двенадцатиугольник, угол четко 30 градусов.
                                                                                                  И можно не только равнобедренные треугольники/трапеции делать, как в примерах.

                                                                                                  Кстати, это все гораздо лучше представляется, если порисовать в векторных редакторах. Из простых фигур получаются сложные.
                                                                                              –1
                                                                                              невероятно! даешь хак для ИЕ6 с поддержкой всего этого!
                                                                                                +1
                                                                                                лучше хак, который позволит обновить ie6 до более новой версии, у оставшихся сколько там % пользователей www
                                                                                                0
                                                                                                Знак бесконечности очень красивый.
                                                                                                  0
                                                                                                  можно было сделать просто ссылкой, а где пакман, яйцо…
                                                                                                    0
                                                                                                    невероятно!!! сума сойти!) спасибо!
                                                                                                      0
                                                                                                      Кстати, недавно был конкурс — GDD OpenCall (HTML5), и там главное условие было использовать dymaxion map. В голове возникла идея сделать на чисто CSS3, но очень сложно было найти способ использовать именно треугольники, но на них закинуть картинку.

                                                                                                      В результате пришлось использовать немножко канвас, но вышло вот такое:

                                                                                                      olostan.name/projects/doodle/ani/
                                                                                                      А это используя ту же идею небольшая игрушка:
                                                                                                      olostan.name/projects/doodle/game/
                                                                                                      смысл правил на одной картинке можно поместить:
                                                                                                      image

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

                                                                                                      ПС. Не было времени подпилить, так что только Google Chrome, и иногда может подглючивать на небольших резолюшенах (черные треугольники).

                                                                                                      В общем, результатов пока конкурса нет, и это значит что пока еще не сильно раскритиковали :)

                                                                                                      ППС. Интересно кому-то как делалось? Если да, могу отдельным топиком описать
                                                                                                        0
                                                                                                        Интересно.
                                                                                                        0
                                                                                                        Поражает не столько красота решений, сколько их неприменимость в жизни!
                                                                                                          0
                                                                                                          Интересно, а как можно вставить картинку в параллелограмм сделанный с помощью css3 таким образом, чтобы сама картинка не трансформировалась?
                                                                                                          Лично я нашел только способ с компенсацией skew для картинки. Но тогда нужно задавать высоту равную половине высоты картинки.
                                                                                                            0
                                                                                                            Здорово, а как сделать, чтобы текст не трансформировался вместе с параллелограммом?
                                                                                                              0
                                                                                                              skew с противоположным значением поможет.
                                                                                                              0

                                                                                                              А есть на хабре еще более просматриваемая статья чем эта?

                                                                                                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                                                              Самое читаемое