text-indent(一个在ie6下有着奇怪表现的属性)
text-indent作为大家都很熟悉的一个css属性,应该都不太会对这个属性去做过多的研究。我本来也是觉得这属性也就这样了,直到今天遇到的一个以前未注意过的bug...
先看下w3school对text-indent的介绍:
定义
text-indent 属性规定文本块中首行文本的缩进。
注释:允许使用负值。如果使用负值,那么首行会被缩进到左边。
注意:在 CSS 2.1 之前,text-indent 总是继承计算值,而不是声明值。
说明
用于定义块级元素中第一个内容行的缩进。这最常用于建立一个“标签页”效果。允许指定负值,这会产生一种“悬挂缩进”的效果。
默认值: not specified 继承性: yes 版本: CSS1 JavaScript 语法: object.style.textIndent="50px"
可能的值
值 描述 length 定义固定的缩进。默认值:0。 % 定义基于父元素宽度的百分比的缩进。 inherit 规定应该从父元素继承 text-indent 属性的值。
上方介绍中的重点我已经用红色字体标出了――块级元素。也就是这个属性只对块级元素生效,(当然因为可替代元素中的input类型和display-block相似,所以内容块也为块级元素,故同样可以设置text-indent)。今天遇到的bug也是出自于这里。
在IE8+(包括IE8),FF,chrome等现代高级浏览器中显示的效果良好,可以达到预期的样子。
<div> <input type="text" value="sadasdas" style="width:120px;height:26px;border:1px solid #ccc;line-height:26px;text-indent:20px;"/>asdasdasdasd </div>
效果为:
可以很明显的看出,input内的文字“前进”了20px。
但是同样的代码放在IE6下却是这个情况:
大家可以看到input本身相对于父元素而言也“前进”了20px。
但是后来经过实验几次后发现,并不是说只要是inline元素就肯定会因为text-indent而一起“前进”,其实还要取决于它在父元素中的位置。
<div> <span>asdasd</span><input type="text" value="sadasdas" style="width:120px;height:26px;border:1px solid #ccc;line-height:26px;text-indent:20px;"/>asdasdasdasd </div>
如果在input前再加一个inline元素的话,此时就会发现在现代浏览器与IE6中的表现基本相同:(如果加一个inline-block元素的话表现也是一样的)
现代浏览器: ie6:
此时如果在input前面再加一个block元素的话:
代码:
<div> <span>asdasd</span><span style="display:block;">12134</span><input type="text" value="sadasdas" style="width:120px;height:26px;border:1px solid #ccc;line-height:26px;text-indent:20px;"/>asdasdasdasd </div>
现代浏览器: ie6:
效果还是会回到bug的状态....真是头疼啊,初步结论是:如果inline元素前面没有元素或者有block元素的话,在IE6下会出现bug。
再说下其他情况下会引发的bug:
如果input设置float的情况下:
<div> <input type="text" value="sadasdas" style="width:120px;height:26px;border:1px solid #ccc;line-height:26px;float:left;text-indent:20px;"/>asdasdasdasd </div>
现代浏览器:(表现依旧良好)
ie6:但是在ie6下,float后的input将自身的text-indent传递给了父元素,导致input后的文字也“前进”了20px。
还有两种情况就引用下网上别人的例子了:
例子 3:
负值的 text-indent 会是怎样呢?
<div style="margin: 10px auto; padding: 10px; width: 400px; border: 3px solid #EEE;">
<span style="background: #FF0; color: red; text-indent: -9999px;">Indent</span>
正文
</div>
在 Firefox 中,渲染正常:
在 IE6 中,错误,我们什么也看不到了:
错在 span 不但将自身的 text-indent 属性传递给了它的父元素 div,而且还将超出的内容隐藏了,在没有定义 overflow 属性时,元素的默认 overflow 属性应该是 visible。
例子 4:
既浮动,又负值的 text-indent 呢?(事实上我正是在这种情况下遭遇了这个 Bug):
<div style="margin: 10px auto; padding: 10px; width: 400px; border: 3px solid #EEE;">
<span style="float: right; margin-left: 5px; width: 40px; background: #FF0; color: red; text-indent: -9999px;">Indent</span>
正文
</div>
在 Firefox 中,渲染正常:
在 IE6 中,仍然是错误:
依然是 span 将自身的 text-indent 属性传递给了它的父元素,并将超出的内容隐藏了。
以上的 Bug 在 IE8 的“IE7 mode”中得到了部分修正,当 span 为浮动时基本是正常的,但默认情况下仍然错误。
以上是目前为止会遇到的关于text-indent发生bug的情况的总结。如果以后有情况发生的话,会再更新到这篇文章上来。如果大家有碰到其他的问题的话,欢迎留言!