Comment trouvez-vous les dimensions d'un élément "affichage: aucun"?

J'ai des éléments enfants à l'intérieur d'un div qui obtient l' display: none CSS display: none appliqué et je veux savoir quelles sont les dimensions des éléments enfants. Comment puis-je faire ceci?

Fiddle Demo

 var o = document.getElementById('output'); var wmd1 = document.getElementById('whats-my-dims1'); var wmd2 = document.getElementById('whats-my-dims2'); o.innerHTML = 'wmd1: "' + wmd1.clientWidth + '", "' + wmd1.clientHeight + '", wmd2: "' + wmd2.clientWidth + '", "' + wmd2.clientHeight + '"'; 
 #some-hidden-div{ display: none; } .whats-my-dims{ width: 69px; height: 42px; background-color: #f00; } 
 <div id='output'>Processing... :p</div> <div id='some-hidden-div'> <div class='whats-my-dims' id='whats-my-dims1'></div> </div> <div class='whats-my-dims' id='whats-my-dims2'></div> 

Je peux seulement utiliser JavaScript pur (pas jQuery).

Je ne peux pas changer top / left / right / bottom / transform / translate / etc car cela fera partie d'un composant personnalisé de la feuille de sprite animé qui peut avoir des éléments enfants.

Utilisez window.getComputedStyle()

 var o = document.getElementById('output'); var wmd1 = document.getElementById('whats-my-dims1'); var wmd2 = document.getElementById('whats-my-dims2'); o.innerHTML = 'wmd1: "' + window.getComputedStyle(wmd1).getPropertyValue("width") + '", "' + window.getComputedStyle(wmd1).getPropertyValue("height") + '", wmd2: "' + window.getComputedStyle(wmd2).getPropertyValue("width") + '", "' + window.getComputedStyle(wmd2).getPropertyValue("height") + '"'; 
 #some-hidden-div{ display: none; } .whats-my-dims{ display:block; width: 69px; height: 42px; background-color: #f00; } 
 <div id='output'> Processing... :p </div> <div> Sooo... How do I get the width and height of whats-my-dims1? </div> <div id='some-hidden-div'> <div class='whats-my-dims' id='whats-my-dims1'></div> </div> <div class='whats-my-dims' id='whats-my-dims2'></div> 

Vous ne trouvez pas les dimensions d'un élément avec l' display: none mais vous pouvez activer l'affichage, obtenir les dimensions et les remettre à caché. Cela n'entraînerait aucune différence visuelle.

 var o = document.getElementById('output'); var wmd1 = document.getElementById('whats-my-dims1'); var someHiddenDiv = document.querySelector('#some-hidden-div'); someHiddenDiv.style.display = 'block'; var wmd2 = document.getElementById('whats-my-dims2'); o.innerHTML = 'wmd1: "' + wmd1.clientWidth + '", "' + wmd1.clientHeight + '", wmd2: "' + wmd2.clientWidth + '", "' + wmd2.clientHeight + '"'; someHiddenDiv.style.display = 'none'; 
 #some-hidden-div { display: none; } .whats-my-dims { width: 75px; height: 42px; background-color: #f00; } 
 <div id='output'> Processing... :p </div> <div> Sooo... How do I get the width and height of whats-my-dims1? </div> <div id='some-hidden-div'> <div class='whats-my-dims' id='whats-my-dims1'></div> </div> <div class='whats-my-dims' id='whats-my-dims2'></div> 

Vous ne pouvez pas obtenir les dimensions d'un élément avec l' display: none , car car il est caché, il ne prend aucun espace, donc il n'a aucune dimension. La même chose s'applique à ses enfants.

Vous pouvez plutôt rendre l'élément visible pendant un certain temps, vérifier les dimensions de l'enfant et rendre l'élément invisible. Comme indiqué par @JanDvorak:

Les navigateurs ne repoussent pas lorsque le Javascript synchrone est en cours d'exécution, de sorte que l'élément ne doit jamais apparaître à l'écran.

Exemple de code:

 var o = document.getElementById('output'); var wmd1 = document.getElementById('whats-my-dims1'); var wmd2 = document.getElementById('whats-my-dims2'); var hiddenDiv = document.getElementById("some-hidden-div"); hiddenDiv.style.display = "block"; o.innerHTML = 'wmd1: "' + wmd1.clientWidth + '", "' + wmd1.clientHeight + '", wmd2: "' + wmd2.clientWidth + '", "' + wmd2.clientHeight + '"'; hiddenDiv.style.display = ""; 

Voir démo sur JS Fiddle .

Vous pouvez ajouter ceci:

 var wmd1Style = window.getComputedStyle(wmd1); o.innerHTML = 'wmd1: "' + parseInt(wmd1Style['width'], 10) + '", "' + parseInt(wmd1Style['height'], 10) + '", wmd2: "' + wmd2.clientWidth + '", "' + wmd2.clientHeight + '"';