一、两种布局使用分析
float布局(定宽布局)
flex布局(弹性布局)
image
二、原则
不到万不得已,不要写死 width 和 height
尽量用高级语法,如 calc、flex
如果是 IE,就全部写死
三、布局套路口诀(上) PC端布局
1、导航条布局——float布局(适用于ie5)
a.儿子全加 float: left (right) b.老子加 .clearfix
代码如下:Float布局
<style> .parent{ border:1px solid green; } .child{ /* border:1px solid red; */}.child:nth-child(1){ width:30%; background-color:red; }.child:nth-child(2){ width:69%; background-color:yellow; }.clearfix::after{ content:''; display:block; clear:both; }.content{ border:1px solid black; margin-right:10px; }</style><div class="parent clearfix" > <div class="child" style="float:left;">儿子1</div> <div class="child" style="float:left;">儿子2</div> </div>
如图:该页面展示上其实是弹性布局
image
定死宽度,水平居中则在老子这边动手,添加以下代码:
.parent{ border:1px solid green; width:1000px margin-left:auto margin-right:auto }.child:nth-child(1){ width:30%; background-color:red; }.child:nth-child(2){ width:69%; background-color:yellow; }
如图:定宽之后,页面宽度仍有剩余
image
优化之后的导航条,代码如下:
<style> .parent{ margin-left:auto; margin-right:auto; background: #ddd; /*定死宽度则不会影响页面 */ min-width:600px; } .child{ } .child:nth-child(1){ width:100px; background-color:#333; color: white; text-align:center; line-height:36px; height:36px; } .child:nth-child(2){ } /* 清除浮动 */ .clearfix::after{ content:''; display:block; clear:both; } .clearfix{ zoom: 1; }/*IE6*/ .content{ border:1px solid black; margin-right:10px; } .nav{ line-height:24px; padding:6px 0; } .navItem{ margin-left:20px; } </style> <div class="parent clearfix" > <div class="child" style="float:left;">logo</div> <div class="child" style="float:right;"> <div class="nav clearfix"> <div style="float:left" class="navItem">导航1</div> <div style="float:left" class="navItem">导航2</div> <div style="float:left" class="navItem">导航3</div> <div style="float:left" class="navItem">导航4</div> <div style="float:left" class="navItem">导航5</div> </div> </div> </div>
2、图片位布局——flex布局
a.给老子加 display: flex
b.给老子加** justify-content: space-between;**
先看看第1种场景:
实现方式:先不用flex布局,用浮动元素+margin+clearfix清除浮动
<style>/* 图片主要部分 */ .banner{ width:800px; height:300px; background:#888; margin-left:auto; margin-right:auto; margin-top:10px; } .pictures{ width:800px; margin:0 auto;/*不能删1:居中*/ /* background: black;最底层的颜色 */ } .picture{ width:194px; height:194px; background:#ddd; margin:4px; float:left; } .pictures >.xxx{ /*为什么不能只用两层div*/ /* background: rgba(255,0,0,0.8);倒数第二层颜色 */ margin-left:-4px; margin-right:-4px;/*不能删2:扩大范围*/ } /* .picture:nth-child(1){ margin-left: 0; } .picture:nth-child(4){ margin-right: 0; } */<style> <div class="banner"></div> <div class="pictures"> <div class="xxx clearfix"> <div class="picture"></div> <div class="picture"></div> <div class="picture"></div> <div class="picture"></div> <div class="picture"></div> <div class="picture"></div> <div class="picture"></div> <div class="picture"></div> </div> </div>
如图:
image
这种方式可以兼容IE6,且即使减少一个板块也不会影响其它板块,
如图:
image
再看第2种场景:
实现方式:flex布局
<style>.banner{ width:800px; height:300px; background:#888; margin-left:auto; margin-right:auto; margin-top:10px; }.pictures{ width: 800px; /* 定宽不够弹性 */ margin: 0 auto; display: flex; /* 弹性布局 */ flex-wrap: wrap; /* 换行*/ justify-content: space-between;/* 多余空间放在空间或水平居中 */ /* align-items: center; 垂直居中 */}.picture{ width: 194px; height: 194px; background: #ddd; margin-top: 4px; margin-bottom: 4px; }</style> <div class="banner"></div> <div class="pictures"> <div class="picture"></div> <div class="picture"></div> <div class="picture"></div> <div class="picture"></div> <div class="picture"></div> <div class="picture"></div> <div class="picture"></div> <div class="picture"></div> </div>
不过如果不是等份的图片板块,就会出现下方bug:
image
如何解决,代码如下:flex布局至bug修复
<style>*{box-sizing: border-box;}.banner{ width:800px; height:300px; background:#888; margin-left:auto; margin-right:auto; margin-top:10px; }.pictures{ width: 800px; /* 定宽不够弹性 */ margin: 0 auto; }.pictures > .xxx{ display: flex; /* 弹性布局 */ flex-wrap: wrap; /* 换行 */ margin: 0 -4px; }.picture{ width: 194px; height: 194px;/* 或者 width: calc(25% - 8px); height: 194px; */ background: #ddd; /* 边框可去掉 border: 1px solid red; */ margin: 4px; }</style> <div class="banner"></div> <div class="pictures"> <div class="xxx"> <div class="picture"></div> <div class="picture"></div> <div class="picture"></div> <div class="picture"></div> <div class="picture"></div> <div class="picture"></div> <div class="picture"></div> </div> </div>
如图:
image
3、广告位布局——浮动+margin+clearfix清除浮动
代码如下:
<style>.art{ background: #ddd; width:800px; margin:0 auto; }.art > .sider{ float:left; border: 1px solid black; width:33.333333%; height:300px}.art > .main{ float:left; border: 1px solid black; width:66.333333%; height:300px}</style> <div class="art clearfix"> <div class="sider"> <div>广告1</div> </div> <div class="main"> <div>广告2</div> </div> </div>
如图:
image
广告位之间的间距如何处理:
方法1:采用内嵌一个div,定宽,float+margin-right进行间隙(这种方法似乎要兼容啊,做了很久弄不出,不弄了)
方法2:calc计算法+margin
<style>.art{ background: #ddd; width:800px; margin:0 auto; }.art > .sider{ float:left; width:calc( 33.333333% - 20px);/* calc计算法,此时右侧多出20px */ border: 1px solid black; height: 300px; margin-right: 20px; /* 用多出的20px,弥补上那块间隙 */}.art > .main{ float:left; border: 1px solid black; width:66.666666%; height:300px}</style> <div class="art clearfix"> <div class="sider"> <div>广告1</div> </div> <div class="main"> <div>广告2</div> </div> </div>`` 如图: ![image](http://upload-images.jianshu.io/upload_images/10836479-c71ea2780df177dc.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) **方法3:**flex布局(IE不支持) > a.父元素:**display:flex+justify-content:space-between** > b.父元素+子元素:**display:flex+margin-right:auto**
<style>
.art{
background: #ddd;
width:800px;
margin:0 auto;
display: flex; /* flex直接左右布局 /
justify-content: space-between;/ 第2种方法:将空隙放中间 /
}
.art > .sider{
width:calc( 33.333333% - 20px);
/ calc计算法,此时右侧多出20px /
border: 1px solid black;
height: 300px;
/ margin-right:auto; 第1种方法 */
}
.art > .main{
border: 1px solid black;
width:66.666666%;
height:300px
}
</style>
如图也是: ![image](http://upload-images.jianshu.io/upload_images/10836479-8dd64f8d595d41a5.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)#三、布局套路口诀(下) 移动端布局* 添加:meta:vp (tab键):
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
* 收起pc端导航: 删除定宽+*{margin:0; padding:0;} * 导航 PC和手机适配的问题
/* 导航PC和手机适配的问题 */
.parent .nav2{
display:none;
}
@media (max-width:420px){
.parent .nav2{
display:block;
}
.parent .nav{
display:none;
}
}
* banner适配移动端
/banner适配移动端/
.banner{
width:800px; /万恶的定宽 PC端必备/
height:300px;
background: #888;
margin-left: auto;
margin-right: auto;
margin-top: 10px;
}
@media (max-width:420px){
.banner{width:auto;}
}
* 图片板块适配移动端
/图片板块适配移动端/
.pictures{
width: 800px; /* 万恶的定宽PC端必备;定宽布局不够弹性 /
margin: 0 auto; /不能删1:居中/
overflow:hidden; / 避免溢出 */
}
@media (max-width:420px){
.pictures{width:auto;}
}
.pictures > .xxx{
display: flex; /* 弹性布局 /
flex-wrap: wrap; / 换行*/
margin: 0 -4px;
}
/图片板块适配移动端2/
.picture{
width: calc(25% - 8px);
height: 194px;
background: #ddd;
margin: 4px;
}
@media (max-width:420px){
.picture{
width: calc(50% - 8px);
}
}
* 广告位适配移动端
/广告位适配移动端/
.art{
background: #ddd;
width:800px; /万恶的定宽 PC端必备/
margin:0 auto;
display: flex; /* flex直接左右布局 /
justify-content: space-between;/ 第2种方法:将空隙放中间 */
}
@media (max-width:420px){
.art{
width: auto;
flex-direction:column;
}
}
.art > .sider{
width:calc( 33.333333% - 20px); /* calc计算法,此时右侧多出20px /
border: 1px solid black;
height: 300px;
/ margin-right:auto; 第1种方法 */
}
@media (max-width:420px){
.art > .sider{
width: auto;
height: auto;
}
}
.art > .main{
border: 1px solid black;
width:66.666666%;
height:300px
}
@media (max-width:420px){
.art > .main{
width: auto;
height: auto;
}
}
* 关于图片添加:(注:变形问题减少使用img)
**注:** > 代码总链接:[布局套路](http://js.jirengu.com/jufoz/4/edit?html,css) 固定比例div:图片1
作者:饥人谷_远方
链接:https://www.jianshu.com/p/48e5d0c4e0a5