你问我答(35)——破解缝隙之谜(续)
今天上午回答了一位读者的问题,有几位朋友在留言中给出了一些评论,其中 蓝月 网友给出了一个解决方法,使我想到了以前遇到的另一个问题,因此这里再补充,并更深入地扩展说明一下。
如果没有看过上一篇文章的读者,可以先看一下:你问我答(34)——破解缝隙之谜
蓝月指出,如果在div标记和img标记的尖括号都连起来写,不加空格,就不会出现这个缝隙了。例如这样写(请注意img标记的尖括号的位置):
1 2 3 | <div style="border:1px solid #FF0000;">
<img src="pic.jpg"
></div> |
这里比较一下上面的写法和下面的写法有什么区别呢?
1 2 3 | <div style="border:1px solid #FF0000;">
<img src="images/logo1.jpg">
</div> |
上面两种写法,再Firefox和IE 8中,是完全一样的,而在IE6和IE7种,却有所不同。
浏览器在解析HTML的时候,除了标记节点之外,还会根据需要生成文本节点。例如昨天的文章中,在图像的后面加了几个字母以后,就产生了一个文本节点,在没有字母的时候,本来是不应该产生文本节点的,但是IE在解析上面一种写法的代码时,会把标记之间的空格解释为文本节点,从而根据默认的规则,图像的底边和就会和文本的基线对齐,而产生了这样一条缝隙。
而当本来完全一样的代码,写成上面的第一种写法时,由于标记之间(尖括号之间)不加空格,因此IE6、IE7也不会解析出文本节点,从而也就不会产生这个缝隙了。这就解释了蓝月的方法为什么可以解决这个问题。
由此我又想到了另一个多次遇到过的针对IE6的问题,本质和这个问题是完全一样的,因此这里也介绍给大家。如下图所示的是一个很常用的效果,CSS的目的是将列表项目中的a元素改为块级元素,从而使得响应鼠标的范围扩展到li的矩形范围,而不仅仅是链接文字。

代码很简单,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <style>
li a {
display:block;
background:#CCC;
border-bottom:1px #000 solid;
text-decoration:none;
}
li a:hover {
background:#BBB;
}
</style>
<body>
<ul>
<li><a href="#">First Item</a></li>
<li><a href="#">Second Item</a></li>
<li><a href="#">Third One!</a></li>
</ul>
</body> |
事实上,以上代码在IE7、IE8、Firefox这些浏览器中都没有问题,但是在IE6中,效果将如下图所示:

在各个li之间为什么会产生这个缝隙呢?其实原理和上面谈到的原意是一样的,IE 6 在某些时候,会把标记尖括号之间的空格解释位文本节点,因此,解决方法就是把HTML代码的换一种写法:
1 2 3 4 5 | <ul>
<li><a href="#">First Item</a></li
><li><a href="#">Second Item</a></li
><li><a href="#">Third One!</a></li>
</ul> |
可以看到,我们仅仅把
分在两行里写,以保证消除标记之间的空格,在IE 6中效果就立即正常了,如下图所示。

需要说明的是,通过这种HTML格式的方式解决这个问题,未必是看起来最舒服的一种,当然通过CSS来解决也是可以的。不过这种方式的最大优点就是快捷和直接,立竿见影,哪里多出了文本节点,就直接在HTML中消灭掉他。如果用CSS来解决则需要具体问题具体分析,会稍微麻烦一些,当然也是完全可行的。
5,012


做网页郁闷的不行,偶然搜索来到前辈的空间,长见识了。谢谢。订阅了您的博客。
变压器 ,
谢谢你的鼓励!希望我们的内容对您有所帮助,欢迎常来这里交流!
建议出一本符合 WEB2.O的标准的,用CSS布局的,整个网站建设全过程这样的书,这个比较少,是个空白,另外象当当网的很多交互的哪些功能最好能体现在整个设计当中就好了!
shcs,
Web 2.0 是很虚的概念,通常概念上的Web 2.0 涉及的东西远远超过设计几个页面的问题,它涉及到很多网站的理念和概念性的东西,比如“用户生产内容”等等。这些东西甚至超出了技术的范畴。
我们还是先做一些小一点的东西,实在一些的。
忘了一些,补充上 前后台一起的,整个过程,包括整个流程方法等.
shcs,
谢谢你的建议,这些都需要一些好的案例,我们可以慢慢整理出一些。
呵呵 说真的。。研究这个问题 实际意义不大。。定一个高度,这个bug就消失了。。
实际制作中,谁会不定义一个高度呢??不解中。。。
鹤庭逸,
我印象中,还真不是定一个高度能解决,我当时之所发现这个问题,就是因为定义了高度,还是裂缝,我搞了半天才发现是因为多出了文本节点。我记得即时定义了li的高度,这个文本节点也不会消失,还是会有裂缝。
真的不错,以前没有注意到这个问题,我可以转载么?
无语工作室 ,
没问题,您可以转载,请注明出处!
在您这里注册了,但是不知道怎么去提问,有个问题,跟这个主题没有关系,我就想问下在WEB状态下,来控制打印表格,或者打印表,比如说工资表,简历表,通过设置单独的打印css样式来实现的时候,具体的表格大小是不是用pt,另外字号的大小和pt 的对应关系如何?请回答,谢谢!
shcs ,
抱歉,关于打印的CSS设置这个问题,我还真没有研究过,网上找到两篇英文文章,我现在没有时间仔细看了,估计应该可以解决,如果英文看不懂,可以找个网页翻译软件,应该可以看个大概。
我估计打印在纸上,应该用pt作为文字大小的单位。
http://www.alistapart.com/articles/goingtoprint/
http://www.addedbytes.com/css/printer-friendly-pages/
谢谢,有些帮助.
给 li a 加个 zoom:1 就可以解决 IE6 问题,不用换行,但不能通过验证。。。
青色,
zoom:1 对于IE6真是个很有用的东西,很多莫名其妙的问题都可以靠它解决。
还有一个方法,不用改尖括号的位置。把li a {border-bottom:1px #000 solid;}
这条属性单独定义在li{border-bottom:1px #000 solid;}中就可以了。
vincent,
方法甚多,遇到具体问题可以具体分析,找到一个相对适合的即可了。
比较难以理解是给li添加border:1px solid red;后,多出来的文本节点竟然也会没了!
不知道IE6和IE7到底是怎么解析的?
prestlhh,
难以理解的事情很多,找到解决办法即可,这个就是经验积累的过程。
老师讲的这个问题,我以前也遇到过,很是郁闷!
由于ASP.NET的控件会自动生成HTML,所以写成“”的形式,在ASP.NET不太可能实现,只能是通过样式“vertical-align:bottom;” 去控制。
ilovedotnet,
用 repeater 这样的控件,可以自己控制格式,可能会好一些?
温老师,是不是firefox浏览器不支持css滤镜,像ie6中可显示的alpha半透明效果,在firefox中却没有
小唐,
IE 的滤镜只有IE6和IE7支持,新的IE8都不支持了。
半透明标准的浏览器也有支持的。
之前碰上过这种情况,最后采用 CSS Hack 的方法,给 IE6 单独定义了
_li { … }
的样式,但实在是觉得不爽。后来也改成删除空格及换行符的方法了。
anyLiv ,
方法很多,具体问题具体分析吧,总之IE 6,就是一个大麻烦,没有办法~~
见过这样的写法。。。
同样道理这个给 li 添加一个 vertical-align:bottom; 就也可解决了(最近我也遇到这个问题,就是这么解决的)
个人认为,把一个标记写成两行不怎么好,呵呵
任平生 ,
并非所有的由于增加了文本节点导致的问题都可以通过,vertical-align 这个方法解决的。
在上面我写的这个列表的案例中,使用vertical-align应该是不起作用的,用CSS解决也是可以的,只是针对不同的情况需要寻找不同的解决方法。
而修改格式,彻底消灭多出来的文本节点,似乎是最直接的方法,虽然看齐不是很优雅,但是很管用。
我一直觉得li是块级元素,块级元素之间的空格ie6也会忽略,但想不到l i之间的空格也有影响
小唐 ,
IE 6什么都有可能发生~~