Как работают CSS-треугольники?

1847

В CSS Tricks есть множество различных форм CSS - Формы CSS, и я особенно озадачен треугольником:

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

#triangle-up {
  width: 0;
  height: 0;
  border-left: 50px solid transparent;
  border-right: 50px solid transparent;
  border-bottom: 100px solid red;
}
<div id="triangle-up"></div>

Как и почему это работает?

Станислав Шабалин
источник
59
Вы можете: jsfiddle.net/wbZet
mskfisher
55
Как насчет площади, которой там нет? jsfiddle.net/minitech/sZgaa
Ry-
1
@mskfisher Размер нижней границы вашего равностороннего треугольника не должен быть ceil (sqrt (3) * 60)? Еще несколько пикселей!
Niloct
1
@Niloct: я быстро посмотрел на круглые числа. Вы правы, более точные равносторонние измерения были бы (сторона: 58, низ: 100) или (сторона: 60, низ: 104).
mskfisher
1
Вот отличный генератор треугольников CSS для всех направлений и размеров: apps.eky.hk/css-triangle-generator
Аллан Степпс

Ответы:

2240

CSS Triangles: трагедия в пяти действиях

Как сказал Алекс , границы одинаковой ширины прилегают друг к другу под углом 45 градусов:

границы встречаются под углом 45 градусов, содержимое посередине

Когда у вас нет верхней границы, это выглядит так:

нет верхней границы

Тогда вы даете ему ширину 0 ...

нет ширины

... и высота 0 ...

высоты тоже нет

... и, наконец, вы сделаете две боковые границы прозрачными:

прозрачные боковые границы

Это приводит к треугольнику.

sdleihssirhc
источник
10
@Jauzsika, вы можете добавить эти треугольники на страницу без добавления дополнительных элементов, просто используя :beforeили :afterпсевдо-классы.
zzzzBov
stackoverflow.com/questions/5623072/… Я думаю, что имеет в виду мистер BoltClock.
Тридцать
99
Действуйте с анимацией: jsfiddle.net/pimvdb/mA4Cu/104 . Просто для тех из нас, кому нужно еще больше визуальных доказательств, как я ...
pimvdb
С разным left-borderи right-borderравнобедренным треугольником можно сделать. И когда много треугольников объединены ... jsfiddle.net/zRNgz
JiminP
2
В 2018 году, есть ли лучший способ сделать треугольник с помощью CSS, а не использовать этот хак?
Scribblemacher
519

Границы используют угловой край, где они пересекаются (угол 45 ° с границами равной ширины, но изменение ширины границ может искажать угол).

Пример границы

div {
  width: 60px;
  border-width: 30px;
  border-color: red blue green yellow;
  border-style: solid;
}
<div></div>

Посмотрите на jsFiddle .

Скрывая определенные границы, вы можете получить эффект треугольника (как вы можете видеть выше, делая разные части разными цветами). transparentчасто используется в качестве цвета края для достижения треугольной формы.

Алекс
источник
487

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

.triangle {
    border-color: yellow blue red green;
    border-style: solid;
    border-width: 200px 200px 200px 200px;
    height: 0px;
    width: 0px;
}

что дает вам это :

квадрат с четырьмя границами

Но верхняя граница не нужна, поэтому установите ее ширину 0px. Теперь наша граница снизу 200pxсделает наш треугольник высотой 200 пикселей.

.triangle {
    border-color: yellow blue red green;
    border-style: solid;
    border-width: 0px 200px 200px 200px;
    height: 0px;
    width: 0px;
}

и мы получим это :

нижняя половина квадрата с четырьмя границами

Затем, чтобы скрыть два боковых треугольника, установите цвет границы на прозрачный. Так как верхняя граница была эффективно удалена, мы также можем установить прозрачный цвет верхней границы.

.triangle {
    border-color: transparent transparent red transparent;
    border-style: solid;
    border-width: 0px 200px 200px 200px;
    height: 0px;
    width: 0px;
}

наконец мы получаем это :

треугольная нижняя граница

Моуна Шейхна
источник
21
Круто, но это не тот же путь? :-)
Станислав Шабалин
5
There's another way to draw .., который оказывается таким же образом :) Хорошее объяснение, хотя
Хаммад Хан
16
-1 для использования JPEG с массивными артефактами. Но +1 за создание отличного примера того, когда не следует использовать JPEG-файлы, на которые я могу ссылаться в будущем для сдерживания. ;)
Хенрик Хаймбюргер,
3
почему здесь не используется GIF?
Пруссван
4
Извините, @hheimbuerger, я испортил ваш пример, исправив изображения. В будущем вам нужно будет сослаться на редакцию 2 этого ответа .
Рори О'Кейн
263

Другой подход:

CSS3 треугольники с преобразованием поворота

Треугольную форму довольно легко сделать с помощью этой техники. Для людей, которые предпочитают видеть анимацию, объясняющую, как работает эта техника, вот она:

GIF анимация: как сделать треугольник с преобразованием поворота

В противном случае, здесь подробно объясняется в 4 актах (это не трагедия), как сделать равнобедренный прямоугольный треугольник с одним элементом.

  • Примечание 1: для не равнобедренных треугольников и необычных вещей вы можете увидеть шаг 4 .
  • Примечание 2: в следующих фрагментах префиксы поставщиков не включены. они включены в демоверсии Codepen .
  • Примечание 3: HTML для следующего объяснения всегда: <div class="tr"></div>

ШАГ 1: Сделать Div

Просто, просто убедитесь width = 1.41 x height. Вы можете использовать любую технику ( см. Здесь ), включая использование процентов и отступа для поддержания соотношения сторон и создания адаптивного треугольника . На следующем изображении div имеет золотисто-желтую рамку.

В этот div вставьте псевдоэлемент и задайте ему 100% ширину и высоту родительского элемента. Псевдоэлемент имеет синий фон на следующем изображении.

Создание CSS-треугольника с преобразованием roate, шаг 1

На данный момент у нас есть этот CSS :

.tr {
    width: 30%;
    padding-bottom: 21.27%; /* = width / 1.41 */
    position: relative;
}

.tr: before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: #0079C6;
}

ШАГ 2 : Давайте вращаться

Во-первых, самое важное: определить источник преобразования . Источник по умолчанию находится в центре псевдоэлемента, и он нам нужен внизу слева. Добавив этот CSS к псевдоэлементу:

transform-origin:0 100%; или transform-origin: left bottom;

Теперь мы можем повернуть псевдоэлемент на 45 градусов по часовой стрелке с помощью transform : rotate(45deg);

Создание треугольника с помощью CSS3, шаг 2

На данный момент у нас есть этот CSS :

.tr {
    width: 30%;
    padding-bottom: 21.27%; /* = width / 1.41 */
    position: relative;
}

.tr:before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: #0079C6;
    transform-origin: 0 100%;        
    transform: rotate(45deg);
}

ШАГ 3: скрыть это

Чтобы скрыть ненужные части псевдоэлемента (все, что переполняет div с желтой рамкой), вам просто нужно установить overflow:hidden;контейнер. убрав желтую рамку, вы получите ... ТРЕУГОЛЬНИК ! :

DEMO

CSS треугольник

CSS:

.tr {
    width: 30%;
    padding-bottom: 21.27%; /* = width / 1.41 */
    position: relative;
    overflow: hidden;
}

.tr:before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: #0079C6;
    transform-origin: 0 100%;
    transform: rotate(45deg);
}

ШАГ 4: идти дальше ...

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

  1. Сделайте их тоньше или лестнее, играя с skewX().
  2. Сделайте так, чтобы они указывали влево, вправо или любое другое направление, играя с направлением преобразования и направлением вращения.
  3. Сделайте некоторые отражения со свойством 3D-преобразования.
  4. Дайте границы треугольника
  5. Поместите изображение внутри треугольника
  6. Гораздо больше ... Раскройте возможности CSS3 !

Зачем использовать эту технику?

  1. Треугольник легко может быть отзывчивым.
  2. Вы можете сделать треугольник с рамкой .
  3. Вы можете поддерживать границы треугольника. Это означает, что вы можете вызвать состояние наведения или щелчок, только когда курсор находится внутри треугольника . Это может стать очень удобным в некоторых ситуациях, подобных этой когда каждый треугольник не может перекрывать своих соседей, поэтому у каждого треугольника есть свое собственное состояние наведения.
  4. Вы можете сделать некоторые необычные эффекты, такие как отражения .
  5. Это поможет вам понять свойства двухмерного и трехмерного преобразования.

Почему бы не использовать эту технику?

  1. Основным недостатком является совместимость браузера , свойства 2d-преобразования поддерживаются IE9 +, и поэтому вы не можете использовать эту технику, если планируете поддерживать IE8. Смотрите CanIuse для получения дополнительной информации. Для некоторых необычных эффектов с использованием 3d-преобразований, таких как браузер отражения, поддерживается IE10 + (см. CanIuse для получения дополнительной информации).
  2. Вам не нужно ничего адаптивного, и для вас подойдет простой треугольник, тогда вам следует воспользоваться техникой границы, описанной здесь: лучшая совместимость с браузером и более легкая для понимания благодаря удивительным публикациям здесь.
веб-Тики
источник
16
Вероятно, стоит упомянуть, что 1.41 - это приближение √2 и длины гипотенузы создаваемого вами треугольника, поэтому вам нужна (как минимум) эта ширина.
KRyan
Я хотел, чтобы ответ был простым, но вы правы, стоит упомянуть @KRyan
web-tiki
На самом деле, при попытке использовать это, skewXбыло бы полезно упомянуть, как были получены различные ширины для использования с .
KRyan
1
Этот метод работает лучше, когда вам нужна сплошная граница 1px для треугольника.
Роман Лосев
Это для случая, когда вы хотите создать границы для треугольника, я застрял на пути границ, когда я хочу создать это поле аннотации AnnotationBox
vanduc1102
183

Вот анимация в JSFiddle, которую я создал для демонстрации.

Также см. Фрагмент ниже.

Это анимированный GIF из скринкаста

Анимированный Gif of Triangle


Случайная версия


Все сразу версия

yunzen
источник
49

Допустим, у нас есть следующий div:

<div id="triangle" />

Теперь измените CSS шаг за шагом, чтобы вы получили четкое представление о том, что происходит вокруг

ШАГ 1: JSfiddle Link:

 #triangle {
        background: purple;
        width :150px;
        height:150PX;
        border-left: 50px solid black ;
        border-right: 50px solid black;
        border-bottom: 50px solid black;
        border-top: 50px solid black;
    }

Это простой div. С очень простым CSS. Так что непрофессионал может понять. Div имеет размеры 150 х 150 пикселей с границей 50 пикселей. Изображение прилагается:

введите описание изображения здесь

ШАГ 2: JSfiddle Link:

#triangle {
    background: purple;
    width :150px;
    height:150PX;
    border-left: 50px solid yellow ;
    border-right: 50px solid green;
    border-bottom: 50px solid red;
    border-top: 50px solid blue;
}

Теперь я просто изменил цвет границы всех четырех сторон. Изображение прилагается.

введите описание изображения здесь

ШАГ: 3 JSfiddle Ссылка:

#triangle {
    background: purple;
    width :0;
    height:0;
    border-left: 50px solid yellow ;
    border-right: 50px solid green;
    border-bottom: 50px solid red;
    border-top: 50px solid blue;
}

Теперь я просто изменил высоту и ширину div с 150 пикселей на ноль. Изображение прикреплено

введите описание изображения здесь

ШАГ 4: JSfiddle:

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

Теперь я сделал все границы прозрачными, кроме нижней границы. Изображение прикреплено ниже.

введите описание изображения здесь

ШАГ 5: JSfiddle Link:

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

Теперь я просто изменил цвет фона на белый. Изображение прилагается.

введите описание изображения здесь

Следовательно, мы получили треугольник, в котором мы нуждались.

Рай Аммад Хан
источник
3
Почему вы использовали Nether Portal для первого шага?
LuizLoyola
38

А теперь что-то совершенно другое ...

Вместо использования трюков css не забывайте о таких простых решениях, как html-сущности:

&#9650;

Результат:

Смотрите: что такое сущности HTML для треугольников вверх и вниз?

Сообщество
источник
2
Я не думаю, что "избит" является подходящим словом здесь. Решение основывается на показателях шрифта, поэтому точное позиционирование весьма сомнительно, не говоря уже о том, что вы не можете контролировать форму.
user776686
32

Рассмотрим ниже треугольник

.triangle {
    border-bottom:15px solid #000;
    border-left:10px solid transparent;
    border-right:10px solid transparent;
    width:0;
    height:0;
}

Это то, что нам дают:

Маленький треугольник на выходе

Почему так получилось? Приведенная ниже диаграмма поясняет размеры, обратите внимание, что 15px был использован для нижней границы и 10px был использован для левой и правой.

Большой треугольник

Сделать прямоугольный треугольник довольно просто, удалив правую границу.

Прямоугольный треугольник

Даниэль Иммс
источник
29

Сделав еще один шаг вперед, используя css на основе этого, я добавил стрелки к кнопкам «Назад» и «Далее» (да, я знаю, что это не 100% кросс-браузер, но, тем не менее, приятный ход).

.triangle {
  width: 0;
  height: 0;
  border-left: 50px solid transparent;
  border-right: 50px solid transparent;
  border-bottom: 100px solid red;
  margin:20px auto;
}

.triangle-down {
  border-bottom:none;
  border-top: 100px solid red;
}

.triangle-left {
  border-left:none;
  border-right: 100px solid red;
  border-bottom: 50px solid transparent;
  border-top: 50px solid transparent;
}

.triangle-right {
  border-right:none;
  border-left: 100px solid red;
  border-bottom: 50px solid transparent;
  border-top: 50px solid transparent;
}

.triangle-after:after {
  width: 0;
  height: 0;
  border-left: 5px solid transparent;
  border-right: 5px solid transparent;
  border-bottom: 5px solid red;
  margin:0 5px;
  content:"";
  display:inline-block;
}

.triangle-after-right:after {
  border-right:none;
  border-left: 5px solid blue;
  border-bottom: 5px solid transparent;
  border-top: 5px solid transparent;

}

.triangle-before:before {
  width: 0;
  height: 0;
  border-left: 5px solid transparent;
  border-right: 5px solid transparent;
  border-bottom: 5px solid blue;
  margin:0 5px;
  content:"";
  display:inline-block;
}

.triangle-before-left:before {
  border-left:none;
  border-right: 5px solid blue;
  border-bottom: 5px solid transparent;
  border-top: 5px solid transparent;

}
<div class="triangle"></div>
<div class="triangle triangle-down"></div>
<div class="triangle triangle-left"></div>
<div class="triangle triangle-right"></div>

<a class="triangle-before triangle-before-left" href="#">Back</a>
<a class="triangle-after triangle-after-right" href="#">Next</a>

PseudoNinja
источник
1
как это не кросс браузер? треугольники должны работать обратно в IE6.
Крискоули
4
использование: before и: after не поддерживается на 100%.
PseudoNinja
2
Псуэдо-элементы не поддерживаются <IE8.
Алекс
19

Хорошо, этот треугольник будет создан из-за способа, которым границы элементов работают вместе в HTML и CSS ...

Поскольку мы обычно используем границы размером 1 или 2 пикселя, мы никогда не замечаем, что границы образуют углы 45 ° друг к другу с одинаковой шириной, и если ширина изменяется, также изменяется степень угла, запустите код CSS, который я создал ниже:

.triangle {
  width: 100px;
  height: 100px;
  border-left: 50px solid black;
  border-right: 50px solid black;
  border-bottom: 100px solid red;
}
<div class="triangle">
</div>

Затем на следующем шаге у нас нет никакой ширины или высоты, что-то вроде этого:

.triangle {
  width: 0;
  height: 0;
  border-left: 50px solid black;
  border-right: 50px solid black;
  border-bottom: 100px solid red;
}
<div class="triangle">
</div>

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

.triangle {
  width: 0;
  height: 0;
  border-left: 50px solid transparent;
  border-right: 50px solid transparent;
  border-bottom: 100px solid red;
}
<div class="triangle"></div>

Если вы не хотите запускать фрагмент для просмотра шагов, я создал последовательность изображений, чтобы просмотреть все шаги в одном изображении:

введите описание изображения здесь

Алиреза
источник
18

Другой подход. С линейным градиентом (для IE только IE 10+). Вы можете использовать любой угол:

.triangle {
    margin: 50px auto;
    width: 100px;
    height: 100px;
/* linear gradient */
    background: -moz-linear-gradient(-45deg,  rgba(255,0,0,0) 0%, rgba(255,0,0,0) 50%, rgba(255,0,0,1) 50%, rgba(255,0,0,1) 100%);
 /* FF3.6+ */
    background: -webkit-gradient(linear, left top, right bottom, color-stop(0%,rgba(255,0,0,0)), color-stop(50%,rgba(255,0,0,0)), color-stop(50%,rgba(255,0,0,1)), color-stop(100%,rgba(255,0,0,1)));
 /* Chrome,Safari4+ */
    background: -webkit-linear-gradient(-45deg,  rgba(255,0,0,0) 0%,rgba(255,0,0,0) 50%,rgba(255,0,0,1) 50%,rgba(255,0,0,1) 100%);
 /* Chrome10+,Safari5.1+ */
    background: -o-linear-gradient(-45deg,  rgba(255,0,0,0) 0%,rgba(255,0,0,0) 50%,rgba(255,0,0,1) 50%,rgba(255,0,0,1) 100%);
 /* Opera 11.10+ */
    background: -ms-linear-gradient(-45deg,  rgba(255,0,0,0) 0%,rgba(255,0,0,0) 50%,rgba(255,0,0,1) 50%,rgba(255,0,0,1) 100%);
 /* IE10+ */
    background: linear-gradient(135deg,  rgba(255,0,0,0) 0%,rgba(255,0,0,0) 50%,rgba(255,0,0,1) 50%,rgba(255,0,0,1) 100%);
 /* W3C */;
}
<div class="triangle"></div>

Вот jsfiddle

lima_fil
источник
Это красивое решение, но следует отметить, что это только IE 10+.
Эрик Ху,
13

CSS clip-path

Я чувствую, что этот вопрос упущен; clip-path

clip-path в двух словах

Отсечение со clip-pathсвойством сродни вырезанию фигуры (например, круга или пятиугольника) из прямоугольного листа бумаги. Свойство относится к спецификации « CSS Masking Module Level 1 ». В спецификации говорится: «Маскирование CSS предоставляет два способа для частичного или полного скрытия частей визуальных элементов: маскирование и обрезка».


clip-pathбудет использовать сам элемент, а не его границы, чтобы вырезать форму, указанную в его параметрах. Он использует очень простую систему координат, основанную на процентах, что делает его редактирование очень простым и означает, что вы можете подобрать его и создать странные и прекрасные формы за считанные минуты.


Пример формы треугольника

div {
  -webkit-clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
  clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
  background: red;
  width: 100px;
  height: 100px;
}
<div></div>


нижняя сторона

В настоящий момент у него есть существенный недостаток, один из которых заключается в том, что он в значительной степени не поддерживается, он действительно распространяется только на -webkit-браузеры и не имеет поддержки в IE и лишь частично в FireFox.


Ресурсы

Вот некоторые полезные ресурсы и материалы, которые помогут лучше понять, clip-pathа также начать создавать свои собственные.

Stewartside
источник
11

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

Шаг 1:

Давайте создадим 2 треугольника, для второго мы будем использовать :afterпсевдокласс и расположим его чуть ниже другого:

2 треугольника

.arrow{
    width: 0;
    height: 0;
    border-radius: 50px;
    display: inline-block;
    position: relative;
}

    .arrow:after{
        content: "";
        width: 0;
        height: 0;
        position: absolute;
    }


.arrow-up{
     border-left: 50px solid transparent;
     border-right: 50px solid transparent;
     border-bottom: 50px solid #333;
}
    .arrow-up:after{
         top: 5px;
         border-left: 50px solid transparent;
         border-right: 50px solid transparent;
         border-bottom: 50px solid #ccc;
         right: -50px;
    }
<div class="arrow arrow-up"> </div>

Шаг 2

Теперь нам просто нужно установить преобладающий цвет границы второго треугольника на тот же цвет фона:

введите описание изображения здесь

Поиграй со всеми стрелками:
http://jsfiddle.net/tomsarduy/r0zksgeu/

Том Сардуй
источник
9

SASS (SCSS) треугольник миксин

Я написал это, чтобы было проще (и СУХОЙ) автоматически генерировать треугольник CSS:

// Triangle helper mixin (by Yair Even-Or)
// @param {Direction} $direction - either `top`, `right`, `bottom` or `left`
// @param {Color} $color [currentcolor] - Triangle color
// @param {Length} $size [1em] - Triangle size
@mixin triangle($direction, $color: currentcolor, $size: 1em) {
  $size: $size/2;
  $transparent: rgba($color, 0);
  $opposite: (top:bottom, right:left, left:right, bottom:top);

  content: '';
  display: inline-block;
  width: 0;
  height: 0;
  border: $size solid $transparent;
  border-#{map-get($opposite, $direction)}-color: $color;
  margin-#{$direction}: -$size;
}

пример использования:

span {
  @include triangle(bottom, red, 10px);
}

Страница детской площадки


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

VSync
источник
8

Если вы хотите применить границу к треугольнику, прочитайте это: Создать треугольник с помощью CSS?

Почти все ответы сосредоточены на треугольнике, построенном с использованием рамки, поэтому я собираюсь разработать linear-gradientметод (как и началось в ответе @lima_fil ).

Использование значения степени как 45°заставит нас уважать определенное соотношение height/width, чтобы получить желаемый треугольник, и это не будет отзывчивым:

Вместо того, чтобы делать это, мы должны рассмотреть предопределенные значения направления, такие как to bottom, to topи т. Д. В этом случае мы можем получить любую форму треугольника, сохраняя его отзывчивость.

1) Прямоугольный треугольник

Для получения такого треугольника , нам нужно один линейного градиент и-диагональное направление , как to bottom right, to top left, to bottom left, и т.д.

2) равнобедренный треугольник

Для этого нам понадобятся 2 линейных градиента, как указано выше, и каждый из них займет половину ширины (или высоты). Как будто мы создаем зеркальное отражение первого треугольника.

3) равносторонний треугольник

С этим немного сложно справиться, так как нам нужно поддерживать соотношение между высотой и шириной градиента. У нас будет тот же треугольник, что и выше, но мы усложним вычисление, чтобы преобразовать равнобедренный треугольник в равносторонний.

Чтобы упростить это, мы будем считать, что ширина нашего div известна, а высота достаточно велика, чтобы можно было нарисовать наш треугольник внутри ( height >= width).

CSS треугольник с градиентом

У нас есть два градиента, g1а g2синяя линия - это ширина, div wи каждый градиент будет иметь 50% ( w/2), и каждая сторона треугольника должна быть равна w. Зеленая линия - высота обоих градиентов, hgи мы можем легко получить формулу ниже:

(w/2)² + hg² = w²---> hg = (sqrt(3)/2) * w--->hg = 0.866 * w

Мы можем положиться на то calc(), чтобы сделать наш расчет и получить нужный результат:

Другой способ - контролировать высоту div и сохранять синтаксис градиента легким:

4) Случайный треугольник

Чтобы получить случайный треугольник, это легко, так как нам просто нужно удалить условие 50% каждого из них, НО мы должны сохранить два условия (оба должны иметь одинаковую высоту, а сумма ширины должна составлять 100%).

Но что, если мы хотим определить значение для каждой стороны? Нам просто нужно сделать расчет еще раз!

CSS треугольник с градиентом

Давайте определим hg1и hg2как высоту нашего градиента (оба равны красной линии) тогда wg1и wg2как ширину нашего градиента ( wg1 + wg2 = a). Я не буду вдаваться в подробности расчетов, но в конце мы получим:

wg2 = (a²+c²-b²)/(2a)
wg1 = a - wg2
hg1 = hg2 = sqrt(b² - wg1²) = sqrt(c² - wg2²)

Теперь мы достигли предела CSS, так как даже с этим calc()мы не сможем реализовать это, поэтому нам просто нужно собрать конечный результат вручную и использовать его как фиксированный размер:

бонус

Мы не должны забывать, что мы также можем применять вращение и / или наклон, и у нас есть больше возможностей, чтобы получить больше треугольника:

И, конечно, мы должны иметь в виду решение SVG, которое может быть более подходящим в некоторых ситуациях:

Темани Афиф
источник
4

вот еще одна скрипка:

.container:after {
    position: absolute;
    right: 0;
    content: "";
    margin-right:-50px;
    margin-bottom: -8px;
    border-width: 25px;
    border-style: solid;
    border-color: transparent transparent transparent #000;
    width: 0;
    height: 0;
    z-index: 10;
    -webkit-transition: visibility 50ms ease-in-out,opacity 50ms ease-in-out;
    transition: visibility 50ms ease-in-out,opacity 50ms ease-in-out;
    bottom: 21px;
}
.container {
    float: left;
    margin-top: 100px;
    position: relative;
    width: 150px;
    height: 80px;
    background-color: #000;
}

.containerRed {
    float: left;
    margin-top: 100px;
    position: relative;
    width: 100px;
    height: 80px;
    background-color: red;
}

https://jsfiddle.net/qdhvdb17/

Домл Хлеб
источник
4

Другие уже объяснили это хорошо. Позвольте мне дать вам анимацию, которая объяснит это быстро: http://codepen.io/chriscoyier/pen/lotjh

Вот код, с которым вы можете поиграть и изучить концепции.

HTML:

<html>
  <body>
    <div id="border-demo">
    </div>
  </body>
</html>

CSS:

/*border-width is border thickness*/
#border-demo {
    background: gray;
    border-color: yellow blue red green;/*top right bottom left*/
    border-style: solid;
    border-width: 25px 25px 25px 25px;/*top right bottom left*/
    height: 50px;
    width: 50px;
}

Поиграй с этим и посмотри что получится. Установите высоту и ширину на ноль. Затем удалите верхнюю границу и сделайте левый и правый прозрачным, или просто посмотрите на код ниже, чтобы сделать треугольник CSS:

#border-demo {
    border-left: 50px solid transparent;
    border-right: 50px solid transparent;
    border-bottom: 100px solid blue;
}
HelloWorldNoMore
источник
2

Если вы хотите , чтобы играть с border-size, widthи heightувидеть , как те могут создавать различные формы, попробуйте следующее:

const sizes = [32, 32, 32, 32];
const triangle = document.getElementById('triangle');

function update({ target }) {
  let index = null;
  
  if (target) {
    index = parseInt(target.id);

    if (!isNaN(index)) {
      sizes[index] = target.value;
    }
  }
  
  window.requestAnimationFrame(() => {
    triangle.style.borderWidth = sizes.map(size => `${ size }px`).join(' ');
    
    if (isNaN(index)) {
      triangle.style[target.id] = `${ target.value }px`;
    }
  });
}

document.querySelectorAll('input').forEach(input => {
  input.oninput = update;
});

update({});
body {
  margin: 0;
  min-height: 100vh;
  display: flex;
  justify-content: center;
  align-items: center;
  overflow: hidden;
}

#triangle {
    border-style: solid;
    border-color: yellow magenta blue black;
    background: cyan;
    height: 0px;
    width: 0px;
}

#controls {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  background: white;
  display: flex;
  box-shadow: 0 0 32px rgba(0, 0, 0, .125);
}

#controls > div {
  position: relative;
  width: 25%;
  padding: 8px;
  box-sizing: border-box;
  display: flex;
}

input {
  margin: 0;
  width: 100%;
  position: relative;
}
<div id="triangle" style="border-width: 32px 32px 32px 32px;"></div>

<div id="controls">
  <div><input type="range" min="0" max="128" value="32" id="0" /></div>
  <div><input type="range" min="0" max="128" value="32" id="1" /></div>
  <div><input type="range" min="0" max="128" value="32" id="2" /></div>
  <div><input type="range" min="0" max="128" value="32" id="3" /></div>
  <div><input type="range" min="0" max="128" value="0" id="width" /></div>
  <div><input type="range" min="0" max="128" value="0" id="height" /></div>
</div>

Danziger
источник
1

Попробуй это:-

.triangle {
    border-color: transparent transparent red transparent;
    border-style: solid;
    border-width: 0px 200px 200px 200px;
    height: 0px;
    width: 0px;
}
<div class="triangle"></div>

сатиш маллик
источник
0

Я знаю, что это старый, но я хотел бы добавить к этому обсуждению, что есть по крайней мере 5 различных методов для создания треугольника, используя только HTML и CSS.

  1. С помощью borders
  2. С помощью linear-gradient
  3. С помощью conic-gradient
  4. Использование transformиoverflow
  5. С помощью clip-path

Я думаю, что все было рассмотрено здесь, кроме метода 3, с использованием conic-gradient, поэтому я поделюсь этим здесь:

.triangle{
        width: 40px;
        height: 40px;
        background: conic-gradient(at 50% 50%,transparent 135deg,green 0,green 225deg, transparent 0);
    }
<div class="triangle"></div>

Создание CSS-треугольников с использованием конического градиента

coding-dude.com
источник