相信接下来这个需求,你十有八九实现过,甚至实现过屡次,来看 图一
:布局
咱们看到这个图中,有个列表,每一个列表项下面都有一条线,但最后一项没有。咱们预期的代码是:spa
<div id="demo"> <h3>标题列表</h3> <ul> <li>» 有点累想歇一下好长一个标题</li> <li>» 有点累想歇一下好长一个标题</li> <li>» 有点累想歇一下好长一个标题</li> <li>» 有点累想歇一下好长一个标题</li> <li>» 有点累想歇一下好长一个标题</li> </ul> </div>
若是每项都有条底线,咱们能够很简单的作到,以下:code
#demo li{ border-bottom: 1px solid #ccc; }
然而为了处理最后一项,事情就变得有点纠结了。我知道确定有人要说,咱们有 :first-child
, :nth-last-child(n)
, :nth-last-of-type(n)
之类的CSS3选择符,要处理这个,太easy了。恩,我也不得不认可,CSS3确认让事情变得简单多了。但咱们可能须要面对一些国情,由于须要照顾一些弱小者,好比IE6-8,它们离CSS3的世界太远。ast
因此咱们须要找别的方法,因而这样的代码,相信你见过无数遍了:class
<div id="demo"> <h3>标题列表</h3> <ul> <li>» 有点累想歇一下好长一个标题</li> <li>» 有点累想歇一下好长一个标题</li> <li>» 有点累想歇一下好长一个标题</li> <li>» 有点累想歇一下好长一个标题</li> <li class="last">» 有点累想歇一下好长一个标题</li> </ul> </div>
我没乱说,你确定见到相似的代码千百遍了?是的,它确实可以解决咱们的问题,代码以下:循环
#demo .last{ border-bottom: 0 none; }
使用特殊的class来单独处理这项,但我不是很喜欢这样的code,缘由大体有:方法
需单独定义一个差别化的class;im
不利于数据循环输出,由于还得判断是否最后一项;数据
基于以上的缘由,确定会有其它的解决方案出现,这时margin无疑是很是不错的选择,来看代码:demo
#demo{ overflow:hidden; } #demo ul{ margin-bottom: -1px; }
是否是很Cool,彻底避免了上述的问题,而且代码量很小。margin是互动的,能影响其上下文的布局。本例中,当 ul margin-bottom:-1px
,其自己的高并不会被改变,但其相邻的元素则会往上 1px
,这时相邻的元素即其包含块 #demo,因此给 #demo overflow:hidden
,就直接将那 1px 的边框给裁剪掉了。