Пользовательский цвет границы треугольника CSS


114

Попытка использовать собственный шестнадцатеричный цвет для моего треугольника (границы) css. Однако, поскольку он использует свойства границы, я не уверен, как это сделать. Я хотел бы держаться подальше от javascript и css3 просто из-за совместимости. Я пытаюсь сделать треугольник белым фоном с границей 1 пиксель (вокруг угловых сторон треугольника) с цветом # CAD5E0. Это возможно? Вот что у меня есть на данный момент:

.container {
    margin-left: 15px;
    width: 200px;
    background: #FFFFFF;
    border: 1px solid #CAD5E0;
    padding: 4px;
    position: relative;
    min-height: 200px;
}

.container:after {
    content: '';
    display: block;
    position: absolute;
    top: 10px;
    left: 100%;
    width: 0;
    height: 0;
    border-color: transparent transparent transparent #CAD5E0;
    border-style: solid;
    border-width: 10px;
}​

Моя скрипка: http://jsfiddle.net/4ZeCz/

Ответы:


185

На самом деле вам нужно имитировать это с помощью двух треугольников ....

.container {
    margin: 15px 30px;
    width: 200px;
    background: #fff;
    border: 1px solid #a00;
    position: relative;
    min-height: 200px;
    padding: 20px;
    text-align: center;
    color: #fff;
    font: bold 1.5em/180px Helvetica, sans-serif;
    text-shadow: 0 0 1px #000;
}

.container:after,
.container:before {
    content: '';
    display: block;
    position: absolute;
    left: 100%;
    width: 0;
    height: 0;
    border-style: solid;
}

.container:after {
    top: 10px;
    border-color: transparent transparent transparent #fdd;
    border-width: 10px;
}

.container:before {
    top: 9px;
    border-color: transparent transparent transparent #a00;
    border-width: 11px;
}

Обновленный скрипт здесь

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


1
Отлично! именно то, что мне нужно. Спасибо.
Ed R

1
эй, я не понимаю, как мне изменить треугольник, чтобы он отображался на другой стороне поля (я не понимаю, как работает треугольник css)
Кевин

1
SMRT - Ты такой умный!
Code Whisperer

5
Обратите внимание, для тех, у кого такой же вопрос, как у @ Kevin. Посмотрите на border-colorатрибут, в зависимости от цветной границы треугольник будет указывать в другом направлении. Чтобы повернуть стрелку влево, измените border-colorна transparent #e3f5ff transparent transparent;в обоих, .container:afterи.container:before
rmagnum2002

1
@Scott Спасибо за это! Ваш JS Fiddle был на высоте! Однако будьте осторожны с копипастой из JSFiddle, он добавил два невидимых и недопустимых символа в мой файл CSS, что вызвало ошибки проверки / синтаксического анализа в этом файле css. Как только я удалил невидимые символы (символы были нулевой ширины, поэтому курсор не отображал их, но я смог вернуться назад), все заработало замечательно. Проблема была не в вашем коде, я думаю, что JS Fiddle ввел в отображаемый код какие-то загадочные символы? Не знаю, но я просто хотел упомянуть об этом для потомков, на случай, если кто-то столкнется с той же проблемой.
hypervisor666

91

Я знаю, что вы принимаете это, но проверьте это также с меньшим количеством css:

.container {
    margin-left: 15px;
    width: 200px;
    background: #FFFFFF;
    border: 1px solid #CAD5E0;
    padding: 4px;
    position: relative;
    min-height: 200px;
}

.container:after {
    content: '';
    display: block;
    position: absolute;
    top: 10px;
    right:-7px;
    width: 10px;
    height: 10px;
    background: #FFFFFF;
    border-right:1px solid #CAD5E0;
    border-bottom:1px solid #CAD5E0;
    -moz-transform:rotate(-45deg);
    -webkit-transform:rotate(-45deg);
}

http://jsfiddle.net/4ZeCz/3/


эй, я не понимаю, как мне изменить треугольник, чтобы он отображался на другой стороне поля (я не понимаю, как работает треугольник css)
Кевин

2
@Kevin, я создаю это, проверьте jsfiddle.net/4ZeCz/97 . Попробуйте поиграть со свойствами, которые я использую, и если у вас есть какие-либо вопросы, вы можете мне задать :)
sandeep

3
Объяснение: это создает нормальный квадратный элемент с границами на двух смежных сторонах, образуя наклонный треугольник. Затем квадрат наклоняется на 45 градусов, поэтому треугольник указывает вверх (или куда вы хотите). Кстати, -webkit-префикс сейчас нужен только (и -ms-для IE9). Все остальные браузеры поддерживают его без префикса.
rvighne

Очень умное решение! Спасибо.
Solhan

3

Я думаю, что это проще, используя clip-path :

.container {
  width: 150px;
  min-height: 150px;
  background: #ccc;
  padding: 8px;
  padding-right: 6%;
  display: inline-block;
  clip-path: polygon(0% 0%,0% 100%,90% 100%,90% 5%,100% 10%,90% 15%,90% 0%);
}
<div class="container">
test content
</div>


1

Другой способ добиться этого, особенно для тех, кому это нужно для работы с равносторонними или даже равносторонними треугольниками, как это сделал я, - использовать filter: drop-shadow(...)с несколькими значениями и без радиуса размытия. Это дает дополнительное преимущество в виде отсутствия необходимости в нескольких элементах или доступе к обоим. : before и: after (я пытался добиться этого с помощью: after контента, который был встроенным, поэтому также хотел избежать абсолютного позиционирования).

В приведенном выше случае CSS: after может выглядеть так ( скрипка ):

.container {
  margin-left: 15px;
  width: 200px;
  background: #FFFFFF;
  border: 1px solid #CAD5E0;
  padding: 4px;
  position: relative;
  min-height: 200px;
}
.container:after {
  content: '';
  display: block;
  position: absolute;
  top: 10px;
  left: 100%;
  width: 0;
  height: 0;
  border-style: solid;
  border-width: 20px 0 40px 15px; /* skewed to show support for non-right-angle triangles */
  border-color: transparent transparent transparent #fff;
  filter: drop-shadow(1px 0 0 #CAD5E0) drop-shadow(0 .5px 0 #CAD5E0);
}
<div class="container">
  Test Container
</div>

Я думаю есть некоторые ограничения или странности:

  • Нет поддержки в IE11 (хотя выглядит нормально в FF, Chrome и Edge)
  • Я не совсем понимаю, почему .5px для <offset-y> значения во втором drop-shadow () выше больше похоже на 1px, чем на 1px, хотя я предполагаю, что это связано с тригонометрией (хотя, по крайней мере, на моем мониторе я не вижу разницы между фактические значения на основе триггеров или 0,5 пикселей или даже 0,1 пикселей, если на то пошло).
  • Границы больше 1 пикселя (ну, их внешний вид), похоже, не работают. Или, по крайней мере, я не нашел решения, хотя см. Ниже не совсем оптимальный способ сделать немного больше. (Я бы подумал, что документированный, но неподдерживаемый 4-й параметр ( <spread-radius>) drop-shadow () может быть тем, что я действительно ищу, а не несколькими значениями фильтра, но добавление его просто полностью сломало.) Здесь вы можете увидеть, что начинает происходить при выходе за пределы 1px ( скрипка ):

.container {
  background-color: #eee;
  padding: 1em;
}
.container:after {
  content: "";
  width: 0;
  height: 0;
  border-style: solid;
  border-width: 20.4px 10px 0 10px;
  border-color: yellow transparent transparent transparent;
  margin-left: .25em;
  display: inline-block;
  filter: drop-shadow(-6px -4px 0 green) drop-shadow(6px -4px 0 red) drop-shadow(0 6px 0 blue);
}
<div class="container">
  Test Container
</div>

Обратите внимание на забавность того, что первый (зеленый) применяется один раз, а второй (красный) применяется как к желтому треугольнику, созданному через границу, так и к зеленой тени (), и к последнему (синему) применяется ко всему вышеперечисленному. (Возможно, это также связано с внешним видом .5px).

Но я думаю, вы можете воспользоваться преимуществами этих падающих теней, накладывающихся друг на друга, если вам нужно что-то более широкое, чем 1 пиксель, изменив их на что-то вроде следующего ( скрипка ):

filter: drop-shadow(0 0 2.5px red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red);

где у самого первого установлен радиус размытия (2,5 пикселя в данном случае, хотя результат кажется умноженным), а у всех остальных есть размытие на 0. Но это будет работать только для одного и того же цвета со всех сторон, и в результате в некоторых закругленных углах, а также на довольно неровных краях, чем больше вы идете.


0
.triangle{
    position: absolute;
    width:0px;
    height:0px;
    border-left: 45px solid transparent;
    border-right: 45px solid transparent;
    border-bottom: 72px solid #DB5248;
}

.triangle:after{
    position: relative;
    content:"!";
    top:8px;
    left:-8px;
    color:#DB5248;
    font-size:40px;
}

.triangle:before{
    content:".";
    color: #DB5248;
    position: relative;
    top:-14px;
    left:-43px;
    border-left: 41px solid transparent;
    border-right: 41px solid transparent;
    border-bottom: 67px solid white;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.