在上篇博客中对浮动做了介绍
http://blog.youkuaiyun.com/wmaoshu/article/details/52995912
浮动存在的问题也是很明显的,首先他会脱离文档流对父元素兄弟节点和孩子节点都有影响,那么为了实现对浮动布局的替代,那么我的考虑是使用inline-block。
浮动和inline-block他们在文档流中排版方式相似,但是inline-block是基线对齐,浮动是与所在的行框top对齐,同时他们对于width的计算都一样都是“自适应(shrink-to-fit)”并且margin为auto的时候都会定义为0。浮动和inline-block对于所构造的子元素的环境都是BFC。
区别就是在于浮动对其他元素造成影响但是浮动却不会,同时浮动可以向左向右浮动,inline-block的布局方向由文本的方向决定。同时一行几个浮动元素不存在行框的概念,所以对于不同高度的元素,可能会使得布局发生混乱,所以对于多了浮动元素,可能明确的确定这些浮动元素的height一致,但是inline-block元素元素外部的布局和行元素类似,所以根据行框形成的原理(行框的顶部回和最高的行框顶部对齐,行框额底部会和最低的行内框的底部对齐)
对于浮动存在的问题,就是要对其他受影响的元素通过清理浮动减少对他们的影响,同时inline-block由于本质属于行内内容,所以可能会有莫名的空白节点问题的存在,所以他们都要对附带的产生的问题济宁解决。
举例说明集中替代的方案。
例一:百度布局
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
a {
text-decoration:none;
}
p {
margin: 0;
padding: 0;
}
.clearfloat:after{
content: "";
display: block;
clear: both;
height: 0;
visibility: hidden;
}
.box {
display: inline-block;
margin: 0 auto;
}
.row {
border: 2px solid;
}
.row+.row {
margin-top: 20px;
}
.cell {
width: 75px;
border: 1px solid;
float: left;
}
.cell + .cell {
margin-left: 20px;
}
img {
width: 75px;
height: 75px;
}
.name,.recom {
text-align: center;
margin-top: 5px;
}
.name {
margin-top: 5px;
}
.recom {
color: #999;
}
</style>
</head>
<body>
<div class="box">
<div class="row clearfloat">
<div class="cell">
<div class="img"><a href="#"><img src="images/image.jpg"></a></div>
<div class="name"><a href="#">文字文字文字文字</a></div>
<div class="recom"><p>文字文字文字文字</p></div>
</div>
<div class="cell">
<div class="img"><a href="#"><img src="images/image.jpg"></a></div>
<div class="name"><a href="#">文字文字</a></div>
<div class="recom"><p>文字文</p></div>
</div>
<div class="cell">
<div class="img"><a href="#"><img src="images/image.jpg"></a></div>
<div class="name"><a href="#">文字文字文字</a></div>
<div class="recom"><p>文字文文字文</p></div>
</div>
</div>
<div class="row clearfloat">
<div class="cell ">
<div class="img"><a href="#"><img src="images/image.jpg"></a></div>
<div class="name"><a href="#">文字文字文字</a></div>
<div class="recom"><p>文字文</p></div>
</div>
<div class="cell">
<div class="img"><a href="#"><img src="images/image.jpg"></a></div>
<div class="name"><a href="#">文字文字文字文字</a></div>
<div class="recom"><p>文字文文字文文字文文字文</p></div>
</div>
<div class="cell">
<div class="img"><a href="#"><img src="images/image.jpg"></a></div>
<div class="name"><a href="#">文字文字文字文字文字文字</a></div>
<div class="recom"><p>文字文文字文文字文文字文文字文文字文</p></div>
</div>
</div>
</div>
</body>
</html>
上述代码所示,由于列表项浮动,所以对于每一个列表的height不同显然不能在一个row中,否则可能由于浮动的特性会靠在另一个浮动的旁边,所以要加一个外框来限制布局。同时还要让row外面的边框清浮动。上述没有给cell元素明确width值,这利用了浮动的width收缩的特性。
Inline-block版本:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<style>
a {
text-decoration:none;
}
p {
margin: 0;
padding: 0;
}
.box {
display: inline-block;
width:285px;
border: 1px solid;
padding-left: 20px;
font-size: 0; /*解决空白节点文字 否则可能影响布局*/
}
.cell {
display: inline-block; /*行内块化*/
width: 75px;
/*根据inline-block和浮动的宽都具有“自适应收缩性”并且子元素存在文字描述,所以要明确的设置*/
vertical-align: top; /*与浮动不同默认为baseline所以要设置top*/
margin-right:20px;
font-size: 16px; /*覆盖上述的设置*/
}
img {
width:75px;
height:75px;
}
.name,.recom {
text-align: center;
margin-top: 5px;
}
.recom {
color: #999;
}
</style>
</head>
<body>
<div class="box">
<div class="cell">
<div class="img"><a href="#"><img src="images/image.jpg"></a></div>
<div class="name"><a href="#">文字文字文字文字</a></div>
<div class="recom"><p>文字文字文字文字</p></div>
</div>
<div class="cell">
<div class="img"><a href="#"><img src="images/image.jpg"></a></div>
<div class="name"><a href="#">文字文字</a></div>
<div class="recom"><p>文字文</p></div>
</div>
<div class="cell">
<div class="img"><a href="#"><img src="images/image.jpg"></a></div>
<div class="name"><a href="#">文字文字文字</a></div>
<div class="recom"><p>文字文文字文</p></div>
</div>
<div class="cell ">
<div class="img"><a href="#"><img src="images/image.jpg"></a></div>
<div class="name"><a href="#">文字文字文字</a></div>
<div class="recom"><p>文字文</p></div>
</div>
<div class="cell">
<div class="img"><a href="#"><img src="images/image.jpg"></a></div>
<div class="name"><a href="#">文字文字文字文字</a></div>
<div class="recom"><p>文字文文字文文字文文字文</p></div>
</div>
<div class="cell">
<div class="img"><a href="#"><img src="images/image.jpg"></a></div>
<div class="name"><a href="#">文字文字文字文字文字文字</a></div>
<div class="recom"><p>文字文文字文文字文文字文文字文文字文</p></div>
</div>
</div>
</body>
</html>
使用inline-block方式,可以实现浮动的效果,但是要处理空白节点的问题。具体在代码中已经明确说明了。