Massimiliano Carnevale

Massimiliano Carnevale

Co-Founder
Stile e grafica

CSS: creare etichette a 45 gradi senza l'uso di immagini

Ovvero, come creare ribbon per il tuo ecommerce con il solo aiuto di CSS3 e un po' di trigonometria.

Pubblicato il 24/07/2015

Son sicuro che molti di voi si saranno chiesti: ma a cosa serve studiare la trigonometria?
Ma perché devo conoscere il seno o il coseno quando alla fine ho il computer che lo fa per me?

Ecco, oggi inizieremo a capire come anche nel web, per fare un semplice strillo da mettere nelle offerte speciali, essa sia fondamentale!

senza bisogno di immagini usando solo il colore del bordo e le posizioni dei blocchi.

Bene, iniziamo!

 

Bordi Css

Son certo che se state leggendo questa miniguida, saprete cosa siano i bordi nei blocchi html, e come si possano modificare/gestire con i css.
Probabilmente vi sarà sfuggita la loro estrema flessibilità. Per capirci meglio, vediamo degli esempi che, come sempre accade, valgono più di mille parole.

Creiamo un blocco, di dimensioni 100x100 pixel, al quale applichiamo un bordo di 100pixel di quattro colori diversi, con questo css:

#blk {
	width:100px;
	height:100px;
	margin:50px auto;
	background:#ccc;
	border-width:100px;
	border-style:solid;
	border-color:#0cf #0fc #fc0 #f0c;
}

che ci darà questo risultato:

Non male no?

Allo stesso blocco, ora togliamo i bordi destro e inferiore:

#blk {
	width:100px;
	height:100px;
	margin:50px auto;
	background:#ccc;
	border-width:100px 0 0 100px;
	border-style:solid;
	border-color:#0cf #0fc #fc0 #f0c;
}

con questo risultato.


immagino state iniziando a capire dove voglia arrivare...

Ora settiamo come trasparenti tutti i bordi tranne quello superiore.

#blk {
	width:100px;
	height:100px;
	margin:50px auto;
	background:#ccc;
	border-width:100px 0 0 100px;
	border-style:solid;
	border-color:#0cf transparent transparent transparent;
}

togliamo poi il colore di sfondo, lasciandolo trasparente, e settiamo larghezza e altezza a zero del blocco:

#blk {
	width:0;
	height:0; margin:50px auto;
	background:none;
	border-width:100px 0 0 100px;
	border-style:solid;
	border-color:#0cf transparent transparent transparent;
}

et voilà: abbiamo ottenuto l'etichetta a 45 gradi che volevamo

Ovviamente avremmo potuto ottenere anche l'angolo sinistro o gli angoli bassi: inserisco il codice per il top-sx, gli altri ve li lascio per esercizio.

#blk {
	width:0;
	height:0;
	margin:50px auto;
	background:none;
	border-width:100px 100px 0 0;
	border-style:solid;
	border-color:#0cf transparent transparent transparent;
}

Ok. E se volessi angoli diversi? tipo a 30 o 60 gradi, come si fa?
Semplice! Basta impostare le due larghezze del bordo in modo tale che l'angolo ottenuto sia quello voluto.
Eccola la trigonometria! Come si calcola, in un triangolo rettangolo, l'angolo congruente avendo i due cateti?
Facile dai! Dati a e b, cateti, e v l'angolo richiesto, otterremo che

b=a*tan(v)

Prediamo i casi in cui v è di 30, e a fisso a 100px, otterremo che b deve essere:

b=100*tan(π/6) -> b=57.7 pixel.

E, infatti, se proviamo con queste due set di regole:

#blk {
	width:0;
	height:0;
	margin:50px auto;
	background:none;
	border-width:100px 0 0 57.7px;
	border-style:solid;
	border-color:#fc0 transparent transparent transparent;
}
#blk {
	width:0;
	height:0;
	margin:50px auto;
	background:none;
	border-width:57.7px 0 0 100px;
	border-style:solid;
	border-color:#f0c transparent transparent transparent;
}

otterremo rispettivamente:

Bene finora, o no?

Vediamo ora come ottenere le etichette sfruttando ciò che abbiamo appreso con gli angoli dai bordi.

 

Etichette

Prepariamo un blocco html (testBlk), al quale vogliamo applicare l'effetto. Al suo interno aggiungiamo due blocchi: uno per l'angolo (.corner) e uno per il testo (.testo)

Testo

Iniziamo subito ad assegnare delle regole basi. In particolare, settiamo i due blocchi interni con posizione assoluta e fissati in alto e a destra, e assegnamo a corner le regole apprese sopra.

#testBlk {
	background:#ccc;
	width:200px;
	height:200px;
	border:1px solid #333;
	position:relative;
	margin:100px auto;
}
	#testBlk .corner {
		position:absolute;
		top:0;
		right:0;
		width:0;
		height:0;
		margin:0;
		padding:0;
		background:none;
		border-width:100px 0 0 100px;
		border-style:solid;
		border-color:#0cf transparent transparent transparent;
	}
	#testBlk .testo {
		position:absolute;
		top:0;
		right:0px;
		width:141.4px;
		height:20px;
		line-height:20px;
		padding:118.4px 0 3px 0;
		text-align:center;
		background:rgba(127,127,127,0.5);
		color:#f0c;
	}

Otterremo questo:

Notate la larghezza (141.4px e l'altezza [20+118.4+3=141.4px]). Perché proprio questo valore?
Semplice: vorremmo girare il quadrato del testo e alliearlo con il bordo. E come si calcolo l'ipotenusa di un triangolo rettangolo, conoescendo i cateti e/o un cateto e un angolo?
Ecco ancora la trigonometria che entra in gioco! :)
In questo caso specifico,

l=100/cos(π/4)=141.4 pixel.

Spero abbiate notato anche che ho creato un'altezza di 20 pixel per poi aggiungervi del padding inferiore e soprattutto superiore per ottenere un blocco quadrato con il testo in basso!

Proviamo ora a girare il blocco del testo di 45 gradi aggiungendo questa regola [NdA: vale solo per webkit e mozilla. Per altri browser ci son altri metodi che esulano da questa discussione]

#testBlk .testo {
	-webkit-transform: rotate(45deg);
	-moz-transform: rotate(45deg);
}


notate come il blocco sia ruotato rispetto al centro.
Cosa che ovviamente non ci soddisfa!
Ci tocca spostare il centro fino a che il bordo del testo corrisponda al bordo diagonale del triangolo. E ok. E di quanto lo dobbiamo spostare?

Sì, avete capito: ancora trigonometria!
Per capire guardiamo meglio l'immagine:

Dobbiamo traslare il centro verso destra e verso l'altro, a 45 gradi in pratica, di uno spazio pari alla parte rossa e a quella gialla. E' evidente che la parte rossa diagonale sia pari a quelle orizzontali e verticali rosse (non vi tedio con geometria: è evidente che sia così in quanto è lo stesso blocco girato, e la riga rossa è la stessa, solo girata. E lo stesso vale per la parte gialla).
Quanto vale questo distanza(gialla + rossa)?

Beh, se notate, le linee orizzontali e verticali chiudono un nuovo triangolo isoscele rettangolo, con ipotenusa lunga 141.4 pixel e cateti lunghi quanto la traslazione (sì, lo so che c'è un altro modo molto più semplice per capire quanto siano lunghi, tranquilli!) :

Quanto dobbiamo traslare quindi? Beh, basta fare

141.4*cos(π/4)=100px.

Ok, 100 pixel in una direzione. E se consideriamo l'asse cartesiano, quanto vale tale spostamento sui due assi?

Anche qui, semplice semplice:

100*cos(π/4)=70.7pixel
100*sin(π/4)=70.7pixel

(sapendo che dato un triangolo rettangolo, data l'ipotenusa e un angolo, i cateti, ergo le proiezioni sugli assi, si calcolano moltiplicando ipotenusa per seno e coseno dell'angolo. Cosa? è ancora trigonometria? eccerto, ve l'ho detto che serve come il pane, no?!)

A questo punto abbiamo tutto per ottenere ciò che ci siamo prefissati:

#testBlk {
	background:#ccc;
	width:200px;
	height:200px;
	border:1px solid #333;
	position:relative;
	margin:100px auto;
}
	#testBlk .corner {
		position:absolute;
		top:0;
		right:0;
		width:0;
		height:0;
		margin:0;
		padding:0;
		background:none;
		border-width:100px 0 0 100px;
		border-style:solid;
		border-color:#0cf transparent transparent transparent;
	}
	#testBlk .testo {
		position:absolute;
		top:-70.7px;
		right:-70.7px;
		width:141.4px;
		height:20px;
		line-height:20px;
		padding:118.4px 0 3px 0;
		text-align:center;
		background:none;
		color:#f0c;
		-webkit-transform: rotate(45deg);
		-moz-transform: rotate(45deg);
	}

il quale, mettendo due regolette per spostare un po' il bordo in basso, e aggiungendo l'immagine di sfondo nell'html, ci portano al risultato voluto

Html:

Testo

CSS finale:

#testBlk {
	background:#fff;
	width:200px; 
	height:200px; 
	border:1px solid #333; 
	position:relative;
	margin:100px auto;
}
	#testBlk .corner {
		position:absolute;
		top:1px;
		right:1px;
		width:0;
		height:0; 
		margin:0; 
		padding:0; 
		background:none; 
		border-width:100px 0 0 100px; 
		border-style:solid; 
		border-color:rgba(255, 127, 0, 0.9) transparent transparent transparent;
	}
	#testBlk .testo {
		position:absolute;
		top:-69.7px;
		right:-69.7px;
		width:141.4px;
		height:20px;
		line-height:20px;
		padding:118.4px 0 3px 0;
		text-align:center;
		background:none;
		color:#fff;
		-webkit-transform: rotate(45deg);
		-moz-transform: rotate(45deg);
	}

Ok. Siamo arrivati alla fine. Ovviamente, per qualunque dubbio, siamo a disposizione: usate i commenti.

PS: Qui troverete l'html completo diviso passo per passo, nel caso vi siete persi qualche pezzo per strada!

CONDIVIDI SUI SOCIAL
Ueppy Blog

Leggi articoli correlati

Stile e grafica

Figure CSS avanzate: stelle, mezzaluna, cono e pacman

Seconda parte riguardante la creazione di figure geometriche con il solo aiuto di CSS. Anche in questo caso proponiamo l'astrazione delle stesse via SCSS.

Leggi l'articolo
Stile e grafica

L'ottavina reale e i CSS3

Un omaggio a Francesco Nuti per mostrare la potenza dei CSS3: un colpo da biliardo, sono con i css, senza immagini, video e javascript!

Leggi l'articolo
Stile e grafica

Figure CSS base: rettangolo, quadrato, cerchio, ovale, triangolo e poligoni.

Come creare delle figure geometriche semplici attraverso i CSS e come riutilizzarne il codice con SCSS.

Leggi l'articolo
Stile e grafica

Sintassi e prime basi SASS: parte prima

Primi esempi pratici di codice per SASS, il pre-processore di CSS - parte prima

Leggi l'articolo
Scopri Ueppy

Scopri Ueppy

un network di professionisti specializzati
nel web.

Scopri Ueppy
Contatta Ueppy
Contatta Ueppy VUOI COSTRUIRE UN NUOVO PROGETTO WEB?

Contatta Ueppy

Scrivici