Existem muitas formas CSS diferentes em CSS Tricks - Shapes of CSS e estou particularmente intrigado com um triângulo:
#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>
Como e por que isso funciona?
css
geometry
polygon
css-shapes
Stanislav Shabalin
fonte
fonte
Respostas:
Triângulos CSS: uma tragédia em cinco atos
Como alex disse , bordas de largura igual se encaixam em ângulos de 45 graus:
Quando você não tem borda superior, fica assim:
Então você dá uma largura de 0 ...
... e uma altura de 0 ...
... e, finalmente, você torna as duas bordas laterais transparentes:
Isso resulta em um triângulo.
fonte
:before
ou:after
pseudo-classes.left-border
eright-border
não isósceles pode ser feito. E quando muitos triângulos são combinados ... jsfiddle.net/zRNgzAs bordas usam uma borda angular onde se cruzam (ângulo de 45 ° com bordas de largura igual, mas alterar as larguras da borda pode inclinar o ângulo).
Dê uma olhada no jsFiddle .
Ao ocultar certas bordas, você pode obter o efeito triângulo (como você pode ver acima, tornando as diferentes partes diferentes de cores).
transparent
é frequentemente usado como uma cor da borda para obter a forma do triângulo.fonte
Comece com um quadrado básico e bordas. Cada borda terá uma cor diferente para que possamos diferenciá-las:
o que lhe dá o seguinte :
Mas não há necessidade da borda superior, então defina sua largura para
0px
. Agora, nossa borda inferior200px
fará nosso triângulo com 200px de altura.e nós vamos conseguir isso :
Para ocultar os dois triângulos laterais, defina a cor da borda como transparente. Como a borda superior foi efetivamente excluída, também podemos definir a cor da borda superior como transparente.
finalmente entendemos isso :
fonte
There's another way to draw ..
, que acaba sendo da mesma maneira :) Porém, uma boa explicação #Abordagem diferente:
Triângulos CSS3 com transformação rotativa
A forma triangular é muito fácil de fazer usando essa técnica. Para as pessoas que preferem ver uma animação explicando como essa técnica funciona aqui, é:
Caso contrário, aqui está uma explicação detalhada em 4 atos (isto não é uma tragédia) de como fazer um triângulo isósceles em ângulo reto com um elemento.
<div class="tr"></div>
PASSO 1 : Faça uma div
Fácil, apenas certifique-se disso
width = 1.41 x height
. Você pode usar qualquer técnica ( veja aqui ), incluindo o uso de porcentagens e o fundo de preenchimento para manter a proporção e fazer uma triângulo responsivo . Na imagem a seguir, a div tem uma borda amarela dourada.Nessa div, insira um pseudo elemento e forneça 100% de largura e altura do pai. O pseudo elemento tem um fundo azul na imagem a seguir.
Neste ponto, temos este CSS :
PASSO 2 : Vamos rodar
Primeiro, o mais importante: defina uma origem de transformação . A origem padrão está no centro do pseudo-elemento e precisamos dela no canto inferior esquerdo. Adicionando este CSS ao pseudo elemento:
transform-origin:0 100%;
outransform-origin: left bottom;
Agora podemos girar o pseudo elemento 45 graus no sentido horário com
transform : rotate(45deg);
Neste ponto, temos este CSS :
PASSO 3: oculte
Para ocultar as partes indesejadas do pseudo-elemento (tudo que excede a div com a borda amarela), basta definir
overflow:hidden;
no contêiner. depois de remover a borda amarela, você obtém ... um TRIÂNGULO ! :DEMO
CSS:
PASSO 4: vá além ...
Como mostrado na demonstração , você pode personalizar os triângulos:
skewX()
.Por que usar essa técnica?
Por que não usar essa técnica?
fonte
skewX
seria útil mencionar como as diferentes larguras para uso foram usadas .Aqui está uma animação no JSFiddle que criei para demonstração.
Veja também o snippet abaixo.
Este é um GIF animado criado a partir de um Screencast
Mostrar snippet de código
Versão aleatória
Mostrar snippet de código
Versão de uma só vez
Mostrar snippet de código
fonte
Vamos dizer que temos a seguinte div:
Agora edite o CSS passo a passo, para ter uma ideia clara do que está acontecendo ao redor
PASSO 1: Link do JSfiddle:
Esta é uma div simples. Com um CSS muito simples. Para que um leigo possa entender. Div tem dimensões 150 x 150 pixels com a borda 50 pixels. A imagem está anexada:
PASSO 2: Link do JSfiddle:
Agora mudei a cor da borda dos quatro lados. A imagem está anexada.
PASSO: 3 Link do JSfiddle:
Agora mudei a altura e a largura da div de 150 pixels para zero. A imagem está anexada
PASSO 4: JSfiddle:
Agora, tornei todas as bordas transparentes, além da borda inferior. A imagem está anexada abaixo.
PASSO 5: Link do JSfiddle:
Agora mudei a cor de fundo para branco. A imagem está anexada.
Por isso, conseguimos o triângulo que precisávamos.
fonte
E agora algo completamente diferente ...
Em vez de usar truques de css, não se esqueça de soluções simples como entidades html:
Resultado:
▲
Consulte: Quais são as entidades HTML para triângulos para cima e para baixo?
fonte
Considere o triângulo abaixo
Isto é o que nos é dado:
Por que saiu dessa forma? O diagrama abaixo explica as dimensões, observe que 15 px foram usados na borda inferior e 10 px na esquerda e direita.
É muito fácil criar um triângulo de ângulo reto também removendo a borda direita.
fonte
Dando um passo adiante, usando o css com base nisso, adicionei setas nos botões voltar e próximo (sim, eu sei que não é 100% cross-browser, mas é liso).
fonte
OK, esse triângulo será criado devido à maneira como as bordas dos elementos funcionam juntas em HTML e CSS ...
Como geralmente usamos bordas de 1 ou 2px, nunca notamos que as bordas fazem um ângulo de 45 ° entre si com a mesma largura e, se a largura mudar, o grau do ângulo também será alterado, execute o código CSS que criei abaixo:
No próximo passo, não temos largura ou altura, algo como isto:
E agora tornamos as bordas esquerda e direita invisíveis para tornar nosso triângulo desejável como abaixo:
Se você não deseja executar o snippet para ver as etapas, criei uma sequência de imagens para ver todas as etapas em uma imagem:
fonte
Abordagem diferente. Com gradiente linear (para o IE, apenas IE 10+). Você pode usar qualquer ângulo:
Aqui está o jsfiddle
fonte
CSS
clip-path
Isso é algo que eu sinto que essa pergunta perdeu;
clip-path
clip-path
usará o próprio elemento em vez de suas bordas para cortar a forma especificada em seus parâmetros. Ele usa um sistema de coordenadas baseado em porcentagem super simples, que facilita a edição e significa que você pode pegá-lo e criar formas estranhas e maravilhosas em questão de minutos.Exemplo de forma de triângulo
Desvantagem
No momento, ele tem uma grande desvantagem, sendo uma grande falta de suporte, sendo realmente coberto por
-webkit-
navegadores e não tendo suporte no IE e apenas muito parcial no FireFox.Recursos
Aqui estão alguns recursos e materiais úteis para ajudar a entender melhor
clip-path
e também começar a criar os seus próprios.clip-path
geradorclip-path
Documentação MDNclip-path
Suporte do navegadorfonte
Essa é uma pergunta antiga, mas acho que vale a pena compartilhar como criar uma flecha usando essa técnica de triângulo.
Passo 1:
Vamos criar 2 triângulos, para o segundo usaremos a
:after
pseudo classe e a posicionaremos logo abaixo da outra:Passo 2
Agora, basta definir a cor predominante da borda do segundo triângulo para a mesma cor do plano de fundo:
Mostrar snippet de código
Mexa com todas as setas:
http://jsfiddle.net/tomsarduy/r0zksgeu/
fonte
Mixagem de triângulo SASS (SCSS)
Eu escrevi isso para tornar mais fácil (e SECO) gerar automaticamente um triângulo CSS:
exemplo de caso de uso:
Página de recreio
Nota importante:
se o triângulo parecer pixelizado em alguns navegadores, tente um dos métodos descritos aqui .
fonte
Se você deseja aplicar uma borda ao triângulo, leia isto: Crie um triângulo com CSS?
Quase todas as respostas se concentram no triângulo construído usando borda, por isso vou elaborar o
linear-gradient
método (como iniciado na resposta de @lima_fil ).Usar um valor de grau como
45°
nos forçará a respeitar uma proporção específica deheight/width
, a fim de obter o triângulo que queremos e isso não será responsivo:Mostrar snippet de código
Em vez de fazer isso, devemos considerar valores predefinidos de direção como
to bottom
,to top
etc. Nesse caso, podemos obter qualquer tipo de forma de triângulo, mantendo-a responsiva.1) triângulo retângulo
Para obter tal triângulo precisamos de um gradiente linear e uma direcção diagonal como
to bottom right
,to top left
,to bottom left
, etc.Mostrar snippet de código
2) triângulo isósceles
Para este, precisaremos de 2 gradientes lineares, como acima, e cada um terá metade da largura (ou altura). É como se criamos uma imagem espelhada do primeiro triângulo.
Mostrar snippet de código
3) triângulo equilátero
Este é um pouco complicado de manusear, pois precisamos manter uma relação entre a altura e a largura do gradiente. Teremos o mesmo triângulo acima, mas tornaremos o cálculo mais complexo para transformar o triângulo isósceles em um equilátero.
Para facilitar, consideraremos que a largura da nossa div é conhecida e a altura é grande o suficiente para desenhar o triângulo dentro (
height >= width
).Temos nossos dois gradientes
g1
eg2
, a linha azul é a largura dodiv
w
e cada gradiente terá 50% dele (w/2
) e cada lado do triângulo deve ser igual aw
. A linha verde é a altura dos dois gradienteshg
e podemos obter facilmente a fórmula abaixo:(w/2)² + hg² = w²
--->hg = (sqrt(3)/2) * w
--->hg = 0.866 * w
Podemos confiar
calc()
para fazer nosso cálculo e obter o resultado necessário:Mostrar snippet de código
Outra maneira é controlar a altura da div e manter a sintaxe do gradiente fácil:
Mostrar snippet de código
4) Triângulo aleatório
Para obter um triângulo aleatório, é fácil, simplesmente precisamos remover a condição de 50% de cada um, MAS devemos manter duas condições (ambas devem ter a mesma altura e a soma de ambas as larguras deve ser 100%).
Mostrar snippet de código
Mas e se quisermos definir um valor para cada lado? Simplesmente precisamos fazer o cálculo novamente!
Vamos definir
hg1
ehg2
como a altura do nosso gradiente (ambos são iguais à linha vermelha) entãowg1
ewg2
como a largura do nosso gradiente (wg1 + wg2 = a
). Não vou detalhar o cálculo, mas no final teremos:Agora atingimos o limite de CSS, pois, mesmo
calc()
assim, não poderemos implementar isso; precisamos reunir o resultado final manualmente e usá-los como tamanho fixo:Mostrar snippet de código
Bônus
Não devemos esquecer que também podemos aplicar rotação e / ou inclinação e temos mais opções para obter mais triângulo:
Mostrar snippet de código
E, é claro, devemos ter em mente a solução SVG que pode ser mais adequada em algumas situações:
Mostrar snippet de código
fonte
aqui está outro violino:
https://jsfiddle.net/qdhvdb17/
fonte
Outros já explicaram isso bem. Deixe-me dar uma animação que explicará isso rapidamente: http://codepen.io/chriscoyier/pen/lotjh
Aqui está um código para você brincar e aprender os conceitos.
HTML:
CSS:
Brinque com isso e veja o que acontece. Defina altura e largura como zero. Em seguida, remova a borda superior e torne a esquerda e a direita transparentes ou apenas olhe o código abaixo para criar um triângulo css:
fonte
Se você quiser brincar com
border-size
,width
eheight
para ver como os pode criar formas diferentes, tente o seguinte:fonte
Tente isto: -
fonte
Sei que é antigo, mas gostaria de acrescentar a esta discussão que existem pelo menos 5 métodos diferentes para criar um triângulo usando apenas HTML e CSS.
borders
linear-gradient
conic-gradient
transform
eoverflow
clip-path
Eu acho que todos foram abordados aqui, exceto o método 3, usando o
conic-gradient
, então vou compartilhá-lo aqui:fonte