CSS triangle custom border color
Asked Answered
S

5

126

Attempting to use a custom hex color for my css triangle (border). However since it uses border properties I am unsure how to go about doing this. I would like to steer clear of javascript and css3 simply because of compatibility. I am trying to have the triangle have a white background with a 1px border (around the angled sides of the triangle) with color #CAD5E0. Is this possible? Here's what I have so far:

.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;
}​

My fiddle: http://jsfiddle.net/4ZeCz/

Smorgasbord answered 26/2, 2012 at 5:12 Comment(0)
P
205

You actually have to fake it with two triangles....

.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;
}

Updated Fiddle here

enter image description here

Pressey answered 26/2, 2012 at 5:20 Comment(3)
hey, i dont understand how would I modify the triangle to appear on the other side of the box (I dont understand how the triangle css works)Cord
Note, for the ones with same question as@Kevin. Look at the border-color attribute, depending on the colored border the triangle will point to different direction. To turn the arrow to point left change border-color to transparent #e3f5ff transparent transparent; in both, .container:after and .container:beforeRupp
@Pressey Thanks for this! Your JS Fiddle was spot on! However, be careful about copypasta out of JSFiddle, it added two invisible and invalid characters into my CSS file that caused validation/parse errors in that css file. Once I removed the invisible characters (the chars were zero width, so cursor wasn't showing them, but I was able to backspace) it worked wonderfully. It was not your code that was the problem, I think JS Fiddle introduced some mysterious characters into the displayed code? Dunno, but I just wanted to mention it for posterity sake, in case anyone came across the same issue.Chirm
R
95

I know you accept that but check this one also with less 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/

Ringster answered 26/2, 2012 at 5:38 Comment(3)
hey, i dont understand how would I modify the triangle to appear on the other side of the box (I dont understand how the triangle css works)Cord
@Cord i create this please check jsfiddle.net/4ZeCz/97 . Try to play with the properties i have use & if you have any question you can ask me :)Ringster
An explanation: this creates a normal square element with borders on two adjacent sides, making a tilted triangle. Then the square is tilted 45 degrees, so the triangle points up (or wherever you want it). By the way, you only need the -webkit- prefix now (and -ms- for IE9). All other browsers support it unprefixed.Luanneluanni
N
4

I think this is a simpler one using 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>
Nisan answered 16/5, 2018 at 17:43 Comment(2)
I am trying to have the triangle have a white background with a 1px border. I see no border in your example.Moriah
@Moriah Of course not because of clip-path's behavior itself. However, it is relatively easy -for example- to generate a JavaScript that modifies the property so that the balloons can point in any direction. Also you could define some varieties directly in CSS. Advantages and disadvantages. Smart design takes both things into account. It's your choice, it's my answer.Nisan
G
2

Another way to accomplish this, especially for somebody who needs this to work with equilateral or even scalene triangles like I did, is to use filter: drop-shadow(...) with multiple values and no blur radius. This has the added benefit of not needing multiple elements, or access to both :before and :after (I was trying to accomplish this with :after content that was inline, so wanted to avoid absolute positioning too).

For the above case, the :after's CSS could look like this (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>

I think there are some limitations or weirdness, though:

  • No support in IE11 (though seems fine in FF, Chrome, and Edge)
  • I'm not quite sure why .5px for the <offset-y> value in the second drop-shadow() above appears more like 1px than 1px would have, though I imagine it's related to trigonometry (though at least on my monitor I see no difference between the actual trig-based values or .5px or even .1px for that matter).
  • Borders greater than 1px (well, their appearance that way) don't seem to work well. Or at least I haven't found the solution, though see below for a less-than-optimal way to go a little bigger. (I would think the documented-but-unsupported 4th parameter (<spread-radius>) of drop-shadow() might be what I'm really looking for instead of multiple filter values, but adding it in just broke things entirely.) Here you can see what starts to happen when going beyond 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>

Notice the funniness that the first one (green) gets applied once, but the second one (red) is getting applied both to the yellow triangle created via border as well as the green drop-shadow(), and the last one (blue) gets applied to all of the above. (Perhaps that's also related to the .5px appearance thing).

But I guess you can take advantage of these drop-shadows building on each other if you need something wider-looking than 1px, by changing them to something like the following (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);

where the very first one has a blur-radius set (2.5px in this case, though the result appears multiplied), and all the rest have blur at 0. But this will only work for the same color on all sides, and it results in some rounded-looking corners as well as quite rough edges the bigger you go.

Glove answered 18/7, 2018 at 23:37 Comment(0)
A
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;
}
Aalto answered 3/7, 2018 at 6:27 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.