這是我用過的一個技巧。它涉及到添加一些CSS屬性,使jQuery認爲該元素是可見的,但實際上它仍然是隱藏的。
var $table = $("#parent").children("table");
$table.css({ position: "absolute", visibility: "hidden", display: "block" });
var tableWidth = $table.outerWidth();
$table.css({ position: "", visibility: "", display: "" });
這是一種破解,但它似乎對我很好。
UPDATE
因爲我已經寫了一個覆蓋這個話題。上面使用的方法可能會有問題,因爲您將CSS屬性重置爲空值。如果他們以前有價值會怎麼樣?更新後的解決方案使用在jQuery源代碼中找到的swap()方法。從參考的博客文章
代碼:
//Optional parameter includeMargin is used when calculating outer dimensions
(function ($) {
$.fn.getHiddenDimensions = function (includeMargin) {
var $item = this,
props = { position: 'absolute', visibility: 'hidden', display: 'block' },
dim = { width: 0, height: 0, innerWidth: 0, innerHeight: 0, outerWidth: 0, outerHeight: 0 },
$hiddenParents = $item.parents().andSelf().not(':visible'),
includeMargin = (includeMargin == null) ? false : includeMargin;
var oldProps = [];
$hiddenParents.each(function() {
var old = {};
for (var name in props) {
old[name] = this.style[name];
this.style[name] = props[name];
}
oldProps.push(old);
});
dim.width = $item.width();
dim.outerWidth = $item.outerWidth(includeMargin);
dim.innerWidth = $item.innerWidth();
dim.height = $item.height();
dim.innerHeight = $item.innerHeight();
dim.outerHeight = $item.outerHeight(includeMargin);
$hiddenParents.each(function (i) {
var old = oldProps[i];
for (var name in props) {
this.style[name] = old[name];
}
});
return dim;
}
}(jQuery));
,完美的工作,謝謝! – Martin 2009-09-24 22:50:17
這不會讓瀏覽器重畫兩次頁面嗎?如果是這樣,這是一個不太理想的解決方案。 – marcusklaas 2011-06-25 21:18:52
@Tim銀行非常好!我其實寫了一個類似的擴展名。我一直注意到** Firefox **中很奇怪的行爲,width()返回0,你和我的插件都是。最重要的是,它永遠不會影響填充。 http://jsfiddle.net/67cgB/。我正在最困難的時候弄清楚還有什麼可以解決的。 – 2013-02-14 16:32:25