使用示例CSS:
.thing { height: auto }
和HTML:
<div class="thing">The quick brown fox jumps over a lazy dog.</div>
是否可以检测到.thing的高度设置为'auto'?
以下方法返回值:
jQuery('.thing').height() // n
jQuery('.thing').css('height') // 'npx'
getComputedStyle(node).height // 'npx'
是否有任何方法可以告诉我浏览器正在从'auto'计算这些值?
答案 0 :(得分:3)
是的,有办法,但这不是一个有趣的方式。你要做的是:
styletags
和关联的样式表。然后获取所有样式标记中所有selectorText
的{{1}}
cssRules
或IE&lt; 9
styletag.sheet.cssRules.selectorText
获取所有元素父级styletag.styleSheet.cssRules.selectorText
,id
和class
,以了解标记获取属性的可能方式。
tagName
cssRules
处的cssRules
是否为自动。或以某种相反的方式进行操作,并以cssRules.style.width
找到所有cssRules
,无论是哪种方式都不容易获得,而不需要大量代码
答案 1 :(得分:1)
jQuery('.thing').each(function (i,n){
console.log( $(n).style.height);// if not then just try to simply find the n.style.height
});
//this is another way // at least in ff it would work :)
window.document.styleSheets[0].cssRules[0].style.height
希望它有所帮助,否则你有很多需要做的事情:)
对于第二个选项,您看到[0]
意味着您必须循环,因为可能有不同的文件名等等...
完整示例:
var ss = window.document.styleSheets;
for(i=0;i<ss.length;i++){
var rules = ss[i].cssRules;
for(j=0;j<rules.length;j++){//loop style sheets
var rule = rules[j];
if(rule.selectorText=='thing'){//loop each stylesheet rule
console.log(rule.style.height);
// should return height for everytime height is used with every .thing in any of your stylesheets attached :)
}
}
}
请注意
你必须逃避跨域的那些。如果你已经包括在内
<link ....="...jquery.com.../ui.css" />
它不起作用,因为这可能被视为安全风险(跨域)......
答案 2 :(得分:0)
这不是最有效的解决方案,特别是对于旧的IE版本,但它应该可以很好地工作:
<div style="clear: left; height: 30px">Test</div>
这是我的实施:
$.fn.hasAutoHeight = function() {
if (this.length === 0) return;
var self = this.first();
var height = self.css("height");
var position = self.css("position");
// Check for inline elements
if (self.css("display") === "inline" && self.css("float") === "none") {
var position = self.css("position");
if (position === "static" || position === "relative") return true;
}
// Quick check to see if a style height is set
if ($.style(self[0], "height") !== "") return false;
// Otherwise use the long route
var test = $('<div style="clear: both; height: 30px">Test</div>');
self.append(test);
var hasAutoHeight = self.css("height") !== height;
test.css("color", "red").remove();
return hasAutoHeight;
};
注意:
height: auto !important;
规则,“快速检查”行可能无法正常工作,在这种情况下,您总是需要走很长的路线。<img>
和<br>
答案 3 :(得分:0)
以上是对上述建议的更完整实施:
$("*").data("autoHeight", "false");
var stylesheets = window.document.styleSheets;
for (i=0; i < stylesheets.length; i++) {
var rules = stylesheets[i].cssRules;
for (j = 0; j < rules.length; j++) {
var rule = rules[j];
var style = rule.style.getPropertyValue("height");
var auto = !style || style.match(/^\s*auto\s*(!important)?$/);
$(rule.selectorText).each(function() {
var elem = $(this);
if (asSpecific(rule.selectorText, $(elem).data("autoHeightSelector"))) {
$(elem).data("autoHeight", !!auto);
$(elem).data("autoHeightSelector", rule.selectorText);
}
});
}
}
如果css选择器asSpecific(a, b)
至少与选择器a
一样具体,那么您需要实施b
,例如p#foo a#bar
。 p.foo
比!important
更具体。您还需要考虑{{1}}标志。
这可能很有用:http://www.w3.org/TR/CSS2/cascade.html#specificity
这应该为每个元素添加一个数据属性,指定它是否在CSS中具有自动高度样式,但是您还需要检查样式属性并考虑默认样式。