text-align 属性在 chrome 下的一个 bug 产生的原因



 <style>
  div {
    width:100%;
    text-align:center;
  }
  ul {
    display:inline-block;
    min-width:800px;
    margin:0 auto;
  }
  li {
    float:left;
    height:30px;
    width: 200px;
    margin-left:1px;
    margin-bottom:1px;
    list-style-type: none;
    background-color: lightblue;
  }
</style>
<div>
<ul>
  <li>1</li>
</ul>
<ul>
  <li>2</li>
</ul>
</div>

请输入图片描述
此时如果用 chrome 打开上述代码,会发现样式出现问题。但是如果我把 ul 标签的缩进改好,如下:


 <div>
  <ul>
    <li>1</li>
  </ul>
  <ul>
    <li>2</li>
  </ul>
</div>

请输入图片描述
样式恢复正常,或者不加缩进,只是去除两个 ul 标签之间的空格:


 <ul>
  <li>1</li>
</ul><ul>
  <li>2</li>
</ul>

请输入图片描述
样式同样恢复正常。我找了下原因,我认为是因为外层 div text-align 属性起了作用,当 text-align center 或者 right 时,就会出现这个现象,为 left 时正常。大家分析下出现 bug 的原因在哪儿呢?

这个问题的出现是因为我在回答 @Dont 提出的 问题 时发现的,虽然问题得到了解决,但是总感觉不知道根源出在哪儿。

chrome css HTML

sa00sa 10 years, 10 months ago

虽然看问题的第一眼就知道问题在于空的textNode,但这个问题也还是激发了我对缩进的兴趣,先回答这个问题,稍后研究下Chrome对HTML源码缩进的处理吧。


答案正文

其实就是ul和ul之间有个空格而已。HTML在inline的情况下,对标签之间一个或跟多的空格字符都会显示为一个空格

请输入图片描述

所以会有删掉换行那个空格就没了,至于text-align,压根和这个问题没关系,不信你可以调了text-align以后再反选页面观察一下,空格只不过是挪到第一个ul的后面去了而已

至于缩进排版以后和firefox天生没有,我认为是由于这个显示空格的行为通常是恼人的,不同浏览器各自有一些非标准方法来判断是否显示这个空格

// 我同意这个css本身质量不怎么样,为啥这里要用inline-block呢,效果上来看明明是块级的啊

umineko answered 10 years, 10 months ago

Your Answer