CSS 去掉inline-block元素间隙的几种方法
最近做移动端页面时,经常会用到 inline-block 元素来布局,但无可避免都会遇到一个问题,就是 inline-block 元素之间的间隙。这些间隙会导致一些布局上的问题,需要把间隙去掉。对于 inline-block 元素及去掉间隙的方法,在这里做一个简单的总结。
inline-block 是什么
inline-block 即内联块, 在 CSS 的元素分类中可以分成三种:行内元素或者内联元素、块级元素、以及内联块元素。
内联块元素具有了内联元素以及块级元素的特性:(1)元素之间可以水平排列 (2)可以当做一个块级元素来设置各种的属性,例如:width、height、padding 等。
例子 1:定义一个内联元素 span 为 inline-block 元素
<div id="demo"> <span>我是一个 span</span> <span>我是一个 span</span> <span>我是一个 span</span> <span>我是一个 span</span> </div> #demo span{ display:inline-block;
background:#ddd;
}
效果图:
inline-block 兼容性
(1)inline level 的元素
对于内联元素 (inline element),所有主流浏览器都支持直接设置 display 的 value 值为 inline-block 来将其定义为内联块。
(2)block level 的元素
IE7 及以下浏览器对块级元素 (block element) 的支持并不完全,它们只支持用 display:inline-block 去定义一个 inline level 的元素为内联块。
由于 IE7 及以下浏览器支持直接将 inline level 元素设置为内联块,所以我们可以变通实现,先将 block level 元素设置为 inline,然后再去触发该元素的 hasLayout,使其拥有和 inline-block 相似的特性。可以这样写:
例子 2:
<div id="demo"> <div>我是一个 div</div> <div>我是一个 div</div> <div>我是一个 div</div> <div>我是一个 div</div> </div> #demo div{ display:inline-block; *display:inline; /*IE7 hack*/ *zoom:1; /* 触发 hasLayout*/ }
IE7 及以下浏览器:block level 元素转换为 inline-block,在 IE7 及以下浏览器下元素间不出现间隙;inline level 元素转换为 inline-block,在 IE7 及以下浏览器下元素间出现间隙;紧跟 block level 转换为 inline-block 的元素之后有个 inline level 转换为 inline-block 的元素,在 IE7 及以下浏览器下这俩元素间不出现间隙;紧跟 inline level 转换为 inline-block 的元素之后有个 block level 转换为 inline-block 的元素,在 IE7 及以下浏览器下这俩元素间出现间隙;其它浏览器任何情况下均出现间隙;
inline-block 元素间隙由来
在例子 1 中,定义为 inline-block 元素会产生间隙,如果不设置 display:inline-block,会是什么效果?如下:
例子 3:
<div class="demo"> <span>我是一个 span</span> <span>我是一个 span</span> <span>我是一个 span</span> <span>我是一个 span</span> </div>.demo span{
background:#ddd;
}
效果图:
上面例子中,对 span 不做任何处理依然存在空隙,这到底是什么原因,是否是结构上的问题。假如将 span 标签都写成一行,又是怎样的效果,来看一下:
<div class="demo"> <span>我是一个 span</span><span>我是一个 span</span><span>我是一个 span</span><span>我是一个 span</span> </div> .demo span{background:#ddd;}
效果图:
可以看到间隙是由换行或者回车导致的。只要把标签写成一行或者标签直接没有空格,就不会出现间隙。但是这种方式是不太可靠,存在太多不可控的因素导致失效,例如:代码生成工具、代码格式化、或者其他人修改了代码等等。下面列举了各种去掉间隙的方法,是否适合需要看具体的应用场景了。
移除 inline-block 元素间隙方法
(1)移除标签间的空格
元素间的间隙出现的原因是元素标签之间的空格,把空格去掉间隙自然就会消失。来看以下几种写法:
* 写法一:
<div class="demo"> <span>我是一个 span</span><span>我是一个 span</span><span>我是一个 span</span><span>我是一个 span</span> </div>
* 写法二:
<div class="demo"> <span>我是一个 span </span><span>我是一个 span </span><span>我是一个 span </span><span>我是一个 span</span> </div>
* 写法三:利用 HTML 注释标签
<div class="demo"> <span>我是一个 span</span><!-- --><span>我是一个 span</span><!-- --><span>我是一个 span</span><!-- --><span>我是一个 span</span> </div>
(2)取消标签闭合
<div class="demo"> <span>我是一个 span <span>我是一个 span <span>我是一个 span <span>我是一个 span </div>
.demo span{
background:#ddd;
display: inline-block;
}
把 span 标签的结束标签去掉,这样间隙就没有了。为了兼容 IE6/IE7,最后一个标签需要闭合。
<div class="demo"> <span>我是一个 span <span>我是一个 span <span>我是一个 span <span>我是一个 span</span> </div> .demo span{ background:#ddd; display: inline-block; }
在美团webapp 页面中貌似也是用到了这种方法。可以看下:
源代码:
(3)使用 font-size:0;
在父容器上使用 font-size:0; 可以消除间隙,可以这样写:
<div class="demo"> <span>我是一个 span <span>我是一个 span <span>我是一个 span <span>我是一个 span</span> </div> .demo {font-size: 0;} .demo span{ background:#ddd; display: inline-block; font-size: 14px; /* 要设置相应的字号 */ }
对于 Chrome, 其默认有最小字体大小限制,考虑到兼容性,需要取消字体大小限制,这样写:
<div class="demo"> <span>我是一个 span <span>我是一个 span <span>我是一个 span <span>我是一个 span</span> </div> .demo {font-size: 0;-webkit-text-size-adjust:none;} .demo span{ background:#ddd; display: inline-block; font-size: 14px; /* 要设置相应的字号 */ }
总结
在移动端的页面中,个人倾向于设置 font-size:0 这种方法来清除掉。对于 PC 端上,可以参考 doyoe 的全浏览器兼容方案。
以上是在工作上遇到一些问题的知识总结,不足之处,欢迎指正。
如有任何建议或疑问,欢迎留言讨论。
如果觉得文章不错的话,欢迎点一下右下角的推荐。
更多阅读: