Геометрические фигуры на 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
                          На сайтах будущего вообще не будет картинок)))
                          А что? Градиенты можно, фигуры можно, логотип составят и вперёд.
                        • +16
                          Отличный перевод!
                          • –3
                            А мне не понравился
                            • +3
                              только при переводе куда то делся Nicolas Gallagher…
                            • +43
                              аlizar уже не тот…
                              • +10
                                Кто первый нарисует советский знак качества?
                                • +3
                                  Мне это не очень понятно. Во-первых, CSS код для рисования, скажем, сердечка явно превзойдёт по количеству байтов эквивалентный PNG, а во-вторых, создавать содержание при помощи CSS есть грехъ.
                                  • 0
                                    Какое ещё содержание? Это такое же оформление как и любой другой буллет, только в данном случае вы не грузите лишние байты в картинке.
                                    • 0
                                      давайте тогда всю графику заменим на ASCII (или CSS?) art :))
                                      • 0
                                        Но грузите лишние байты в CSS. В чём разница тогда?
                                        • 0
                                          В том, что запрос к серверу один, а это время, которое в сумме может быть заметно пользователю.
                                    • 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 другом делится в равных пропорциях.
                                                                • –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 с не равными сторонами?
                                                                            • +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

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

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