La Funzione getComputedStyle

La funzione getComputedStyle permette di ottenere il valore di qualsiasi proprietà CSS di un elemento, anche dal file CSS.

Sintassi

javascriptlet oggetto = getComputedStyle(elemento);

Dettagli

Come funziona (attenzione: non come ci aspettiamo): come parametro la funzione accetta un elemento, e restituisce un oggetto, che contiene tutte le proprietà CSS dell'elemento passato. Mettiamo questo oggetto in una variabile style. Il nome è arbitrario, è semplicemente una variabile - come la chiamiamo, così ci riferiremo ad essa:

javascriptlet elem = document.querySelector('#elem');
let style = getComputedStyle(elem); // in style ci sono le proprietà CSS

Visualizziamo, ad esempio, la larghezza. Si fa così - style.width:

javascriptlet elem = document.querySelector('#elem');

let style = getComputedStyle(elem);
console.log(style.width);

Per visualizzare, ad esempio, il padding sinistro - facciamo così - style.paddingLeft:

javascriptlet elem = document.querySelector('#elem');

let style = getComputedStyle(elem);
console.log(style.paddingLeft);

Nel prossimo esempio visualizzeremo tutte le proprietà CSS che ci interessano per il nostro elemento:

html<div id="elem">text</div>
css#elem {
  width: 200px;
  height: 200px;
  padding: 30px;
  border: 20px solid #BCBCBC;
  overflow: auto;
}
javascriptlet elem = document.querySelector('#elem');

let style = getComputedStyle(elem);
console.log('paddingLeft: ' + style.paddingLeft); // visualizzerà '30px'
console.log('borderTopWidth: ' + style.borderTopWidth); // visualizzerà '20px'
console.log('borderTopStyle: ' + style.borderTopStyle); // visualizzerà 'solid'

Imprecisione di getComputedStyle

A volte la funzione getComputedStyle funziona non del tutto correttamente con larghezza e altezza. Ciò è dovuto al fatto che padding e bordo espandono il blocco. Nel prossimo esempio al blocco è stata assegnata una larghezza di 200px, così come un bordo e border. La larghezza reale del blocco è 300px, ma getComputedStyle visualizzerà comunque 200px:

html<div id="elem">text</div>
css#elem {
  width: 200px;
  height: 200px;
  padding: 30px;
  border: 20px solid #BCBCBC;
  overflow: auto;
}
javascriptlet elem = document.querySelector('#elem');

let style = getComputedStyle(elem);
console.log('width: ' + style.width); // visualizzerà '200px'
console.log('height: ' + style.height); // visualizzerà '200px'

Ovvero: risulta che getComputedStyle ignora l'espansione del blocco e mostra le sue dimensioni come se questa espansione non ci fosse. Ma non è tutto: ha importanza anche la presenza o assenza della barra di scorrimento - alcuni browser sottraggono la larghezza della barra di scorrimento dalla larghezza calcolata tramite getComputedStyle, mentre altri non la sottraggono. In breve, qui in generale tutto non è cross-browser ed è meglio non usare getComputedStyle per determinare larghezza e altezza, ma usare le metriche, che studieremo un po' più avanti.

Valori Calcolati

C'è un'altra sfumatura: se la larghezza è impostata in % - dopo il lavoro di getComputedStyle la vedremo in px. Ovvero in sostanza non otteniamo la larghezza impostata, ma quella calcolata. Guardate il prossimo esempio:

html<div id="elem">text</div>
css#elem {
  width: 30%; /* larghezza impostata in % */
  height: 200px;
  padding: 30px;
  border: 20px solid #BCBCBC;
  overflow: auto;
}
javascriptlet elem = document.querySelector('#elem');

let style = getComputedStyle(elem);
console.log('width: ' + style.width); // visualizzerà la larghezza in px

Vedi Anche

  • la proprietà cssText,
    che imposta massivamente gli stili CSS