html/css解决inline-block内联元素间隙的多种方法总汇

display有几种属性:
inline是内联对象,比如<a/> 、 <span/>标签等,可以“堆在一起”显示,宽高由内容决定,不能设置;
block是块对象,比如<div/>、<p/>标签等,要占一整行,但是宽高可以自定义;
为了弥补inline和block的不足,又扩充了inline-block属性;inline-blcok可以将对象呈递为内联对象,而内容作为块对象呈递。

但是display:inline-block;在IE6/7中不兼容:解决办法:

1 display:inline-block;*dsiplay:inline;*zoom:1;

为什么会有间隙

inline元素之间本身就存在间隙,是不是这个间隙引起的呢?最终原因是由于inline元素中间的空白符引起的,解决办法:就是去掉空白符。

解决方案

1、改变书写结构

 1 <ul>
 2     <li>item1</li><li>item2</li><li>item3</li><li>item4</li><li>item5</li>
 3 </ul>
 4 <ul>
 5     <li>
 6         item1</li><li>
 7         item2</li><li>
 8         item3</li><li>
 9         item4</li><li>
10         item5</li>
11 </ul>
12 <ul>
13     <li>item1</li
14     ><li>item2</li
15     ><li>item3</li
16     ><li>item4</li
17     ><li>item5</li>
18 </ul>
19 <ul>
20     <li>item1</li><!--
21   --><li>item2</li><!--
22   --><li>item3</li><!--
23   --><li>item4</li><!--
24   --><li>item5</li>
25 </ul>

以上几种均可以完美的达到去除间隙的作用。但是,从代码的可读性上看,或多或少有一些不足。如果使用到了打包工具或者自写脚本,在上线前将响应HTML代码打包成一行,即可。

2、使用font-size:0

1 .space {
2     font-size: 0;
3    -webkit-text-size-adjust:none;//兼容Chrome
4 }
5 .space a {
6     font-size: 12px;
7 }

基本上可以解决大部分浏览器下inline-block元素之间的间距(IE7等浏览器有时候会有1像素的间距)。不过有个浏览器,就是Chrome, 其默认有最小字体大小限制,因为,考虑到兼容性,我们还需要添加: -webkit-text-size-adjust:none;

3、使用margin负值

1 @media screen and (-webkit-min-device-pixel-ratio:0) { div { margin-right: -8px; } }/*谷歌 HACK 方法*/

除谷歌外的其他浏览器间隙是4px,使用margin:-4px; 唯独谷歌是 双倍的8px,需要给谷歌单独设置 margin:-8px; 

4、使用letter-spacing或word-spacing

1 .space {
2     letter-spacing: -3px;
3 }
4 .space a {
5     letter-spacing: 0;
6 }

该方法基本可以搞定所有浏览器 ,不过Opera浏览器下有蛋疼的问题:最小间距1像素,然后,letter-spacing再小就还原了。

1 .space {
2     word-spacing: -6px;
3    display: inline-table;/*兼容Chrome*/
4 }
5 .space a {
6     word-spacing: 0;
7 }

word-spacing的负值只要大到一定程度,其兼容性上的差异就可以被忽略。因为,貌似,word-spacing即使负值很大,也不会发生重叠。

5、丢失结束标签

1 <ul>
2     <li>item1
3     <li>item2
4     <li>item3
5     <li>item4
6     <li>item5
7 </ul>

此方法虽然可以解决此问题,但是在Doctype为xhtml时将报错,所有方法是否适用须视情况而定。

6、W3C推荐 导航方法(兼容IE6等)

 1 <style type="text/css">
 2         body,div,h1,ul,li{margin:0; padding:0;}
 3         ul,li{list-style:none;}
 4         a{text-decoration: none;}
 5         .nav a{background: red;color:#fff;padding: 10px 20px;margin-right: -4px;line-height: 40px;*margin-right: -8px;/* ie 下面也是 -8px*/}
 6         @media screen and (-webkit-min-device-pixel-ratio:0) { .nav a { margin-right: -8px; } }/*谷歌 HACK 方法*/
 7         .nav ul li{display:inline;}
 8         .nav a:hover{text-decoration: underline;}
 9 </style>
10 <div class="nav">
11         <ul>
12             <li><a href="#">首页</a></li>
13             <li><a href="#">服装城</a></li>
14             <li><a href="#">食品</a></li>
15             <li><a href="#">团购</a></li>
16             <li><a href="#">夺宝岛</a></li>
17             <li><a href="#">闪购</a></li>
18             <li><a href="#">金融</a></li>
19         </ul>
20 </div>

办公资源网址导航 https://www.wode007.com

不使用hack方法的话,每个li紧挨着即可,不要留空格等间隙。

7、YUI 3 CSS Grids的处理

 1 .yui3-g {
 2     letter-spacing: -0.31em; /* webkit */
 3     *letter-spacing: normal; /* IE < 8 重置 */
 4     word-spacing: -0.43em; /* IE < 8 && gecko */
 5 }
 6 .yui3-u {
 7     display: inline-block;
 8     zoom: 1; *display: inline; /* IE < 8: 伪造 inline-block */
 9     letter-spacing: normal;
10     word-spacing: normal;
11     vertical-align: top;
12 }

8、其他方法

 1 li {
 2     display:inline-block;
 3     background: orange;
 4     padding:10px;
 5     word-spacing:0;
 6     }
 7 ul {
 8     100%;
 9     display:table;  /* 调教webkit*/
10     word-spacing:-1em;
11 }
12 
13 .nav li { *display:inline;}

结语

其他去除间距的方法肯定还有,欢迎大家通过评论方式进行补充。

原文地址:https://www.cnblogs.com/ypppt/p/13030011.html