Пользователь
30,2
рейтинг
12 августа 2011 в 18:01

Разработка → Геометрические фигуры на CSS перевод

CSS*
Отличная подборка, как нарисовать различные геометрические фигуры одним элементом 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);
}
Перевод: CSS-Tricks
Анатолий Ализар @alizar
карма
749,5
рейтинг 30,2
Пользователь
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

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

  • +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
    Супер! Но насколько эти решения кроссбраузерны? Сейчас буду тестить! Спасибо за статью!

    • 0
      Скоро выставки картин будем устраивать нарисованных на HTML и CSS :)))
  • +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 с противоположным значением поможет.

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