我有一段代码可以切换一个对象的高度,以便在点击时增长,如果再次点击它会收缩到它的原始高度。我尝试了两种方法来实现这一点。第二种方法确实有效,而第一种方法不重复。
据我了解,当我在Javascript中设置一个高度时,它会有效地将其添加到"样式" HTML中的属性,因此取代了CSS样式表高度设置,并且对象也在增长。
然而,第一种方法只能使用一次,我不知道为什么。在方法1中,对象在单击时会增大,在第二次单击时会缩小,然后再也不会起作用。
第二种方法使用与方法1相同的方法在第一次单击时增长,但是,缩小它只是删除添加的样式。它一遍又一遍地工作而没有问题。
为什么方法1不能一次又一次地工作,而方法2呢?
方法1
if(document.getElementById("block1").style.height < 500) {
document.getElementById("block1").style.height = "500px";
}
else {
document.getElementById("block1").style.height = "200px";
}
方法2
if(document.getElementById("block1").style.height < 500) {
document.getElementById("block1").style.height = "500px";
}
else {
document.getElementById("block1").style.height = "";
}
答案 0 :(得分:2)
据我了解,当我在Javascript中设置高度时,它是有效的 将它添加到&#34; style&#34; HTML中的属性,以及类似的否决 CSS样式表高度设置,对象增长。
不一定。使用style
设置样式的常用方法确实如此。但还有其他方法,例如创建新的样式表。
内联样式并不总是覆盖样式表中的样式。例如,样式表中的!important
样式会覆盖非!important
内联样式。
因此,在大多数情况下,最好使用getComputedStyle
来获取计算样式而不是内联样式。
但在这种情况下,有一种更直接的方法:使用clientHeight
或offsetHeight
。
那些返回元素高度的像素数。由于它是一个数字而不是字符串,因此您无需解析它以进行比较。
因此,您可以使用
var el = document.getElementById("block1");
el.style.height = el.clientHeight < 500 ? "500px" : "200px";
注意:如果您想确保应用您的样式,可以将其设置为重要。 See how
答案 1 :(得分:1)
将字符串与数字进行比较时,JavaScript会将字符串转换为数字,如果无法转换,则将其转换为NaN
。
假设document.getElementById("block1").style.height
是&#34; 200px&#34;。
&#34; 200像素&#34;如果不使用parseInt
等函数,则无法强制转换为数字。因此,在此比较中它变为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
&lt; 500(假),第二次比较0&lt; 500(真实)。
解决方案(正如其他人指出的那样)是比较元素offsetHeight
而不是style.height
。
答案 2 :(得分:0)
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)
答案 3 :(得分:0)
也许你有理由,但这种方法闻起来很奇怪。您是否考虑通过添加/删除CSS类来切换高度?那样你就不需要处理这个了。 (它也感觉更像&#34;正确&#34; aproach。)
为什么我认为你在做什么是错的:
我坚信你应该在该元素上添加/删除className。
答案 4 :(得分:0)
<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 值。