Updated on 7/13/2008.
The following are two similiar functions you may find useful. When called on an element, they can return (in pixels) either:
The functions work on any(?) block element, regardless of whether or not it has a predefined width/height. They have been successfully tested in Windows versions of Internet Explorer 6 - 7, Firefox 1.5 - 3, Opera 9 and Safari 3.
Below this function is a small demo and here you can find the test page (with an additional dynamic style change test).
getWidth(), getHeight()://///////////////////////////////////////////////////////////////////////////////////////////////// // USED FOR GETTING THE COMPUTED WIDTH OF AN ELEMENT IN PIXELS /////////////////////////////////////////////////////////////////////////////////////////////////// var getWidth = function (/* Object */ el, /* boolean */ includePadding, /* boolean */ includeBorder) { var width; el = (typeof(el) === "string") ? document.getElementById(el) : el; if (window.getComputedStyle) { /* FF, Safari, Opera */ var style = document.defaultView.getComputedStyle(el, null); if (style.getPropertyValue("display") === "none") return 0; width = parseInt(style.getPropertyValue("width")); if (window.opera && !document.getElementsByClassName) { /* Opera 9.25 includes the padding and border when reporting the width/height - subtract that out */ width -= parseInt(style.getPropertyValue("padding-left")); width -= parseInt(style.getPropertyValue("padding-right")); width -= parseInt(style.getPropertyValue("border-left-width")); width -= parseInt(style.getPropertyValue("border-right-width")); } if (includePadding) { width += parseInt(style.getPropertyValue("padding-left")); width += parseInt(style.getPropertyValue("padding-right")); } if (includeBorder) { width += parseInt(style.getPropertyValue("border-left-width")); width += parseInt(style.getPropertyValue("border-right-width")); } } else { /* IE */ if (el.currentStyle["display"] === "none") return 0; var bRegex = /thin|medium|thick/; /* Regex for css border width keywords */ width = el.offsetWidth; /* Currently the width including padding + border */ if (!includeBorder) { var borderLeftCSS = el.currentStyle["borderLeftWidth"]; var borderRightCSS = el.currentStyle["borderRightWidth"]; var temp = document.createElement("DIV"); if (el.offsetWidth > el.clientWidth && el.currentStyle["borderLeftStyle"] !== "none") { if (!bRegex.test(borderLeftCSS)) { temp.style.width = borderLeftCSS; el.parentNode.appendChild(temp); width -= temp.offsetWidth; el.parentNode.removeChild(temp); } else if (bRegex.test(borderLeftCSS)) { temp.style.width = "10px"; temp.style.border = borderLeftCSS + " " + el.currentStyle["borderLeftStyle"] + " #000000"; el.parentNode.appendChild(temp); width -= Math.round((temp.offsetWidth-10)/2); el.parentNode.removeChild(temp); } } if (el.offsetWidth > el.clientWidth && el.currentStyle["borderRightStyle"] !== "none") { if (!bRegex.test(borderRightCSS)) { temp.style.width = borderRightCSS; el.parentNode.appendChild(temp); width -= temp.offsetWidth; el.parentNode.removeChild(temp); } else if (bRegex.test(borderRightCSS)) { temp.style.width = "10px"; temp.style.border = borderRightCSS + " " + el.currentStyle["borderRightStyle"] + " #000000"; el.parentNode.appendChild(temp); width -= Math.round((temp.offsetWidth-10)/2); el.parentNode.removeChild(temp); } } } if (!includePadding) { var paddingLeftCSS = el.currentStyle["paddingLeft"]; var paddingRightCSS = el.currentStyle["paddingRight"]; var temp = document.createElement("DIV"); temp.style.width = paddingLeftCSS; el.parentNode.appendChild(temp); width -= temp.offsetWidth; temp.style.width = paddingRightCSS; width -= temp.offsetWidth; el.parentNode.removeChild(temp); } } return width; }; /////////////////////////////////////////////////////////////////////////////////////////////////// // USED FOR GETTING THE COMPUTED HEIGHT OF AN ELEMENT IN PIXELS /////////////////////////////////////////////////////////////////////////////////////////////////// var getHeight = function (/* Object */ el, /* boolean */ includePadding, /* boolean */ includeBorder) { var height; el = (typeof(el) === "string") ? document.getElementById(el) : el; if (window.getComputedStyle) { /* FF, Safari, Opera */ var style = document.defaultView.getComputedStyle(el, null); if (style.getPropertyValue("display") === "none") return 0; height = parseInt(style.getPropertyValue("height")); if (window.opera && !document.getElementsByClassName) { /* Opera 9.25 includes the padding and border when reporting the width/height - subtract that out */ height -= parseInt(style.getPropertyValue("padding-top")); height -= parseInt(style.getPropertyValue("padding-bottom")); height -= parseInt(style.getPropertyValue("border-top-width")); height -= parseInt(style.getPropertyValue("border-bottom-width")); } if (includePadding) { height += parseInt(style.getPropertyValue("padding-top")); height += parseInt(style.getPropertyValue("padding-bottom")); } if (includeBorder) { height += parseInt(style.getPropertyValue("border-top-width")); height += parseInt(style.getPropertyValue("border-bottom-width")); } } else { /* IE */ if (el.currentStyle["display"] === "none") return 0; var bRegex = /thin|medium|thick/; /* Regex for css border width keywords */ height = el.offsetHeight; /* Currently the height including padding + border */ if (!includeBorder) { var borderTopCSS = el.currentStyle["borderTopWidth"]; var borderBottomCSS = el.currentStyle["borderBottomWidth"]; var temp = document.createElement("DIV"); if (el.offsetHeight > el.clientHeight && el.currentStyle["borderTopStyle"] !== "none") { if (!bRegex.test(borderTopCSS)) { temp.style.width = borderTopCSS; el.parentNode.appendChild(temp); height -= temp.offsetWidth; el.parentNode.removeChild(temp); } else if (bRegex.test(borderTopCSS)) { temp.style.width = "10px"; temp.style.border = borderTopCSS + " " + el.currentStyle["borderTopStyle"] + " #000000"; el.parentNode.appendChild(temp); height -= Math.round((temp.offsetWidth-10)/2); el.parentNode.removeChild(temp); } } if (el.offsetHeight > el.clientHeight && el.currentStyle["borderBottomStyle"] !== "none") { if (!bRegex.test(borderBottomCSS)) { temp.style.width = borderBottomCSS; el.parentNode.appendChild(temp); height -= temp.offsetWidth; el.parentNode.removeChild(temp); } else if (bRegex.test(borderBottomCSS)) { temp.style.width = "10px"; temp.style.border = borderBottomCSS + " " + el.currentStyle["borderBottomStyle"] + " #000000"; el.parentNode.appendChild(temp); height -= Math.round((temp.offsetWidth-10)/2); el.parentNode.removeChild(temp); } } } if (!includePadding) { var paddingTopCSS = el.currentStyle["paddingTop"]; var paddingBottomCSS = el.currentStyle["paddingBottom"]; var temp = document.createElement("DIV"); temp.style.width = paddingTopCSS; el.parentNode.appendChild(temp); height -= temp.offsetWidth; temp.style.width = paddingBottomCSS; height -= temp.offsetWidth; el.parentNode.removeChild(temp); } } return height; };
I'm going to work again on these functions to make them smaller/faster, however in the meantime if anyone sees anything blatant or has a good idea please do comment. Oh and any bugs you find please let me know too ; ) Thanks!
Comments