CSS треугольник настраиваемый цвет границы
Попытка использовать пользовательский шестнадцатеричный цвет для моего треугольника 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/
5 ответов
Вы фактически должны подделать это с двумя треугольниками....
.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;
}
Я знаю, что вы принимаете это, но проверьте это также с меньшим количеством 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);
}
Я думаю, что это проще, используя 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>
Другой способ сделать это, особенно для тех, кому это нужно для работы с равносторонними или даже разносторонними треугольниками, как я, - это использовать filter: drop-shadow(...)
с несколькими значениями и без радиуса размытия. Это дает дополнительное преимущество: не требуется нескольких элементов или доступа к обоим элементам: before и: after (я пытался сделать это с помощью: after содержимого, которое было встроенным, поэтому я также хотел избежать абсолютного позиционирования).
Для вышеприведенного случая CSS:: after может выглядеть так ( fiddle):
.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>
значение во второй раскрываемой тени () больше похоже на 1px, чем на 1px, хотя я предполагаю, что это связано с тригонометрией (хотя, по крайней мере, на моем мониторе я не вижу разницы между фактическими значениями на основе триггера или.5px или даже. 1px в этом отношении). - Границы больше 1px (ну, их внешний вид таким образом), кажется, не работают хорошо. Или, по крайней мере, я не нашел решения, хотя см. Ниже неоптимальный способ пойти немного дальше. (Я думаю, что задокументированный, но неподдерживаемый 4-й параметр (
<spread-radius>
) drop-shadow () может быть тем, что я на самом деле ищу, вместо нескольких значений фильтра, но добавление его просто сломало вещи.) Здесь вы можете увидеть, что начинает происходить при выходе за пределы 1px ( fiddle):
.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).
Но я думаю, что вы можете воспользоваться этими тенями, если вам нужно что-то более широкое, чем 1px, изменив их на что-то вроде следующего ( fiddle):
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. Но это будет работать только для одного цвета со всех сторон, и это приводит к в некоторых закругленных углах, а также довольно грубых краях, чем больше вы идете.
.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;
}