javascript - jQuery:在 jQuery 中獲取隱藏元素的高度
我需要獲取一個位於被隱藏的 div 內的元素的高度。現在的做法是先顯示該 div,獲取高度,然後再隱藏父 div。這似乎有點愚蠢。有沒有更好的方法?
我正在使用 jQuery 1.4.2:
$select.show();
optionHeight = $firstOption.height(); //we can only get height if its visible
$select.hide();
答案#1
你可以這樣做,有點不正規,如果已經是絕對定位的話,忘掉 position:
var previousCss = $("#myDiv").attr("style");
$("#myDiv").css({
position: 'absolute', // Optional if #myDiv is already absolute
visibility: 'hidden',
display: 'block'
});
optionHeight = $("#myDiv").height();
$("#myDiv").attr("style", previousCss ? previousCss : "");
答案#2
我在獲取隱藏元素寬度時遇到了同樣的問題,所以我寫了這個名為 jQuery Actual 的插件來解決它。不是使用
$('#some-element').height();
使用
$('#some-element').actual('height');
將為您提供隱藏元素或具有隱藏父元素的元素的正確值。
完整的文件請參見此處。頁面中也包含了一個示範。
希望這對你有幫助 :)
答案#3
你把兩種 CSS 樣式混淆了,分別是 display 樣式和 visibility 樣式。
如果元素是通過設置 visibility CSS 樣式被隱藏的,那麼你應該能夠獲取其高度,無論元素是否可見,因為元素仍然佔據頁面空間。
如果通過將 display CSS 樣式更改為 "none" 隱藏元素,那麼該元素不會佔據頁面空間,你必須給它一個 display 樣式,使元素在某個空間中呈現,此時你才能獲取其高度。
答案#4
我其實有時會訴諸一些小伎倆來應對這個問題。我開發了一個 jQuery 捲軸元件,遇到的問題是我事先不知道可捲動的內容是否屬於隱藏的標記部分。這是我所做的:
// try to grab the height of the elem
if (this.element.height() > 0) {
var scroller_height = this.element.height();
var scroller_width = this.element.width();
// if height is zero, then we're dealing with a hidden element
} else {
var copied_elem = this.element.clone()
.attr("id", false)
.css({visibility:"hidden", display:"block",
position:"absolute"});
$("body").append(copied_elem);
var scroller_height = copied_elem.height();
var scroller_width = copied_elem.width();
copied_elem.remove();
}
這在大多數情況下都有效,但有一個明顯的問題可能會出現。如果你要克隆的內容使用的 CSS 樣式規則中包含對父標記的引用,克隆出的內容將不會包含適當的樣式,並且可能會有略微不同的尺寸。為了解決這個問題,你可以確保被克隆的標記應用了不包含對父標記引用的 CSS 規則。
另外,這對我的滾動小工具沒有發生過,但為了獲得克隆元素的適當高度,你需要將寬度設置為與父元素相同。在我的情況下,實際元素總是應用了一個 CSS 寬度,所以我不需要擔心這個問題;然而,如果元素沒有應用寬度,你可能需要對元素的 DOM 祖先進行某種遞歸遍歷,以找到適當的父元素寬度。
答案#5
在用戶 Nick 的回答和用戶 hitautodestruct 在 JSBin 上的插件的基礎上,我創建了一個類似的 jQuery 插件,它可以獲取寬度和高度,並返回一個包含這些值的對象。
可以在這裡找到:http://jsbin.com/ikogez/3/
更新
我已經完全重新設計了這個小插件,因為事實證明,之前的版本(如上所述)在實際環境中進行大量 DOM 操作時並不真的可用。
這運作得非常完美:
/**
* getSize plugin
* This plugin can be used to get the width and height from hidden elements in the DOM.
* It can be used on a jQuery element and will retun an object containing the width
* and height of that element.
*
* Discussed at StackOverflow:
* http://stackoverflow.com/a/8839261/1146033
*
* @author Robin van Baalen <[email >
* @version 1.1
*
* CHANGELOG
* 1.0 - Initial release
* 1.1 - Completely revamped internal logic to be compatible with javascript-intense environments
*
* @return {object} The returned object is a native javascript object
* (not jQuery, and therefore not chainable!!) that
* contains the width and height of the given element.
*/
$.fn.getSize = function() {
var $wrap = $("<div />").appendTo($("body"));
$wrap.css({
"position": "absolute !important",
"visibility": "hidden !important",
"display": "block !important"
});
$clone = $(this).clone().appendTo($wrap);
sizes = {
"width": $clone.width(),
"height": $clone.height()
};
$wrap.remove();
return sizes;
};
答案#6
在尼克的回答基礎上進一步建構:
$("#myDiv").css({'position':'absolute','visibility':'hidden', 'display':'block'});
optionHeight = $("#myDiv").height();
$("#myDiv").css({'position':'static','visibility':'visible', 'display':'none'});
我發現這樣做比較好:
$("#myDiv").css({'position':'absolute','visibility':'hidden', 'display':'block'});
optionHeight = $("#myDiv").height();
$("#myDiv").removeAttr('style');
設定 CSS 屬性會將它們內嵌,這會覆蓋你在 CSS 文件中設定的任何其他屬性。通過移除 HTML 元素上的 style 屬性,一切都會回到正常狀態並仍然隱藏,因為它一開始就是隱藏的。
