3 post random:
1
2
3

Index/diario


26/05/08 ore 09:22:00

Esperimenti CSS

Creare facilmente div con angoli tondi senza usare immagini e javascript

Una soluzione CSS veloce, configurabile, leggera, validata, dal layout elastico. Insomma, una soluzione con le palle... quattro palle, per essere precisi!
Compatibilità: Internet Explorer dalla versione 5 (versione 6 per la variante con cornice 3d*), Firefox (compresa la versione 3) per Win e Mac, Opera per Win e Mac, Safari per Win e Mac, Camino per Mac.

Update 3/9/2008: testata positivamente compatibilità su Google Chrome
Update 23/3/2009: testata positivamente compatibilità su Internet Expolorer 8

* Causa errata interpretazione del Box Model da parte di Internet Explorer 5.5 e inferiore

Premessa: tengo a precisare che questa è una soluzione che ha la sua ragione di vita nell’essere “cross browser”. Se per voi è sufficente offrire un layout con angoli tondi per gli utenti di Firefox e Safari/Chrome, potete utilizzare la proprietà CSS3 “-border-radius”:

-moz-border-radius: 10px (per Firefox)
-webkit-border-radius: 10px (per Safari/Chrome)

Div con angoli tondi senza immagini e js

Mesi fa avevo proposto una procedura CSS per creare box con angoli tondi senza immagini, utilizzando le liste di definizione. Vediamo ora una versione che fa uso dei classici div, quindi molto più familiare a chi sviluppa siti web.
Il punto di forza della versione con liste di definizione era il fatto che non venivano richiesti tag aggiuntivi, potendo utilizzare, per creare l’effetto “stondatura”, gli stili applicati ai vari elementi della definition list (dl), ossia i tag definition term (dt) e definition detail (dd).
Ora invece non abbiamo a disposizione che un singolo tag - il div, appunto - per cui saremo costretti ad usare degli elementi aggiuntivi... o qualsi!

Utilizzeremo infatti quattro bullet (•) posizionati alla fine del div, che avranno, nel flusso del documento, la funzione di una spaziatura tipografica (come il tag hr, per intenderci). Come avrete capito, l’escamotage che permette di creare angoli tondi senza immagini o javascript sta tutto nell’utilizzo di questi quattro bullet. Vediamo come.

Parte 1: creare le quattro “gabbie” per gli angoli curvi e posizionarle ai quattro angoli del div.

Partiamo dall’HTML del div:

<div class="div1">
<h3>Ecco ad esempio un div</h3>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
Morbi convallis. Etiam at nunc. Quisque egestas pharetra felis.
Pellentesque aliquet sagittis velit (...)
</p>
<span class="lt"><b>&#8226;</b></span>
<span class="rt"><b>&#8226;</b></span>
<span class="lb"><b>&#8226;</b></span>
<span class="rb"><b>&#8226;</b></span>
</div>

Notiamo che in un quadro HTML che presenta un normalissimo div con titolo e paragrafo (ma questi due tag sono opzionali e sostituibili con qualsiasi elemento si voglia) risaltano i quattro bullet, ognuno all’interno di uno span e boldato.
Per inciso, le classi di questi span hanno un nome abbastanza intuitivo: lt = left-top, lb = left-bottom, rt = right-top e rb = right-bottom. Semplice, no?

Cominciamo col posizionare i quattro <span> in maniera assoluta ai quattro angoli del div contenitore (al quale avremmo già dato il valore position:relative). Questi span, che trasformiamo in block element tramite la proprietà display:block e ai quali diamo una larghezza e altezza uguale e fissa, nasconderanno tutto il loro contenuto in eccesso (ossia la parte eccedente del bullet), tramite la proprietà overflow:hidden.
Due note importanti: 1) i quattro elementi dovranno avere un colore di sfondo uguale a quello della pagina (o della sezione di pagina) nella quale il div è inserito e 2) altri elementi presenti all'interno del div che possono risultare in prossimità di un angolo curvo (nel nostro caso il titolo h3) dovrebbero avere un posizionamento relativo e uno z-index superiore a quello dei quattro span, in modo da essere sempre in primo piano...
Ecco quindi il la porzione dei CSS relativa al div e agli span nei quali sono inseriti i bullet:

.div1 { 
margin:10px 0;
padding:0;
width:60%;
position:relative;
background-color:DarkSeaGreen;
}

.div1 h3 {
position:relative;
z-index:12;
}

.div1 p {
margin:5px 0;
padding:10px;
}

/*qui sotto gli stili dei quattro span che contengono i bullet*/

.div1 .lt, .div1 .lb, .div1 .rt, .div1 .rb {
position:absolute;
width:15px;
height:15px;
background-color:#fff;
overflow:hidden;
display:block;
z-index:1;
}

.div1 .lt {
left:0;
top:0;
}

.div1 .rt {
right:0!important;
right:-1px; /*fix per IE6 o inferiore*/
top:0;
}

.div1 .lb {
left:0;
bottom:0;
}

.div1 .rb {
right:0!important;
right:-1px; /*fix per IE6 o inferiore*/
bottom:0;
}

Quello che vediamo a browser per il momento è questo:

Esempio 1

Parte 2: Ricavare degli archi dai quattro bullet “ingabbiati”

Nota: da questo punto in poi ci occuperemo del tag <b> entro cui sono annidiati i bullet. Quindi, ove non specificato, gli stili CSS si intendono applicati a questo elemento.

Cosa andremo a fare ora, per trasformarei bullet nei quattro angoli stondati?
Semplice, “gonfiamo” i bullet agento sulla proprietà font-size del tag <b>, e li coloriamo con la stessa tinta del background del div. Ovviamente, essendo questi dentro un block element di pochi pixel che fa da “maschera” nascondendo il contenuto eccedente (ricordate la proprietà overflow:hidden applicata ai quattro span?), noi ne vedremo solo una porzione... Quella che serve a riempire l’angolo del div, appunto!
Ai bullet dovremmo anche impostare un font specifico (ho scelto il Trebuchet MS perchè diffuso sui principali OS) in modo che la loro dimensione sia sempre uguale, a prescindere dal carattere che si usa nella pagina.
Ci rimane infine solo da aggiustare il posizionamento dei singoli bullet dentro gli span che fanno da “maschera”. Per fare questo agiremo sui margini sinistro e superiore con valori negativi, finchè non avremo “parcheggiato” alla perfezione ogni singolo “pallino” (notiamo che i margini superiori avranno lo stesso valore per gli angoli superiori e inferiori, mentre i margini sinistri avranno lo stesso valore per gli angoli sinistri e destri... essendo il div e i bullet delle figure simmetriche...).
Ecco la parte di CSS realtiva ai bullet (o meglio, al tag <b> che li contiene):

.div1 .lt b, .div1 .lb b, .div1 .rt b, .div1 .rb b { 
font-size:105px;
color:DarkSeaGreen;
font-family:"Trebuchet MS";
display:block;
cursor:default;
line-height:130px;
}

.div1 .lt b {
margin-top:-57px;
margin-left:-12px;
}

.div1 .lb b {
margin-top:-74px;
margin-left:-12px;
}

.div1 .rt b {
margin-top:-57px;
margin-left:-29px;
}

.div1 .rb b {
margin-top:-74px;
margin-left:-29px;
}

E questo è il div con gli angoli arrotondati completato: Esempio 2Per rendere più chiaro il procedimento col quale abbiamo ottenuto gli angoli tondi, ho evidenziato i quattro bullet, impostandogli il colore rosso ed eliminando la proprietà overflow:hidden allo span che li contiene: Esempio 3 Se invece vi state domandando come appariranno i quattro div ad un utente che ha i CSS disabilitati, eccovi uno screenshot dimostrativo: Esempio 4 I quattro punti hanno dunque la funzione di separare le varie sezione della pagina, ovviamente se posizionati alla fine del div, come da esempio.

Non ci resta adesso che vedere la pagina di esempio, che presenta anche il codice CSS del DIV con la cornice.

Commenti
1 Il 11/07/08 alle 23:23:01 Paolo così commentò:

Come soluzione non è male, leggera, senza immagini... ma che puoi dirmi riguardo l'accessibilità? pur essendo una bella soluzione (in attesa della diffusione dei css3) mi sembra però un accrocchio... anche se ha l'indubbia praticità di funzionare anche senza dimensioni fisse...

2 Il 14/07/08 alle 09:56:25 Lorenzo Commento dell’autore, in risposta, così commentò:

Ciao Paolo, grazie per l'attenzione.
E' chiaro che in soluzioni del genere dovrai sempre “sporcare” l'html per inserire elementi per i quali i soli tag di struttura non bastano (a meno di non usare elementi più versatili dei div, ad esempio le liste di definizione, come già avevo fatto).
Il discorso a questo punto è più che altro come limitare e/o ottimizzare l'uso di questi elementi html non strutturali.
Come puoi vedere (http://www.smileycat.com/miaow/archives/000044.php), la maggior parte delle (poche) soluzioni che presentano angoli curvi senza immagini estensibili e senza uso di js (e che non avevo consultato prima di creare questo tutorial), usano una serie di tag vuoti prima e dopo il contenuto.
Ora: è meglio avere dei tag vuoti prima e dopo il contenuto o quattro bullets prima della chiusura del div?
Comunque, come giustamente rilevi tu, appena la diffusione dei browser che supportano i CSS3 sarà ragionevole, questi metodi finiranno tra le curiose memorabilia del web design...

3 Il 21/10/08 alle 17:36:42 marny così commentò:

Ciao, innanzitutto ti ringrazio per gli interessantissimi articoli che metti a disposizione.
Premetto che non sono un'esperta, provando la tua soluzione ho rilevato due problemi su ie6, lo puoi notare anche con la tua pagina di esempio.
1):

.div1 .rt {
right:0!important;
right:-1px; /*fix per IE6 o inferiore*/
top:0;
}

il fix per ie6 (non so per le versioni inferiori) ? inutile perch? visualizza proprio lo “sbordamento”. Quindi basta
.div1 .rt {
right:0!important;
right:-1px; /*fix per IE6 o inferiore*/
top:0;
}

Almeno io ho risolto così!

2):
nel lato inferiore del box , appaiono due linee come nell'esempio che ti metto (sempre dalla tua pagina di esempio)
[URL=http://img216.imageshack.us/img216/8534/angoliie6tl4.gif[/URL]
Per quest'ultimo ho tentando alcune soluzioni ma senza esito positivo. Magari è più semplice di quanto si pensi.
Ciao e grazie ancora

4 Il 21/10/08 alle 17:43:52 marny così commentò:

Scusa ho fatto confusione con il post precedente.
Per ie6 basta

right:0!important;


il link
http://img216.imageshack.us/img216/8534/angoliie6tl4.gif

Sorry

5 Il 21/10/08 alle 22:17:34 Lorenzo Commento dell’autore, in risposta, così commentò:

Ciao, Marny, sono io che ti ringrazio per le segnalazioni, per me molto importanti.
Partendo dal tuo punto 1, se elimino il workaround per IE6, quindi lascio il CSS cos?:


.div1 .rt {
right:0;
top:0;
}

con il suddetto browser vedo i due angoli a destra in questo modo , con una linea di un px a dx (l'esempio è relativo a quello superiore-destro).

Se rimetto il workaround com'è attualmente online, va tutto a posto.
Comunque, dato che a te risulta diversamente, domani farò un controllo con un altro PC su cui è installato il vetusto browser, vediamo chi ha ragione :-)

Per quanto riguarda il punto 2, le linee orizzontali che vedi in realtà non erano un problema del CSS, ma del getElementById che avevo usato per “accendere” e “spegnere” il div con il codice dei CSS (infatti comparivano solo quando il div era “acceso”). Ora comunque ho sistemato e dovrebbe essere ok.

Grazie ancora e a presto!

6 Il 22/10/08 alle 00:06:45 marny così commentò:

Ciao, scusa per la confusione che ho fatto con il link dell'immagine.
Ho appena guardato la tua pagina di esempio, con firefox2 e opera 6 è tutto ok, mentre con ie6 (installato nel pc) rilevo gli stessi problemi che ti ho già esposto.
Gli angoli destri superiore e inferiore sbordano.
Le linee orizzontali non sono sparite, le vedo sempre in basso sia a sinistra che a destra del box.
Uguale all'immagine che ho cercato di inserire precedentemente.
Lo stesso problema lo riscontro sul tema che sto preparando, pensavo fosse un errore mio ma poi ho visto che anche nel tuo si presentano questi due “disguidi tecnici”
Vedremo dopo la tua verifica. Grazie per l'attenzione, alla prossima

7 Il 22/10/08 alle 10:28:24 Lorenzo Commento dell’autore, in risposta, così commentò:

Ok, ho capito l'arcano!
Le scalettature in IE6 dipendono dalla risoluzione con cui guardi la pagina. Per essere precisi, quelle orizzontali inferiori compaiono a larghezze molto basse. Di contro, a risoluzioni medio alte (superiori a 1024) questo problema non si pone.
Dai, appena riesco provo a trovare una soluzione, purtroppo questo comportamento rientra nel novero delle varie bizze di IE6...
A presto

8 Il 23/10/08 alle 16:46:58 marny così commentò:

Grazie Lorenzo, mi hai insegnato una cosa che ignoravo. Ho una risoluzione a 1024 e le preferenze di ie6 sono quelle di default (non lo uso mai) ossia carattere medio.
Infatti come dici te, se cambio a molto grande non riscontro problemi.
Grazie ancora

9 Il 23/10/08 alle 22:22:48 Lorenzo Commento dell’autore, in risposta, così commentò:

Grazie a te per avere portato alla luce questo errore di interpretazione di IE6 del quale non mi ero accorto, capitando solo sotto una certa risoluzione e in maniera incostante.
Quando sarà più “scarico” ci lavorerò un po... certo che con questo browser non ci si annoia mai :-)

10 Il 16/03/09 alle 20:22:12 liliansi così commentò:

Ma tu sei un grande!!! Non ho parole, ottima soluzione!

11 Il 11/01/10 alle 13:35:36 Tatiana così commentò:

Ciao, ottima soluzione ed un esempio pratico a portata di tutti. Lo stavo cercando da un pò...

Pubblicandolo però gli angoli arrotondati non mi escono, potresti aiutarmi???

12 Il 12/01/10 alle 09:08:32 Lorenzo Commento dell’autore, in risposta, così commentò:

Ciao Tatiana,
per te e per altri che hanno bisogno di assistenza consiglio di darmi qualche riferimento concreto e magari un esempio della pagina nella quale si vuole “innestare” il codice. Così alla cieca è impossibile rendermi utile... : )
Se preferite potete mandarmi il tutto via mail (l'indirizzo è qui: http://www.verosimile.it/autore/Lorenzo)

Aggiungi un commento
Puoi inserire immagini, video o formattazione:
  • Grassetto, enfasi, sottolineato: [b][/b] [i][/i] [u][/u]
  • Blockquote: [quote][/quote]
  • Codice: [code][/code]
  • Immagine: [img][/img]
  • Video YouTube: [youtube][/youtube]
tirami su!
proudly online since 2007