Come funzionano i triangoli CSS?


1847

Ci sono molte forme CSS diverse su CSS Tricks - Shapes of CSS e sono particolarmente perplesso con un triangolo:

Triangolo CSS

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

Come e perché funziona?



55
Che ne dici della piazza che non c'è? jsfiddle.net/minitech/sZgaa
Ry-

1
@mskfisher La dimensione del bordo inferiore nel triangolo equilatero non dovrebbe essere ceil (sqrt (3) * 60)? Qualche pixel in più allora!
Niloct,

1
@Niloct: l'ho guardato rapidamente ai numeri rotondi. Hai ragione, le misurazioni equilateri più accurate sarebbero (lato: 58, in basso: 100) o (lato: 60, in basso: 104).
mskfisher,

1
Ecco un grande generatore di triangoli CSS per ogni direzione e dimensione: apps.eky.hk/css-triangle-generator
Allan Stepps

Risposte:


2240

Triangoli CSS: una tragedia in cinque atti

Come ha detto alex , bordi di uguale larghezza si incastrano l'uno contro l'altro ad angoli di 45 gradi:

i bordi si incontrano ad angoli di 45 gradi, contenuti al centro

Quando non hai il bordo superiore, è simile al seguente:

nessun bordo superiore

Quindi gli dai una larghezza di 0 ...

nessuna larghezza

... e un'altezza di 0 ...

nessuna altezza neanche

... e infine, rendi trasparenti i due bordi laterali:

bordi laterali trasparenti

Ciò si traduce in un triangolo.


10
@Jauzsika, puoi aggiungere questi triangoli in una pagina senza aggiungere ulteriori elementi semplicemente usando :beforeo :afterpseudo-classi.
zzzzBov,

stackoverflow.com/questions/5623072/... è Penso che quello che il signor BoltClock si riferisce.
30

99
Agire con animazioni: jsfiddle.net/pimvdb/mA4Cu/104 . Solo per quelli di noi che hanno bisogno di ancora più prove visive come me ...
pimvdb,

Con triangolo diverso left-bordere right-bordernon isoscele può essere realizzato. E quando molti triangoli vengono combinati ... jsfiddle.net/zRNgz
JiminP

2
Nel 2018, c'è un modo migliore per creare un triangolo con CSS piuttosto che usare questo hack?
Scribblemacher

519

I bordi utilizzano un bordo angolato nel punto in cui si intersecano (angolo di 45 ° con bordi di uguale larghezza, ma la modifica delle larghezze del bordo può inclinare l'angolo).

Esempio di bordo

div {
  width: 60px;
  border-width: 30px;
  border-color: red blue green yellow;
  border-style: solid;
}
<div></div>

Dai un'occhiata al jsFiddle .

Nascondendo alcuni bordi, puoi ottenere l'effetto triangolo (come puoi vedere sopra rendendo le diverse porzioni di colori diversi). transparentviene spesso utilizzato come colore del bordo per ottenere la forma del triangolo.


487

Inizia con un quadrato e bordi di base. A ciascun bordo verrà assegnato un colore diverso in modo che possiamo distinguerli:

.triangle {
    border-color: yellow blue red green;
    border-style: solid;
    border-width: 200px 200px 200px 200px;
    height: 0px;
    width: 0px;
}

che ti dà questo :

piazza con quattro bordi

Ma non è necessario il bordo superiore, quindi imposta la sua larghezza su 0px. Ora il nostro bordo inferiore 200pxrenderà il nostro triangolo alto 200 px.

.triangle {
    border-color: yellow blue red green;
    border-style: solid;
    border-width: 0px 200px 200px 200px;
    height: 0px;
    width: 0px;
}

e otterremo questo :

metà inferiore del quadrato con quattro bordi

Quindi, per nascondere i due triangoli laterali, imposta il colore del bordo su trasparente. Poiché il bordo superiore è stato effettivamente eliminato, possiamo anche impostare il colore del bordo superiore su trasparente.

.triangle {
    border-color: transparent transparent red transparent;
    border-style: solid;
    border-width: 0px 200px 200px 200px;
    height: 0px;
    width: 0px;
}

finalmente otteniamo questo :

bordo inferiore triangolare


21
Fantastico, ma non è lo stesso ? :-)
Stanislav Shabalin,

5
There's another way to draw .., che risulta essere allo stesso modo :) Bella spiegazione però
Hammad Khan,

16
-1 per l'utilizzo di JPEG con artefatti enormi. Ma +1 per creare un ottimo esempio di quando non usare JPEG a cui potrei collegarmi in futuro per dissuadere. ;)
Henrik Heimbuerger il

3
perché non viene usato un GIF invece qui?
prusswan,

4
Scusa @hheimbuerger, ho sbagliato il tuo esempio correggendo le immagini. Dovrai collegarti alla revisione 2 di questa risposta in futuro.
Rory O'Kane,

263

Approccio diverso:

I triangoli CSS3 con trasformazione ruotano

La forma triangolare è abbastanza facile da realizzare usando questa tecnica. Per le persone che preferiscono vedere un'animazione che spiega come funziona questa tecnica è:

animazione gif: come ruotare un triangolo con trasformazione

Altrimenti, ecco una spiegazione dettagliata in 4 atti (questa non è una tragedia) su come creare un triangolo rettangolo isoscele con un elemento.

  • Nota 1: per triangoli non isosceli e cose fantasiose, puoi vedere il passaggio 4 .
  • Nota 2: nei seguenti frammenti, i prefissi del fornitore non sono inclusi. sono inclusi nelle demo di codepen .
  • Nota 3: l'HTML per la seguente spiegazione è sempre: <div class="tr"></div>

PASSAGGIO 1: crea un div

Facile, assicurati di farlo width = 1.41 x height. Puoi usare qualsiasi tecnica ( vedi qui ) incluso l'uso delle percentuali e del fondo dell'imbottitura per mantenere le proporzioni e creare un triangolo reattivo . Nell'immagine seguente, il div ha un bordo giallo dorato.

In quel div, inserisci uno pseudo elemento e assegnagli il 100% di larghezza e altezza del genitore. Lo pseudo elemento ha uno sfondo blu nell'immagine seguente.

Creare un triangolo CSS con il passaggio 1 di roate di trasformazione

A questo punto, abbiamo questo CSS :

.tr {
    width: 30%;
    padding-bottom: 21.27%; /* = width / 1.41 */
    position: relative;
}

.tr: before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: #0079C6;
}

PASSAGGIO 2: ruotiamo

Primo, il più importante: definire un'origine di trasformazione . L' origine predefinita è al centro dello pseudo elemento e ne abbiamo bisogno in basso a sinistra. Aggiungendo questo CSS allo pseudo elemento:

transform-origin:0 100%; o transform-origin: left bottom;

Ora possiamo ruotare lo pseudo elemento di 45 gradi in senso orario con transform : rotate(45deg);

Creazione di un triangolo con CSS3 passaggio 2

A questo punto, abbiamo questo CSS :

.tr {
    width: 30%;
    padding-bottom: 21.27%; /* = width / 1.41 */
    position: relative;
}

.tr:before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: #0079C6;
    transform-origin: 0 100%;        
    transform: rotate(45deg);
}

PASSAGGIO 3: nascondilo

Per nascondere le parti indesiderate dello pseudo elemento (tutto ciò che trabocca il div con il bordo giallo) è sufficiente impostare overflow:hidden;sul contenitore. dopo aver rimosso il bordo giallo, ottieni ... un TRIANGOLO ! :

DEMO

Triangolo CSS

CSS:

.tr {
    width: 30%;
    padding-bottom: 21.27%; /* = width / 1.41 */
    position: relative;
    overflow: hidden;
}

.tr:before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: #0079C6;
    transform-origin: 0 100%;
    transform: rotate(45deg);
}

PASSO 4: vai oltre ...

Come mostrato nella demo , puoi personalizzare i triangoli:

  1. Rendili più sottili o più piatti giocando skewX().
  2. Falli puntare a sinistra, a destra o in qualsiasi altra direzione giocando con la direzione di trasformazione e rotazione.
  3. Fai un po 'di riflessione con la proprietà di trasformazione 3D.
  4. Dai i bordi del triangolo
  5. Inserisci un'immagine all'interno del triangolo
  6. Molto di più ... Scatena i poteri di CSS3 !

Perché usare questa tecnica?

  1. Triangle può essere facilmente reattivo.
  2. Puoi creare un triangolo con bordo .
  3. Puoi mantenere i confini del triangolo. Ciò significa che puoi attivare lo stato hover o fare clic sull'evento solo quando il cursore si trova all'interno del triangolo . Questo può essere molto utile in alcune situazioni come questa in cui ogni triangolo non può sovrapporsi ai suoi vicini, quindi ogni triangolo ha il suo stato al passaggio del mouse.
  4. Puoi creare effetti fantasiosi come i riflessi .
  5. Ti aiuterà a capire le proprietà di trasformazione 2d e 3d.

Perché non usare questa tecnica?

  1. Lo svantaggio principale è la compatibilità del browser , le proprietà di trasformazione 2d sono supportate da IE9 + e pertanto non è possibile utilizzare questa tecnica se si prevede di supportare IE8. Vedi CanIuse per maggiori informazioni. Per alcuni effetti fantasiosi l'utilizzo di trasformazioni 3d come il supporto del browser di riflessione è IE10 + (vedi canIuse per maggiori informazioni).
  2. Non hai bisogno di nulla di reattivo e un triangolo semplice va bene per te, quindi dovresti andare per la tecnica del bordo spiegata qui: migliore compatibilità del browser e più facile da capire grazie ai messaggi amorevoli qui.

16
Vale probabilmente la pena ricordare che 1.41 è un'approssimazione di √2 e la lunghezza dell'ipotenusa del triangolo che crei, motivo per cui hai bisogno (almeno) di quella larghezza.
KRyan,

Volevo mantenere la risposta semplice ma hai ragione, dovrebbe essere menzionato @KRyan
web-tiki,

In realtà, nel tentativo di utilizzare questo, skewXsarebbe utile menzionare il modo in cui sono state derivate le diverse larghezze da utilizzare .
KRyan,

1
Questo metodo funziona meglio quando hai bisogno di un bordo solido 1px per il triangolo.
Roman Losev,

Questo è per il caso in cui si desidera creare bordi per il triangolo, ero bloccato con i bordi quando voglio creare questa casella di annotazione AnnotationBox
vanduc1102

183

Ecco un'animazione in JSFiddle che ho creato per la dimostrazione.

Vedi anche lo snippet di seguito.

Questa è una GIF animata fatta da uno screencast

Gif Animato di Triangolo


Versione casuale


Versione tutto in una volta


49

Diciamo che abbiamo il seguente div:

<div id="triangle" />

Ora modifica il CSS passo dopo passo, così avrai un'idea chiara di ciò che sta accadendo in giro

PASSAGGIO 1: JSfiddle Link:

 #triangle {
        background: purple;
        width :150px;
        height:150PX;
        border-left: 50px solid black ;
        border-right: 50px solid black;
        border-bottom: 50px solid black;
        border-top: 50px solid black;
    }

Questo è un semplice div. Con un CSS molto semplice. Quindi un laico può capire. Div ha dimensioni 150 x 150 pixel con il bordo di 50 pixel. L'immagine è allegata:

inserisci qui la descrizione dell'immagine

PASSAGGIO 2: JSfiddle Link:

#triangle {
    background: purple;
    width :150px;
    height:150PX;
    border-left: 50px solid yellow ;
    border-right: 50px solid green;
    border-bottom: 50px solid red;
    border-top: 50px solid blue;
}

Ora ho appena cambiato il colore del bordo di tutti e 4 i lati. L'immagine è allegata.

inserisci qui la descrizione dell'immagine

PASSAGGIO: 3 JSfiddle Link:

#triangle {
    background: purple;
    width :0;
    height:0;
    border-left: 50px solid yellow ;
    border-right: 50px solid green;
    border-bottom: 50px solid red;
    border-top: 50px solid blue;
}

Ora ho appena cambiato l'altezza e la larghezza del div da 150 pixel a zero. L'immagine è allegata

inserisci qui la descrizione dell'immagine

PASSAGGIO 4: JSfiddle:

#triangle {
    background: purple;
    width :0px;
    height:0px;
    border-left: 50px solid transparent;
    border-right: 50px solid transparent;
    border-bottom: 50px solid red;
    border-top: 50px solid transparent;
}

Ora ho reso tutti i bordi trasparenti a parte il bordo inferiore. L'immagine è allegata di seguito.

inserisci qui la descrizione dell'immagine

PASSAGGIO 5: JSfiddle Link:

#triangle {
    background: white;
    width :0px;
    height:0px;
    border-left: 50px solid transparent;
    border-right: 50px solid transparent;
    border-bottom: 50px solid red;
    border-top: 50px solid transparent;
}

Ora ho appena cambiato il colore di sfondo in bianco. L'immagine è allegata.

inserisci qui la descrizione dell'immagine

Quindi abbiamo ottenuto il triangolo di cui avevamo bisogno.


3
Perché hai usato un portale Nether per il primo passo?
LuizLoyola,

38

E ora qualcosa di completamente diverso ...

Invece di usare i trucchi CSS non dimenticare le soluzioni semplici come entità html:

&#9650;

Risultato:

Vedi: Quali sono le entità HTML per i triangoli su e giù?


2
Non penso che "battuto" sia una parola appropriata qui. La soluzione si basa sulle metriche dei caratteri, quindi il posizionamento preciso è piuttosto dubbio, per non parlare del fatto che non hai alcun controllo sulla forma.
user776686

32

Considera il triangolo in basso

.triangle {
    border-bottom:15px solid #000;
    border-left:10px solid transparent;
    border-right:10px solid transparent;
    width:0;
    height:0;
}

Questo è ciò che ci viene dato:

Uscita a triangolo piccolo

Perché è venuto fuori in questa forma? Il diagramma seguente spiega le dimensioni, nota che 15px sono stati usati per il bordo inferiore e 10px sono stati usati per sinistra e destra.

Triangolo grande

È abbastanza facile creare un triangolo ad angolo retto anche rimuovendo il bordo destro.

Triangolo ad angolo retto


29

Facendo un ulteriore passo avanti, usando CSS basato su questo ho aggiunto le frecce ai miei pulsanti indietro e successivo (sì, so che non è cross-browser al 100%, ma scivolo comunque).

.triangle {
  width: 0;
  height: 0;
  border-left: 50px solid transparent;
  border-right: 50px solid transparent;
  border-bottom: 100px solid red;
  margin:20px auto;
}

.triangle-down {
  border-bottom:none;
  border-top: 100px solid red;
}

.triangle-left {
  border-left:none;
  border-right: 100px solid red;
  border-bottom: 50px solid transparent;
  border-top: 50px solid transparent;
}

.triangle-right {
  border-right:none;
  border-left: 100px solid red;
  border-bottom: 50px solid transparent;
  border-top: 50px solid transparent;
}

.triangle-after:after {
  width: 0;
  height: 0;
  border-left: 5px solid transparent;
  border-right: 5px solid transparent;
  border-bottom: 5px solid red;
  margin:0 5px;
  content:"";
  display:inline-block;
}

.triangle-after-right:after {
  border-right:none;
  border-left: 5px solid blue;
  border-bottom: 5px solid transparent;
  border-top: 5px solid transparent;

}

.triangle-before:before {
  width: 0;
  height: 0;
  border-left: 5px solid transparent;
  border-right: 5px solid transparent;
  border-bottom: 5px solid blue;
  margin:0 5px;
  content:"";
  display:inline-block;
}

.triangle-before-left:before {
  border-left:none;
  border-right: 5px solid blue;
  border-bottom: 5px solid transparent;
  border-top: 5px solid transparent;

}
<div class="triangle"></div>
<div class="triangle triangle-down"></div>
<div class="triangle triangle-left"></div>
<div class="triangle triangle-right"></div>

<a class="triangle-before triangle-before-left" href="#">Back</a>
<a class="triangle-after triangle-after-right" href="#">Next</a>


1
in che modo questo non è cross-browser? i triangoli dovrebbero tornare a IE6.
Chriscauley,

4
l'uso di: before e: after non è supportato al 100%.
PseudoNinja,

2
Gli psuedo-elementi non sono supportati <IE8.
alex,

19

OK, questo triangolo verrà creato a causa del modo in cui i bordi degli elementi lavorano insieme in HTML e CSS ...

Poiché di solito utilizziamo i bordi 1 o 2px, non notiamo mai che i bordi formano angoli di 45 ° l'uno con la stessa larghezza e se la larghezza cambia, anche il grado dell'angolo viene modificato, eseguiamo il codice CSS che ho creato di seguito:

.triangle {
  width: 100px;
  height: 100px;
  border-left: 50px solid black;
  border-right: 50px solid black;
  border-bottom: 100px solid red;
}
<div class="triangle">
</div>

Quindi, nel passaggio successivo, non abbiamo alcuna larghezza o altezza, qualcosa del genere:

.triangle {
  width: 0;
  height: 0;
  border-left: 50px solid black;
  border-right: 50px solid black;
  border-bottom: 100px solid red;
}
<div class="triangle">
</div>

E ora rendiamo invisibili i bordi sinistro e destro per rendere il nostro triangolo desiderabile come di seguito:

.triangle {
  width: 0;
  height: 0;
  border-left: 50px solid transparent;
  border-right: 50px solid transparent;
  border-bottom: 100px solid red;
}
<div class="triangle"></div>

Se non desideri eseguire lo snippet per visualizzare i passaggi, ho creato una sequenza di immagini per dare un'occhiata a tutti i passaggi in un'unica immagine:

inserisci qui la descrizione dell'immagine


18

Approccio diverso. Con gradiente lineare (per IE, solo IE 10+). Puoi usare qualsiasi angolo:

.triangle {
    margin: 50px auto;
    width: 100px;
    height: 100px;
/* linear gradient */
    background: -moz-linear-gradient(-45deg,  rgba(255,0,0,0) 0%, rgba(255,0,0,0) 50%, rgba(255,0,0,1) 50%, rgba(255,0,0,1) 100%);
 /* FF3.6+ */
    background: -webkit-gradient(linear, left top, right bottom, color-stop(0%,rgba(255,0,0,0)), color-stop(50%,rgba(255,0,0,0)), color-stop(50%,rgba(255,0,0,1)), color-stop(100%,rgba(255,0,0,1)));
 /* Chrome,Safari4+ */
    background: -webkit-linear-gradient(-45deg,  rgba(255,0,0,0) 0%,rgba(255,0,0,0) 50%,rgba(255,0,0,1) 50%,rgba(255,0,0,1) 100%);
 /* Chrome10+,Safari5.1+ */
    background: -o-linear-gradient(-45deg,  rgba(255,0,0,0) 0%,rgba(255,0,0,0) 50%,rgba(255,0,0,1) 50%,rgba(255,0,0,1) 100%);
 /* Opera 11.10+ */
    background: -ms-linear-gradient(-45deg,  rgba(255,0,0,0) 0%,rgba(255,0,0,0) 50%,rgba(255,0,0,1) 50%,rgba(255,0,0,1) 100%);
 /* IE10+ */
    background: linear-gradient(135deg,  rgba(255,0,0,0) 0%,rgba(255,0,0,0) 50%,rgba(255,0,0,1) 50%,rgba(255,0,0,1) 100%);
 /* W3C */;
}
<div class="triangle"></div>

Ecco jsfiddle


Questa è una soluzione meravigliosa, ma va notato che è solo IE 10+.
Eric Hu,

13

CSS clip-path

Questo è qualcosa che ritengo che questa domanda abbia mancato; clip-path

clip-path in poche parole

Il ritaglio, con la clip-pathproprietà, è simile al taglio di una forma (come un cerchio o un pentagono) da un pezzo di carta rettangolare. La proprietà appartiene alla specifica " CSS Masking Module Level 1 ". La specifica afferma che "il mascheramento CSS fornisce due mezzi per nascondere parzialmente o completamente parti di elementi visivi: mascheramento e ritaglio".


clip-pathutilizzerà l'elemento stesso anziché i suoi bordi per tagliare la forma specificata nei suoi parametri. Utilizza un sistema di coordinate basato su percentuale super semplice che rende la modifica molto semplice e significa che puoi prenderlo e creare forme strane e meravigliose in pochi minuti.


Esempio di forma triangolare

div {
  -webkit-clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
  clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
  background: red;
  width: 100px;
  height: 100px;
}
<div></div>


Svantaggio

Al momento ha un grande svantaggio, uno dei quali è la sua mancanza di supporto, essendo davvero coperto solo dai -webkit-browser e non avendo supporto su IE e solo molto parziale in FireFox.


risorse

Ecco alcune risorse e materiali utili per aiutarti a capire meglio clip-pathe anche iniziare a crearne uno tuo.


11

Questa è una vecchia domanda, ma penso che ne varrà la pena condividere come creare una freccia usando questa tecnica a triangolo.

Passo 1:

Consente di creare 2 triangoli, per il secondo utilizzeremo la :afterpseudo classe e la posizioneremo appena sotto l'altra:

2 triangoli

.arrow{
    width: 0;
    height: 0;
    border-radius: 50px;
    display: inline-block;
    position: relative;
}

    .arrow:after{
        content: "";
        width: 0;
        height: 0;
        position: absolute;
    }


.arrow-up{
     border-left: 50px solid transparent;
     border-right: 50px solid transparent;
     border-bottom: 50px solid #333;
}
    .arrow-up:after{
         top: 5px;
         border-left: 50px solid transparent;
         border-right: 50px solid transparent;
         border-bottom: 50px solid #ccc;
         right: -50px;
    }
<div class="arrow arrow-up"> </div>

Passo 2

Ora non ci resta che impostare il colore del bordo predominante del secondo triangolo sullo stesso colore dello sfondo:

inserisci qui la descrizione dell'immagine

Violino con tutte le frecce:
http://jsfiddle.net/tomsarduy/r0zksgeu/


9

SASS (SCSS) triangolo mixin

Ho scritto questo per rendere più semplice (e SECCO) la generazione automatica di un triangolo CSS:

// Triangle helper mixin (by Yair Even-Or)
// @param {Direction} $direction - either `top`, `right`, `bottom` or `left`
// @param {Color} $color [currentcolor] - Triangle color
// @param {Length} $size [1em] - Triangle size
@mixin triangle($direction, $color: currentcolor, $size: 1em) {
  $size: $size/2;
  $transparent: rgba($color, 0);
  $opposite: (top:bottom, right:left, left:right, bottom:top);

  content: '';
  display: inline-block;
  width: 0;
  height: 0;
  border: $size solid $transparent;
  border-#{map-get($opposite, $direction)}-color: $color;
  margin-#{$direction}: -$size;
}

esempio di caso d'uso:

span {
  @include triangle(bottom, red, 10px);
}

Pagina del parco giochi


Nota importante:
se il triangolo sembra pixel in alcuni browser, provare uno dei metodi descritti qui .


8

Se vuoi applicare il bordo al triangolo leggi questo: Crea un triangolo con CSS?

Quasi tutte le risposte si concentrano sul triangolo costruito usando il bordo, quindi ho intenzione di elaborare il linear-gradientmetodo (come iniziato nella risposta di @lima_fil ).

L'uso di un valore in gradi come 45°ci costringerà a rispettare un rapporto specifico height/widthal fine di ottenere il triangolo che vogliamo e questo non sarà reattivo:

Invece di farlo dovremmo considerare valori predefiniti di direzione come to bottom, to topecc. In questo caso possiamo ottenere qualsiasi tipo di forma triangolare mantenendola reattiva.

1) Triangolo rettangolare

Per ottenere tale triangolo dobbiamo lineare gradiente ed una direzione diagonale come to bottom right, to top left, to bottom left, ecc

2) triangolo isoscele

Per questo avremo bisogno di 2 gradienti lineari come sopra e ognuno prenderà metà della larghezza (o dell'altezza). È come se creassimo un'immagine speculare del primo triangolo.

3) triangolo equilatero

Questo è un po 'complicato da gestire in quanto dobbiamo mantenere una relazione tra l'altezza e la larghezza del gradiente. Avremo lo stesso triangolo sopra ma renderemo il calcolo più complesso al fine di trasformare il triangolo isoscele in uno equilatero.

Per semplificare, considereremo che la larghezza del nostro div è nota e l'altezza è abbastanza grande da poter disegnare il nostro triangolo all'interno ( height >= width).

Triangolo CSS con gradiente

Abbiamo i nostri due gradienti g1e g2, la linea blu è la larghezza del div we ogni gradiente ne avrà il 50% ( w/2) e ogni lato del triangolo dovrebbe essere uguale a w. La linea verde è l'altezza di entrambi i gradienti hge possiamo facilmente ottenere la formula seguente:

(w/2)² + hg² = w²---> hg = (sqrt(3)/2) * w--->hg = 0.866 * w

Possiamo fare affidamento calc()per fare il nostro calcolo e per ottenere il risultato necessario:

Un altro modo è controllare l'altezza del div e mantenere facile la sintassi del gradiente:

4) Triangolo casuale

Per ottenere un triangolo casuale, è facile poiché dobbiamo semplicemente rimuovere la condizione del 50% di ciascuno, MA dovremmo mantenere due condizioni (entrambe dovrebbero avere la stessa altezza e la somma di entrambe le larghezze dovrebbe essere del 100%).

E se volessimo definire un valore per ciascuna parte? Dobbiamo semplicemente fare di nuovo il calcolo!

Triangolo CSS con gradiente

Definiamo hg1e hg2come l'altezza del nostro gradiente (entrambi sono uguali alla linea rossa) quindi wg1e wg2come la larghezza del nostro gradiente ( wg1 + wg2 = a). Non ho intenzione di dettagliare il calcolo, ma alla fine avremo:

wg2 = (a²+c²-b²)/(2a)
wg1 = a - wg2
hg1 = hg2 = sqrt(b² - wg1²) = sqrt(c² - wg2²)

Ora abbiamo raggiunto il limite dei CSS poiché anche con calc()noi non saremo in grado di implementarlo, quindi dobbiamo semplicemente raccogliere manualmente il risultato finale e usarli come dimensioni fisse:

indennità

Non dovremmo dimenticare che possiamo anche applicare la rotazione e / o l'inclinazione e abbiamo più opzioni per ottenere più triangoli:

E ovviamente dovremmo tenere a mente la soluzione SVG che può essere più adatta in alcune situazioni:


4

ecco un altro violino:

.container:after {
    position: absolute;
    right: 0;
    content: "";
    margin-right:-50px;
    margin-bottom: -8px;
    border-width: 25px;
    border-style: solid;
    border-color: transparent transparent transparent #000;
    width: 0;
    height: 0;
    z-index: 10;
    -webkit-transition: visibility 50ms ease-in-out,opacity 50ms ease-in-out;
    transition: visibility 50ms ease-in-out,opacity 50ms ease-in-out;
    bottom: 21px;
}
.container {
    float: left;
    margin-top: 100px;
    position: relative;
    width: 150px;
    height: 80px;
    background-color: #000;
}

.containerRed {
    float: left;
    margin-top: 100px;
    position: relative;
    width: 100px;
    height: 80px;
    background-color: red;
}

https://jsfiddle.net/qdhvdb17/


4

Altri lo hanno già spiegato bene. Lascia che ti dia un'animazione che spiegherà questo in fretta: http://codepen.io/chriscoyier/pen/lotjh

Ecco un po 'di codice con cui puoi giocare e apprendere i concetti.

HTML:

<html>
  <body>
    <div id="border-demo">
    </div>
  </body>
</html>

CSS:

/*border-width is border thickness*/
#border-demo {
    background: gray;
    border-color: yellow blue red green;/*top right bottom left*/
    border-style: solid;
    border-width: 25px 25px 25px 25px;/*top right bottom left*/
    height: 50px;
    width: 50px;
}

Gioca con questo e guarda cosa succede. Imposta altezza e larghezza a zero. Quindi rimuovere il bordo superiore e rendere trasparenti sinistra e destra, o semplicemente guardare il codice qui sotto per creare un triangolo CSS:

#border-demo {
    border-left: 50px solid transparent;
    border-right: 50px solid transparent;
    border-bottom: 100px solid blue;
}

2

Se si vuole giocare con border-size, widthe heighte vedere come questi possono creare forme diverse, provate questo:

const sizes = [32, 32, 32, 32];
const triangle = document.getElementById('triangle');

function update({ target }) {
  let index = null;
  
  if (target) {
    index = parseInt(target.id);

    if (!isNaN(index)) {
      sizes[index] = target.value;
    }
  }
  
  window.requestAnimationFrame(() => {
    triangle.style.borderWidth = sizes.map(size => `${ size }px`).join(' ');
    
    if (isNaN(index)) {
      triangle.style[target.id] = `${ target.value }px`;
    }
  });
}

document.querySelectorAll('input').forEach(input => {
  input.oninput = update;
});

update({});
body {
  margin: 0;
  min-height: 100vh;
  display: flex;
  justify-content: center;
  align-items: center;
  overflow: hidden;
}

#triangle {
    border-style: solid;
    border-color: yellow magenta blue black;
    background: cyan;
    height: 0px;
    width: 0px;
}

#controls {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  background: white;
  display: flex;
  box-shadow: 0 0 32px rgba(0, 0, 0, .125);
}

#controls > div {
  position: relative;
  width: 25%;
  padding: 8px;
  box-sizing: border-box;
  display: flex;
}

input {
  margin: 0;
  width: 100%;
  position: relative;
}
<div id="triangle" style="border-width: 32px 32px 32px 32px;"></div>

<div id="controls">
  <div><input type="range" min="0" max="128" value="32" id="0" /></div>
  <div><input type="range" min="0" max="128" value="32" id="1" /></div>
  <div><input type="range" min="0" max="128" value="32" id="2" /></div>
  <div><input type="range" min="0" max="128" value="32" id="3" /></div>
  <div><input type="range" min="0" max="128" value="0" id="width" /></div>
  <div><input type="range" min="0" max="128" value="0" id="height" /></div>
</div>


1

Prova questo:-

.triangle {
    border-color: transparent transparent red transparent;
    border-style: solid;
    border-width: 0px 200px 200px 200px;
    height: 0px;
    width: 0px;
}
<div class="triangle"></div>


0

So che questo è vecchio, ma vorrei aggiungere a questa discussione che ci sono almeno 5 metodi diversi per creare un triangolo usando solo HTML e CSS.

  1. utilizzando borders
  2. utilizzando linear-gradient
  3. utilizzando conic-gradient
  4. Utilizzando transformeoverflow
  5. utilizzando clip-path

Penso che tutti siano stati trattati qui ad eccezione del metodo 3, usando il conic-gradient, quindi lo condividerò qui:

.triangle{
        width: 40px;
        height: 40px;
        background: conic-gradient(at 50% 50%,transparent 135deg,green 0,green 225deg, transparent 0);
    }
<div class="triangle"></div>

Crea triangoli CSS usando la sfumatura conica

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.