2012-11-17 16 views
26

Come si ottiene l'altezza interna di un elemento, senza padding e bordi?Come ottenere l'altezza interna di un elemento

No jQuery, solo pura JS, e una soluzione cross-browser (IE7 inclusi)

enter image description here

+1

Perché non utilizzare 'border-box' in css? In questo modo non devi preoccuparti di queste cose ... Quindi puoi usare "offsetHeight" che restituirà l'altezza corretta senza il margine. – elclanrs

+0

questa è una domanda molto specifica per un plugin che faccio senza controllo CSS, devo solo lavorare con quello che ho ottenuto – vsync

+0

Quindi ... Immagino che tu possa ancora impostare il 'dimensionamento della scatola: border-box', Ti farò risparmiare tempo e mal di testa. – elclanrs

risposta

30
var style = window.getComputedStyle(document.getElementById("Example"), null); 
style.getPropertyValue("height"); 

La versione sopra funzionerà nei browser moderni. Si prega di controllare currentStyle per i browser IE.

+5

intendi: 'parseInt (style.getPropertyValue ('height'));' – vsync

+4

Internet Explorer restituirà "auto" se non c'è altezza nel css http://jsfiddle.net/Kxsvx/ in modo da non avere l'altezza di esso! – Mic

+0

@Mic quale Internet Explorer? – Fresheyeball

0

EDIT dai commenti:

http://jsfiddle.net/hTGCE/1/ (un po 'più di codice del previsto)

in internet a trovare le funzioni in questo modo:

function getRectangle(obj) { 

      var r = { top: 0, left: 0, width: 0, height: 0 }; 

      if(!obj) 
      return r; 

      else if(typeof obj == "string") 
      obj = document.getElementById(obj); 


      if(typeof obj != "object") 
      return r; 

      if(typeof obj.offsetTop != "undefined") { 

      r.height = parseInt(obj.offsetHeight); 
      r.width = parseInt(obj.offsetWidth); 
      r.left = r.top = 0; 

      while(obj && obj.tagName != "BODY") { 

       r.top += parseInt(obj.offsetTop); 
       r.left += parseInt(obj.offsetLeft); 

       obj = obj.offsetParent; 
      } 
      } 
      return r; 
     } 

se si vuole sottrarre il padding/bordo -width è impostato nel file css e non dinamico nell'attributo style:

var elem = document.getElementById(id); 
    var borderWidth = 0; 

      try { 
      borderWidth = getComputedStyle(elem).getPropertyValue('border-top-width'); 

      } catch(e) { 

      borderWidth = elem.currentStyle.borderWidth; 
      } 
    borderWidth = parseInt(borderWidth.replace("px", ""), 10); 

e con l'imbottitura uguale. quindi lo calcoli.

+1

in internet è possibile trovare tutti i tipi di codice della spazzatura. Voglio LA RISPOSTA ULTIMA per questo mistero, non un codice lento, gonfiato ... ma grazie per la risposta :) – vsync

+0

se hai un'altezza dinamica senza un attributo css "altezza" per un elemento il metodo con "getComputedStyle" non sarà lavoro. O mi sbaglio? – Mic

+0

funziona, l'ho appena provato – vsync

0

Ho avuto lo stesso problema e scoperto non esiste una soluzione nativa plattform croce, ma la soluzione è facile però

var actual_h = element.offsetHeight; 

      if(parseInt(element.style.paddingTop.replace('px','')) > 0){ 
       actual_h=actual_h - parseInt(element.style.paddingTop.replace('px','')); 

      } 
      if(parseInt(element.style.paddingBottom.replace('px','')) > 0){ 
       actual_h=actual_h - parseInt(element.style.paddingBottom.replace('px','')); 

      } 
+1

Tieni presente che, come MDN [afferma] (https: //developer.mozilla. org/it-it/docs/Web/API/HTMLElement/style # Getting_style_information), "La proprietà' style' non è utile per conoscere lo stile dell'elemento in generale, dal momento che rappresenta solo le dichiarazioni CSS impostate nell'elemento inline ' attributo style' [...] ". Il dimensionamento della casella – Spooky

+0

non funziona in IE7 – Chandrakant

Problemi correlati