來自張鑫旭-鑫空間-鑫生活[http://www.zhangxinxu.com]
真正意義上的inline-block水平呈現的元素間,換行顯示或空格分隔的情況下會有間距,很簡單的個例子:
<input> <input type="submit">
間距就來了~~
我們使用CSS更改非inline-block水平元素為inline-block水平,也會有該問題:
<span style="color: #000000;">.space a { display: inline</span>-<span style="color: #000000;">block; padding: .5em 1em; background</span>-<span style="color: #000000;">color: #cad5eb; } </span><div class="space"> <a href="##">惆怅</a> <a href="##">淡定</a> <a href="##">热血</a> </div>
您可以狠狠地點選這裡:inline-block元素間距demo
這種表現是符合規範的應該有的表現(如果有人認為是bug就太()ay ()oy 了)。
不過,這類間距有時會對我們佈局,或是相容性處理產生影響,需要去掉它,該怎麼辦呢?以下展示N種方法(歡迎補充)!
元素間留白間距出現的原因就是標籤段之間的空格,因此,去掉HTML中的空格,自然間距就木有了。考慮到程式碼可讀性,顯然連成一行的寫法是不可取的,我們可以:
<div class="space"> <a href="##"><span style="color: #000000;"> 惆怅</span></a><a href="##"> 淡定</a><a href="##"> 热血</a> </div>
或者是:
<div class="space"> <a href="##">惆怅</a><a href="##">淡定</a><a href="##">热血</a> </div>
或藉助HTML註解:
<div class="space"> <a href="##">惆怅</a><!-- --><a href="##">淡定</a><!-- --><a href="##">热血</a> </div>
等。
.space a { display: inline-block; margin-right: -3px; }
margin負值的大小與上下文的字體和文字大小相關,其中,間距對應大小值可以參見我之前“基於display:inline-block的列表佈局”一文part 6的統計表格:
例如,對於12像素大小的上下文,Arial字體的margin
負值為-3
像素,Tahoma和Verdana就是-4
像素,而Geneva為-6
像素。
由於外在環境的不確定性,以及最後一個元素多出的父margin值等問題,這個方法不適合大規模使用。
如下處理:
<div class="space"> <a href="##">惆怅 <a href="##">淡定 <a href="##">热血</a> </div>
注意,為了向下兼容IE6/IE7等喝蒙牛長大的瀏覽器,最後一個列表的標籤的結束(閉合)標籤不能丟失。
在HTML5中,我們直接:
<div class="space"> <a href="##">惆怅 <a href="##">淡定 <a href="##">热血 </div>
好吧,雖然感覺上有點怪怪的,但是,這是OK的。
您可以狠狠地點擊這裡:無閉合標籤去除inline-block元素間距demo
類似下面的程式碼:
.space { font-size: 0; } .space a { font-size: 12px; }
這個方法,基本上可以解決大部分瀏覽器下inline-block元素之間的間距(IE7等瀏覽器有時候會有1像素的間距)。不過有個瀏覽器,就是Chrome, 其預設有最小字體大小限制,因為,考慮到相容性,我們還需要添加:
類似下面的程式碼:
.space { font-size: 0; -webkit-text-size-adjust:none; }
您可以狠狠地点击这里(去年制作的一个简单demo):font-size:0清除换行符间隙demo
补充:根据小杜在评论中中的说法,目前Chrome浏览器已经取消了最小字体限制。因此,上面的-webkit-text-size-adjust:none;
代码估计时日不多了。
类似下面的代码:
.space { letter-spacing: -3px; } .space a { letter-spacing: 0; }
根据我去年的测试,该方法可以搞定基本上所有浏览器,包括吃“东鞋”、“西毒(胶囊)”、“南地(沟油)”、“北钙(三鹿)”的IE6/IE7浏览器,不过Opera浏览器下有蛋疼的问题:最小间距1像素,然后,letter-spacing
再小就还原了。
类似下面代码:
.space { word-spacing: -6px; } .space a { word-spacing: 0; }
一个是字符间距(letter-spacing
)一个是单词间距(word-spacing
),大同小异。据我测试,word-spacing
的负值只要大到一定程度,其兼容性上的差异就可以被忽略。因为,貌似,word-spacing
即使负值很大,也不会发生重叠。
您可以狠狠地点击这里:word-spacing与元素间距去除demo
与上面demo一样的效果,这里就不截图展示了。如果您使用Chrome浏览器,可能看到的是间距依旧存在。确实是有该问题,原因我是不清楚,不过我知道,可以添加display: table;
或display:inline-table;
让Chrome浏览器也变得乖巧。
.space { display: inline-table; word-spacing: -6px; }
下面展示的是YUI 3 CSS Grids 使用letter-spacing
和word-spacing
去除格栅单元见间隔方法(注意,其针对的是block水平的元素,因此对IE8-浏览器做了hack处理):
.yui3-g { letter-spacing: -0.31em; /* webkit */ *letter-spacing: normal; /* IE < 8 重置 */ word-spacing: -0.43em; /* IE < 8 && gecko */ } .yui3-u { display: inline-block; zoom: 1; *display: inline; /* IE < 8: 伪造 inline-block */ letter-spacing: normal; word-spacing: normal; vertical-align: top; }
以下是一个名叫RayM的人提供的方法:
li { display:inline-block; background: orange; padding:10px; word-spacing:0; } ul { width:100%; display:table; /* 调教webkit*/ word-spacing:-1em; } .nav li { *display:inline;}
也就是上面一系列CSS方法的组组合合。