In MDN's description of Element.clientWidth dice.clientWidth e clientHeight report zero mentre getBoundingClientRect è corretto
Nota: allora ho aggiornato MDN in base alle @potatopeelings risposta.
La proprietà Element.clientWidth è la larghezza interna di un elemento in pixel. Include padding ma non la barra di scorrimento verticale (se presente, se renderizzata), bordo o margine.
Questa proprietà arrotonda il valore a un numero intero. Se hai bisogno di un valore frazionale, usa element.getBoundingClientRect().
Da questo ho capito che oltre arrotondamento clientWidth
dovrebbe essere lo stesso di getBoundingClientRect().width
.
Tuttavia vedo che per molti elementi (dove display
è inline
?) Il clientWidth
(e altezza) sono pari a zero, mentre i valori restituiti da getBoundingClientRect
sembrano corrette.
La ricerca su stackoverflow porta alcune risposte dicendo che questo accade prima che il documento sia in uno stato pronto ma lo vedo sempre, non solo quando la pagina si sta caricando.
Questo comportamento è coerente per tutti i browser che ho controllato, dove è specificato che questo dovrebbe essere il comportamento?
Esempio:
function str(name, width, height) {
return name + ': (' + width + ', ' + height + ')';
}
function test() {
var s = document.getElementById('s');
var rect = s.getBoundingClientRect();
document.getElementById('out').innerHTML =
str('client', s.clientWidth, s.clientHeight) + '<br/>' +
str('bounding', rect.width, rect.height);
}
<span id="s">A span</span><br/> <button onclick="test()">Test</button>
<hr />
<div id="out"></div>
Questo è tutto! Hai idea del perché questo sia? – Motti
Credo che sia stato così nelle specifiche da un po 'di tempo - il primo riferimento che ho trovato è https://lists.w3.org/Archives/Public/www-style/2008Mar/0060.html (dal 2008), ma sono abbastanza sicuro che ci sarebbero riferimenti più vecchi e anche riferimenti più vecchi se si è passati al browser specifico. – potatopeelings
Grazie, ho aggiornato MDN. – Motti