CSS布局方式有很多,从远古时代的table(表格)布局-->float(浮动)布局-->position(定位)布局-->flex(弹性)布局-->grid(网格)布局(还未正式推出),下面咱们简单谈一谈各种布局的用法及其优缺点。
table布局就是将网站当做一个表单来做,这里不做展开,因为现在基本不这么用了。
float:浮动。float刚开始并不是为了用来网页布局,而是用来解决图文信息中图片与文本冲突的问题的。
如下图:
这种常见的图文效果,没有float之前是很难达到的。有了float之后只需要加一个float:left,轻松搞定。
‘咦,如果float可以处理图文的问题,那用来布局不也可以吗?’,后来有人用float试着用于网页布局,还真的可以。
网页中最常见的布局如下:
用float做
比table布局要方便不少,不过float随之而来的带来了 “浮动高度塌陷”的问题:
如果浮动元素的父元素没有设定高度,当其子元素浮动后,父元素就因为内部没有子元素撑起从而高度变为0;
引申:网页元素一般分为 普通流,浮动流,定位流。其中普通流和浮动流在一个层级上,定位流>浮动流>普通流。
之后为了解决这个问题搞出来一系列清除“浮动高度塌陷”的策略方法,非常麻烦。
position:定位;顾名思义,就是确定位置。position同样可以用做网页布局。
同样的效果
不过position需要计算每一个元素的位置,而且这个位置是定死的,略显繁琐和笨重。实际上position我平常只用来定位一些小的标签之类的东西。position优点在于不像float那样会影响其他元素。
关键点:子绝父相。需要定位的元素用absolute绝对定位,其父元素用 relative相对定位。还有fixed固定定位,他是以html为父元素的定位。
flex:弹性;弹性布局很好的解决了float和position的问题,非常好用。
使用方法:
在父元素使用 display:flex确定弹性作用的范围。
然后
justify-content:center(space-around,space-between等);水平方向布局;
align-items:center(flex-start,flex-end等)垂直方向布局;
不过flex不兼容IE8及以下的浏览器。
大部分情况下flex布局已经能满足需要,不过flex只能用作一维布局,也就是说,flex一次只能作用于一条线。如果想要进行二维布局,必须翻转坐标二次弹性,这样会显得不够优雅,这时候grid(网格)布局就发展起来了。
grid布局用法和flex相似,但是作用于二维布局。
先在父元素使用 display:grid确定网格作用范围;
然后
grid-template-columns: 40px 50px auto 50px 40px(行)
grid-template-rows: 25% 100px auto(列)
等等属性,这里只简单介绍,大家了解有这个东西就行。
在现实工作用,以flex为主,position辅助已经足够应对所有问题。
1,浮动的历史
在早期网页制作过程中,为了达到图片word文档那样的文字环绕效果,不至于图片和文字不在一行显示,图片占据一行,文字占据一行,这样的样式并不符合大众的审美观,浪费空间,所以w3c就创建了float这个css属性。
2,浮动的包裹性和破坏性
破坏性是指子级元素设置浮动后将会跳出父级元素,父级元素将不被浮动元素所撑开,除非清除浮动带来的影响。
包裹性是指子级元素设置浮动后,并且父元素已经被清除浮动后将会将子元素包裹住,就像inline-block一样。
4,浮动在布局中的应用
(1),双飞翼布局
双飞翼布局就是利用float和margin负值相结合的方式,将center定位到最中间,难点在于margin单位百分比的理解。
(2),圣杯布局
圣杯和双飞翼区别:
二者都是三栏自适应布局方案,圣杯布局是需要结合相对定位,用到left属性,而双飞翼布局只需要使用浮动和margin定位,前者三栏布局是每栏相互独立,而后者是center占据是100%,left和right是浮在center上的。
(2),两列布局
如图五图六所示,当左侧div左浮动,右侧div将会自动适应余下的宽度,当界面大小发生改变时,右侧div同样会随着变化,如果想让左右div中间有一个间距的话,我们可以用右侧div设置一个margin-left为:左侧div的宽度+间距。
如果想让左侧右侧同时自适应的话,我们可以让右侧元素BFC化,此时左侧元素div的marin-left才会有效,如果右侧div不BFC化的话,属于正常流,而浮动已经脱离正常流,所以此时它的margin-left是无效的。
5,清除浮动带来的影响的方法
(1),使用clear:both
.father:after{/*IE7和IE6不识别*/
content:''
display:block
clear:both
overflow:hidden
height:0
}
.father{
*zoom:1/*兼容IE7*/
}
(2),内部使用空标签
div{clear:both}
缺点是多了一个空标签,无意义。
(3),使用BFC
在子元素中使用overflow,position,inline-block,tabel-cell
(4),使用table
.father:after{/*IE7和IE6不识别*/
content:''
display:table
clear:both
}
.father{
*zoom:1/*兼容IE7*/
}
float 属性定义元素在哪个方向浮动。以往这个属性总应用于图像,使文本围绕在图像周围,不过在 CSS 中,任何元素都可以浮动。浮动元素会生成一个块级框,而不论它本身是何种元素。如果浮动非替换元素,则要指定一个明确的宽度;否则,它们会尽可能地窄。
注释:假如在一行之上只有极少的空间可供浮动元素,那么这个元素会跳至下一行,这个过程会持续到某一行拥有足够的空间为止。
float的值:
left元素向左浮动。
right元素向右浮动。
none默认值。元素不浮动,并会显示在其在文本中出现的位置。
inherit规定应该从父元素继承 float 属性的值。