Cor da borda personalizada do triângulo CSS


114

Tentativa de usar uma cor hexadecimal personalizada para meu triângulo css (borda). No entanto, uma vez que ele usa propriedades de borda, não tenho certeza de como fazer isso. Eu gostaria de evitar javascript e css3 simplesmente por causa da compatibilidade. Estou tentando fazer com que o triângulo tenha um fundo branco com uma borda de 1px (ao redor dos lados angulares do triângulo) com a cor # CAD5E0. Isso é possível? Aqui está o que tenho até agora:

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

Meu violino: http://jsfiddle.net/4ZeCz/

Respostas:


185

Você realmente tem que fingir com dois triângulos ....

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

Fiddle atualizado aqui

insira a descrição da imagem aqui


1
Perfeito! exatamente o que eu precisava. Obrigado.
Ed R

1
Ei, eu não entendo como eu modificaria o triângulo para aparecer do outro lado da caixa (eu não entendo como o CSS do triângulo funciona)
Kevin

1
SMRT - Você é tão inteligente!
Codigo Whisperer

5
Observe, para aqueles com a mesma pergunta que @Kevin. Observe o border-coloratributo, dependendo da borda colorida, o triângulo apontará para uma direção diferente. Para virar a seta para apontar para a esquerda, mude border-colorpara transparent #e3f5ff transparent transparent;em ambos, .container:aftere.container:before
rmagnum2002

1
@Scott Obrigado por isso! Seu JS Fiddle estava certo! No entanto, tenha cuidado com o copypasta do JSFiddle, ele adicionou dois caracteres invisíveis e inválidos ao meu arquivo CSS que causou erros de validação / análise naquele arquivo css. Depois de remover os caracteres invisíveis (os caracteres tinham largura zero, então o cursor não os mostrava, mas consegui retroceder) funcionou maravilhosamente bem. Não era o seu código que era o problema, acho que JS Fiddle introduziu alguns caracteres misteriosos no código exibido. Não sei, mas só queria mencionar isso para o bem da posteridade, caso alguém tenha o mesmo problema.
hypervisor666

91

Eu sei que você aceita isso, mas verifique este também com menos 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/


Ei, eu não entendo como eu modificaria o triângulo para aparecer do outro lado da caixa (eu não entendo como o CSS do triângulo funciona)
Kevin

2
@Kevin eu crio isso, verifique jsfiddle.net/4ZeCz/97 . Tente brincar com as propriedades que eu uso e se você tiver alguma dúvida, pode me perguntar :)
sandeep

3
Uma explicação: isso cria um elemento quadrado normal com bordas em dois lados adjacentes, formando um triângulo inclinado. Em seguida, o quadrado é inclinado 45 graus, de modo que o triângulo aponte para cima (ou para onde você quiser). A propósito, você só precisa do -webkit-prefixo agora (e -ms-para o IE9). Todos os outros navegadores oferecem suporte sem prefixo.
rvighne

Solução muito inteligente! Obrigado.
Solhan

3

Acho que é mais simples usando o caminho de clipe :

.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

Outra maneira de fazer isso, especialmente para alguém que precisa disso para trabalhar com triângulos equiláteros ou mesmo escalenos como eu fiz, é usar filter: drop-shadow(...)valores múltiplos e nenhum raio de desfoque. Isso tem o benefício adicional de não precisar de vários elementos ou de acesso a ambos : antes e: depois (eu estava tentando fazer isso com: depois do conteúdo que estava embutido, então queria evitar o posicionamento absoluto também).

Para o caso acima, o CSS de: after pode ser parecido com ( violino ):

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

Acho que existem algumas limitações ou estranhezas:

  • Sem suporte no IE11 (embora pareça bom no FF, Chrome e Edge)
  • Não tenho certeza de por que 0,5 px para o <offset-y>valor na segunda sombra projetada () acima parece mais com 1 px do que 1 px, embora eu imagine que esteja relacionado à trigonometria (embora pelo menos no meu monitor não veja diferença entre valores reais baseados em trigonometria ou .5 px ou mesmo .1 px para esse assunto).
  • Fronteiras com mais de 1 px (bem, sua aparência é assim) não parecem funcionar bem. Ou pelo menos não encontrei a solução, embora veja abaixo uma maneira menos do que ideal de aumentar um pouco mais. (Eu acho que o 4º parâmetro documentado, mas não suportado ( <spread-radius>) da sombra projetada () pode ser o que estou realmente procurando, em vez de vários valores de filtro, mas adicioná-lo apenas quebrou tudo.) Aqui você pode ver o que começa a acontecer ao ultrapassar 1px ( violino ):

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

Observe a curiosidade que o primeiro (verde) é aplicado uma vez, mas o segundo (vermelho) está sendo aplicado tanto ao triângulo amarelo criado através da borda quanto à sombra verde (), e o último (azul) é aplicado a todos os itens acima. (Talvez isso também esteja relacionado à aparência de 0,5 px).

Mas eu acho que você pode tirar vantagem dessas sombras projetadas umas sobre as outras se precisar de algo mais amplo do que 1px, alterando-as para algo como o seguinte ( violino ):

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);

onde o primeiro tem um raio de desfoque definido (2,5px neste caso, embora o resultado pareça multiplicado), e todo o resto tem desfoque em 0. Mas isso só funcionará para a mesma cor em todos os lados, e resulta em alguns cantos arredondados, bem como em bordas bastante ásperas, quanto maior você for.


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;
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.