Very short trick: versatilità delle classi CSS

Lunedì 10 Novembre, 2008

I più esperti lo sapranno già, tuttavia mi viene spesso chiesto che differenza c'è tra class e id nei fogli di stile CSS. Una panoramica su alcune differenze e avvertenze è possibile trovarla in Classi e ID nei CSS, tuttavia una caratteristica utile, che distingue class da id, è la possibilità di usare classi multiple. Ad esempio è possibile definire:

CSS:
  1. .bordoNero {border:2px solid #000}
  2. .coloreRosso {color:#f00}
  3. .bordoRosso {border:2px solid #f00}

e scrivire nell'HTML:

HTML:
  1. <div class="bordoNero coloreRosso">Bordo nero con caratteri rossi</div>
  2. <div class="bordoRosso coloreRosso">Bordo rosso con caratteri rossi</div>

class, a differenza di id, può contenere al suo interno più definizioni in qualsiasi sequenza!

Post correlati

jQuery: bordi rotondi sulle immagini per sovrapposizione

Giovedì 30 Ottobre, 2008

A causa dei diversi rendering tra i vari browser, che vedono sicuramente Microsoft Internet Explorer in testa, bisogna sempre ricorrere ad artifizi particolari per applicare effetti che, ormai, dovrebbero rappresentare uno standard. I pluri-discussi bordi arrotondati sono un classico esempio del "disastro" prodotto dalla completa incapacità di realizzare uno standard serio sul rendering delle pagine HTML/CSS. Esistono in rete numerosissime soluzioni che permettono di ottenere "effetti" (effetti che esonerano dall'HTML attuale come bordi arrotondati, effetti ombra, riflessioni, etc...) con patch sui fogli di stili, particolari trucchi con l'uso di div innestati, librerie Javascript, uso delle canvas, etc...
A titolo puramente didattico vorrei illustrare un'ulteriore tecnica (cross-browser) per applicare dei bordi arrotondati a delle immagini:

Demo e sorgenti

Continua a leggere... »

Post correlati

Wordpress: modifcare AdminBigWidth per gli sviluppatori

Venerdì 17 Ottobre, 2008

AdminBigWidth è un Plugin per Wordpress in grado di impostare l'area di lavoro dell'amministrazione a tutto schermo. È un plugin davvero semplice e banale, infatti il suo codice non fa altro che modificare la classe CSS .wrap:

PHP:
  1. function AdminBigWidth () {
  2.     echo '<style type="text/css">.wrap{max-width:none}</style>';
  3. }
  4. add_action('admin_head','AdminBigWidth');

Per chi come me usa l'editor di Wordpress in modalità HTML potrebbe risultare utile impostare dei caratteri a spaziatura fissa, come il Courier, invece del font proposto di default. In questo modo, almeno per gli sviluppatori, risulta più facile allineare codici sorgenti. Per fare questo basta aggiungere, sullo stile di AdminBigWidth, una nuova impostazione CSS che si rifletta sull'editor quando è in modalità HTML. Si potrebbe scrivere un Plugin (di due righe) per fare questo, tuttavia è meglio sfruttare proprio il codice di AdminBigWidth, così da evitare un ulteriore carico dovuto all'ennesimo Plugin:

PHP:
  1. function AdminBigWidth () {
  2.   echo '<style type="text/css">.wrap{max-width:none}#editorcontainer #content{font-family:"Courier New", Courier, monospace}</style>';
  3. }
  4. add_action('admin_head','AdminBigWidth');

Post correlati

L’arte di commentare: consigli utili

Martedì 29 Aprile, 2008

Se un "esempio" può valere più di mille parole, per un programmatore un "commento" può valere ore e ore di lavoro! Commentare il codice è spesso un'operazione noiosa e, nel momento della stesura del codice, sembra sempre un'attività inutile. Al contrario, soprattutto quando si riprendono vecchi codici, l'aver inserito i giusti commenti può risultare infinitamente utile per ricostruire percorsi mentali ormai dimenticati. Fortunatamente, per chi come me sviluppa sul Web, si ha l'enorme vatanggio di poter commentare quasi tutto il codice allo stesso modo! Il doppio slash (//) o il contenimento tramite slash asterisco e asterisco slash (/* e */) è supportato praticamente da tutti i lunguaggi di sviluppo di uso comune, derivati in pratica tutti dal C: Javascript, Actionscript, PHP, ...
Continua a leggere... »

Post correlati

Classi e ID nei CSS

Giovedì 7 Settembre, 2006

Ecco alcuni brevi consigli su come usare class e id nei fogli di stile. Tenete subito in considerazione che l'uso di tecniche Javascript avanzate, come lo stesso uso di motori Ajax, può entrare in conflitto con i consigli esposti qui! E vedremo alla fine il perchè.

Avendo a disposizione sia l'attributo class="" che l'attributo id="" per legare un TAG ad uno stile, spesso si rimane confusi e non si capisce quale sia la differenza o, comunque, la scelta migliore tra i due. In verità segnare un TAG tramite la classe o tramite l'id ai fini del CSS non cambia nulla, o quasi. Quello che cambia è il nostro modo di pensare alla pagina e di utilizzare in modo corretto id e classi senza ritrovarci poi a pentirci delle scelte fatte.

Una precisazione sull'ereditarietà

Prima di iniziare vorrei cogliere l'occasione per sottolineare un comportamento importante degli stili, ovvero il coscading o ereditarietà. In pratica un sottoelemento eredita le caratteristiche dell'elemento padre, a meno di non specificare esplicitamente che è !important. Vediamo un esempio che può chiarire meglio questa situzione. Immaginiamo di aver creato il seguente foglio di stile:

CSS:
  1. #a_box p {font-size:14px}
  2. #b_box p {font-size:22px}

e il seguente codice HTML:

HTML:
  1. <div id="a_box">
  2.    <p>Primo testo direttamente sotto a_box</p>
  3.    <div id="b_box">
  4.        <p>Secondo testo sotto b_box e a sua volto sotto a_box</p>
  5.    </div>
  6. </div>

Il risultato sul browser sarà effettivamente quello desiderato, il primo paragrafo sarà reso con il font 14 pixel e il secondo paragrafo con il font a 22 pixel! Proviamo ora ad usare class al posto di id:

CSS:
  1. #c_box p {font-size:14px}
  2. .d_box p {font-size:22px}

codice HTML:

HTML:
  1. <div id="c_box">
  2.    <p>Primo testo direttamente sotto c_box</p>
  3.    <div class="d_box">
  4.        <p>Secondo testo sotto d_box e a sua volto sotto c_box</p>
  5.    </div>
  6. </div>

Il risultato sul browser (provato su FireFox 1.5+ e su IE6), questa volta, sarà diverso! Cosa è accaduto? Il div con classe d_box ha ereditato il font-size del primo div con id c_box. Un id, quindi, obbliga le classi "figlie" ad ereditare i propri attributi (anche se questo non è valido per tutti gli stili). Per eliminare il problema bisogna indicare esplicitamente, con la keywork !important, il font-size nella classe d_box, come mostrato qui sotto:

CSS:
  1. #c_box p {font-size:14px}
  2. .d_box p {font-size:22px !important}

In questo modo imponiamo di prendere in considerazione il nuovo stile definito con la classe d_box.

Usando esclusivamente le classi:

CSS:
  1. .c_box p {font-size:14px}
  2. .d_box p {font-size:22px}

codice HTML:

HTML:
  1. <div class="c_box">
  2.    <p>Primo testo direttamente sotto c_box</p>
  3.    <div class="d_box">
  4.        <p>Secondo testo sotto d_box e a sua volto sotto c_box</p>
  5.    </div>
  6. </div>

Il risultato sul browser sarà quello iniziale, entrambi i paragrafi saranno resi correttamente. Morale: massima attenzione quindi quando si usano gli stile in cascading... se è vero che non c'è una immediata differenza tra classi e id è anche vero che il loro uso non è del tutto identico. Altrimenti perchè esisterebbero due modi di indirizzamento?

Regola

Tuttavia esiste un modo per sapere chi "vince" quando si imposta uno stile. Questa tecnica viene normalmente chiamata Cascade Rule 3.
Si fornisce un valore ad ogni selettori, o riga dichiarativa CSS. Questo valore ha la forma A-B-C.

1) Addizionare 1 ad A per ogni id nel selettore
2) Addizionare 1 ad B per ogni class nel selettore
3) Addizionare 1 ad C per ogni TAG nel selettore

Vediamo un esempio:

CSS:
  1. 0-0-1 = 1       -[ p {color:red}
  2. 0-1-1 = 11      -[ p.largetext
  3. 1-0-1 = 101    -[ p#largetext
  4. 1-0-2 = 102    -[ body p#largetext
  5. 1-1-3 = 113    -[ body p#largetext ul.mylist
  6. 1-1-4 = 114    -[ body p#largetext ul.mylist li

Il valore più alto vince. Nel caso due regole hanno lo stesso peso, vince l'ultima definita.

Consigli

Una strada potrebbe essere questa: usare la classe quando il comportamento visivo di un TAG può variare a seconda del suo contenitore madre. Usare id quando il comportamente visivo è univoco, cioè prescinde dal suo contenitore madre.

Un esempio chiarificatore di questo approccio potrebbe essere il seguente: il comportamento di un ipotetico titolo. In questo caso useremo la class="title" e in base al contenitore superiore regolare i vari comportamenti. Il file CSS potrebbe essere:

HTML:
  1. <div id="codice"><code>.title { ...... }
  2. </code><code>#listProducts .title { ........ }
  3. #listUsers .title { ....... }</code></div>

Nella realtà, addirittura, le cose sono anche meglio visto che abbiamo i TAG Hn che ci aiutano. In un caso reale la classe title sarebbe inutile. In pratica la tecnica è quella di usare gli id come selettori di comportamento (infatti vengono spesso indicati come id-selector). Una situazione reale potrebbe essere quindi:

HTML:
  1. <div id="codice"><code>h1 { ...... }
  2. </code><code>#listProducts h1 { ........ }
  3. #listUsers h1 { ....... }</code></div>

Abbiamo dunque tre comportamenti diversi in base al selettore. La regola principale potrebbe essere la seguente: se questo TAG si comporterà visivamente in modo diverso a seconda del contenitore usare class!

In questa casistica, tra l'altro, rientrano molti elementi del layout visivo come ad esempio le liste ul. Queste si possono comportare in modo diverso a seconda del contenitore madre: possono avere un aspetto nella barra di navigazione, un altro nella pagina principale, un altro ancora nella barra laterale, ecc... Tuttavia quello che ci serve, nella maggioranza dei casi, è il solo selettore id, utilizzando al meglio i TAG standard messi a disposizione dell'HTML.

Per esempio è buona regola usare le liste ul o ol quando si può, i TAG titolo Hn, i TAG strong, acronym, code, insomma limitare div e span altrimenti rendiamo inutile l'uso degli stili, inondando inoltre la rete con bit supeflui. Spesso, infatti, non si conoscono nemmeno tutti i TAG HTML. Alcuni Web Designer sembrano ignorare alcuni dei più utili TAG presenti nell'attuale standard HTML. Certo alcuni TAG (come anche alcuni attributi, eventi, stili e, ahimè, altre varie cosine...) sono confinati nello standard di qualche specifico browser, ma ci sono molti TAG pienamente supportati da praticamente tutti i browser esistenti (Safari compreso - apropos ma Apple ha forse dimenticato di aver sviluppato un suo browser?!).

I fogli di stile, ancora ahimè, sono anch'essi soggetti a qualche incomprensione sparsa quà e là. Ai Web Designer non resta che pazientare sperando in un futuro più standard e meno variabile. Utilizzare gli id come selettori, quindi, non può esimersi dall'essere anch'esso coinvolto in un effetto collaterale legato all'uso di Javascript. Tramite il linguaggio lato client più diffuso, se attivato nel browser, è possibile ottenere un puntatore ad uno specifico TAG o elemento della pagina. Questo oggi viene risolto con estrema facilità (un pò di tempo fa era leggermente più complesso, a causa delle sempre presenti incompatibilità tra browser!) tramite il metodo getElementByID() messo a disposizione dall'oggetto document.

Come si evince dallo stesso nome del metodo, getElementByID() recupera il puntatore in base all'id dell'elemento. Il problema che ha a che fare con i fogli di stile risiede nel fatto che l'id in questione è proprio lo stesso utilizzato da getElementByID() per rintracciare l'elemento. Quindi immaginiamo di dover scrivere una Web Application che gestisce una serie di post-it a video, caso mai con il position:absolute attivato. Questo significa che di post-it sulla pagina ne potrei avere un numero imprecisato di n. Il Web Designer che vuole scrivere il foglio di stile per quest'oggetto, seguendo la nostra regola precedente sceglierebbe di usare un div contenitore e assegnargli un id="postIt". In questo modo seguirebbe la nostra regola in quando un post-it non si comporta per se stesso in modo visivamente differente a seconda del contenitore madre. Nella nostra specifica esso è un'oggetto unico e quindi è corretto associargli un'id. I guai arrivano quando il programmatore Javascript (i personaggi di questa ministoria sono 2 diversi ma la questione sarebbe ugualmente imbarazzante anche per un'unico sviluppatore...) tenta di ottenere un puntatore ad uno specifico post-it! Esso si accorge presto che non può usare l'ID come discriminatore in quanto se sulla pagina esistono più elementi con lo stesso ID allora getElementByID() non può restituire un'unico puntatore, al limite può restituire un elenco (array), una lista di elementi che si chiamano tutti allo stesso modo.

Questa lunga e noiosa discussione porta con se una nota conseguenza. Nello sviluppo HTML/Javascript/CSS e in particolare nei fogli di stili, molto dipende dalla visione generale. Non esiste davvero una regola valida per qualsiasi soluzione. Saper vedere il progetto nella sua completezza può aiutare di più delle regole prefissate.

Post correlati