javascript隠し要素の高さと幅を取得する方法
4391 ワード
jsは可視元素のサイズを取得するのに便利です.これは直接にこの方法を使うことができます.
幸いcssにはvisibility:hiddenがあります.属性は見えません.彼とdisplay:noneの最大の違いはvisibility:hiddenは物理サイズがあります.物理サイズがあれば上記の方法でサイズを取得できますが、display:noneをvisibility:hiddenに変更したらページに空きがあります.サイズを取ったらすぐにvisibility:hiddenをdisplay:noneページに変更しても、その部分はぶれます.一番いい方法は、この隠れた要素をスクリーンから移動するか、またはドキュメントフローから離れることです.このように非常に完璧なようですが、悲劇がまた発生しました.もしこの元素をもう一度表示するなら、この元素は見えないです.位置も違います.これはこの元素のvisibility:hiddenです.position:absolute.サイズを取ったら元に戻します.positionとvisibility属性を元のスタイルに戻すということです.
これはjsが元素のサイズを隠して基本的な実現方法を獲得して、みんなは《javascriptに精通します》のこの本の上の方法を見ることができる興味があります.
私も簡単なデモをしました.ソースコードを見てもいいです.
function getDefaultStyle(obj,attribute){ // , IE DOM, : 、
return obj.currentStyle?obj.currentStyle[attribute]:document.defaultView.getComputedStyle(obj,false)[attribute];
}
しかし、この要素が隠れていたら、サイズは未知適応です.上の方法があったらだめです.display:noneの元素は物理サイズがないからです.悲劇はこのように発生しました!幸いcssにはvisibility:hiddenがあります.属性は見えません.彼とdisplay:noneの最大の違いはvisibility:hiddenは物理サイズがあります.物理サイズがあれば上記の方法でサイズを取得できますが、display:noneをvisibility:hiddenに変更したらページに空きがあります.サイズを取ったらすぐにvisibility:hiddenをdisplay:noneページに変更しても、その部分はぶれます.一番いい方法は、この隠れた要素をスクリーンから移動するか、またはドキュメントフローから離れることです.このように非常に完璧なようですが、悲劇がまた発生しました.もしこの元素をもう一度表示するなら、この元素は見えないです.位置も違います.これはこの元素のvisibility:hiddenです.position:absolute.サイズを取ったら元に戻します.positionとvisibility属性を元のスタイルに戻すということです.
これはjsが元素のサイズを隠して基本的な実現方法を獲得して、みんなは《javascriptに精通します》のこの本の上の方法を見ることができる興味があります.
私も簡単なデモをしました.ソースコードを見てもいいです.
js
<br> // <br> function getType(o){<br> var _t;<br> return ((_t = typeof(o)) == "object" ? o==null && "null" || Object.prototype.toString.call(o).slice(8,-1):_t).toLowerCase();<br> }<br> // <br> function getStyle(el, styleName) {<br> return el.style[styleName] ? el.style[styleName] : el.currentStyle ? el.currentStyle[styleName] : window.getComputedStyle(el, null)[styleName];<br> }<br> function getStyleNum(el, styleName) {<br> return parseInt(getStyle(el, styleName).replace(/px|pt|em/ig,''));<br> }<br> function setStyle(el, obj){<br> if (getType(obj) == "object") {<br> for (s in obj) {<br> var cssArrt = s.split("-");<br> for (var i = 1; i < cssArrt.length; i++) {<br> cssArrt[i] = cssArrt[i].replace(cssArrt[i].charAt(0), cssArrt[i].charAt(0).toUpperCase());<br> }<br> var cssArrtnew = cssArrt.join("");<br> el.style[cssArrtnew] = obj[s];<br> }<br> }<br> else <br> if (getType(obj) == "string") {<br> el.style.cssText = obj;<br> }<br> }<br> function getSize(el) {<br> if (getStyle(el, "display") != "none") {<br> return { width: el.offsetWidth || getStyleNum(el, "width"), height: el.offsetHeight || getStyleNum(el, "height") };<br> }<br> var _addCss = { display: "", position: "absolute", visibility: 'hidden' };<br> var _oldCss = {};<br> for (i in _addCss) {<br> _oldCss[i] = getStyle(el, i);<br> }<br> setStyle(el, _addCss);<br> var _width = el.clientWidth || getStyleNum(el, "width");<br> var _height = el.clientHeight || getStyleNum(el, "height");<br> for (i in _oldCss) {<br> setStyle(el, _oldCss);<br> }<br> return { width: _width, height: _height };<br> } <br>var dd=document.getElementById("test_display_block"); <br>alert(getSize(dd).height); <br>document.getElementById("test_display_click").onclick=function(){<br> dd.style.display="block";<br> document.getElementById("test_display_none").style.display="block";<br>}<br>alert($("#test_display_none").height());<br>
余談:一般的なjsのフレームワークは、jQなどのライブラリに封入されています.私たちは直接にheight()とwidth()の方法を使って、隠し要素のサイズを取得することができます.