[英]Can Javascript Detect Inline Styles?
我有一段代码应该在单击时切换对象的高度以增长,如果再次单击它会缩小到它的原始高度。 我尝试了两种方法来让它发挥作用。 第二种方法确实有效,而第一种方法不能重复使用。
据我了解,当我在 Javascript 中设置高度时,它有效地将其内联添加到 HTML 的“样式”属性上,因此会否决 CSS 样式表高度设置,并且对象会增长。
但是,第一种方法只有效一次,我不知道为什么。 在方法 1 中,对象在单击时增大,在第二次单击时缩小,然后不再起作用。
第二种方法使用与方法 1 相同的方法在第一次点击时增长,但是,缩小它只是删除添加的样式。 它一遍又一遍地工作,没有问题。
为什么方法 1 不能一遍又一遍地工作,而方法 2 却可以?
方法一
if(document.getElementById("block1").style.height < 500) {
document.getElementById("block1").style.height = "500px";
}
else {
document.getElementById("block1").style.height = "200px";
}
方法二
if(document.getElementById("block1").style.height < 500) {
document.getElementById("block1").style.height = "500px";
}
else {
document.getElementById("block1").style.height = "";
}
据我了解,当我在 Javascript 中设置高度时,它有效地将其内联添加到 HTML 的“样式”属性上,因此会否决 CSS 样式表高度设置,并且对象会增长。
不必要。 确实,使用 JS 设置样式的常用方法是使用style
。 但是还有其他方法,例如创建新的样式表。
内联样式并不总是覆盖样式表中的样式。 例如,样式表中的!important
样式会覆盖非!important
内联样式。
因此,在大多数情况下,最好使用getComputedStyle
来获取计算样式而不是内联样式。
但在这种情况下,有一种更直接的方法:使用clientHeight
或offsetHeight
。
那些返回元素高度的像素数。 由于它是一个数字,而不是一个字符串,因此您不必解析它来进行比较。
因此,您可以使用
var el = document.getElementById("block1");
el.style.height = el.clientHeight < 500 ? "500px" : "200px";
注意:如果您想确保您的样式将被应用,您可以将其设置为重要。 看看如何。
将字符串与数字进行比较时,JavaScript 会将字符串转换为数字,如果无法转换则转换为NaN
。
假设document.getElementById("block1").style.height
是 "200px"。
如果不使用parseInt
等函数,就无法将“200px”转换为数字。 因此,在这个比较中它变成了NaN
:
if(document.getElementById("block1").style.height < 500) {
NaN
与任何东西(包括它自己!)相比都是假的。
因此,当样式已分配高度时, else
始终在方法 1 中运行:
if(document.getElementById("block1").style.height < 500) {
document.getElementById("block1").style.height = "500px";
}
else {
document.getElementById("block1").style.height = "200px";
}
这就是方法 1只工作一次的原因。
另一方面,方法 2始终有效,因为空字符串""
可以转换为数字 - 数字 0。
所以它第一次运行时,比较NaN
< 500 (false),第二次比较 0 < 500 (true)。
解决方案(正如其他人指出的那样)是比较元素的offsetHeight
而不是style.height
。
style.height
返回一个字符串值,但您将它与一个整数进行比较。 基本上你的比较是这样的:
if("200px" < 500)
比较数字和字符串时,字符串会转换为数字,而Number("200px")
是NaN
,因此您的比较实际上是这样的:
if(Nan < 500)
返回false
。
您的比较第一次起作用的原因是因为style.height
最初返回一个空字符串,因为您还没有设置元素的高度。 在这种情况下''
被转换为0
,所以你要检查0
是否小于500
,它是。
如果您想将例如"200px"
与整数进行比较,您可以先使用parseInt
将其转换为整数:
if(parseInt(document.getElementById("block1").style.height, 10) < 500)
也许你有你的理由,但这种方法闻起来很奇怪。 您是否考虑过通过添加/删除 CSS 类来切换高度? 这样你就不需要处理这个了。 (而且它也感觉像是更“正确”的方法。)
为什么我认为你在做什么是错误的:
我坚信您应该在该元素上添加/删除 className。
<span id="test1" style="color: #777;">test</span>
console.log(document.getElementById('test1').style.backgroundColor);
//""
console.log(document.getElementById('test1').style['background-color']);
//""
console.log(document.getElementById('test1').style.color);
//"rgb(119, 119, 119)"
console.log(document.getElementById('test1').style['color']);
//"rgb(119, 119, 119)"
注意十六进制值被错误地返回为 RGB 值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.