CSS多列布局
需要注意的是:本篇文章的布局,都未对父元素进行清除浮动的操作,所以在有一些使用了float的布局中,需要在parent容器清除浮动,才能在实际情况下使用。(清除浮动的方式在这里不做讨论)
一列定宽一列自适应
这部分的html结构如下:
1 | <div class="parent"> |
大家先来看看直接在左侧添加浮动是怎么样的吧:
不要觉得诧异!因为float最开始的出现就是为了实现这个文字环绕效果的,只不过被攻城师们玩坏了,用到了布局上;但这肯定不是我们想要的,来看看我们想要的是怎么样的吧!
这样才对嘛!是我们想要的!下面就来看看css的实现吧:
1. float
+margin
1 | .left{ |
优点:兼容IE7+,便于理解;缺点:不兼容IE6,在right内部第一个元素存在清除浮动时,会发生right掉下去的情况。
一起来看看错误的例子:
怎么解决呢?
2. 改进版—float
+margin
+fix
优点:兼容性好,兼容所有浏览器;缺点:结构增加,样式复杂。
布局改变如下:
1 | <div class="parent"> |
css部分:
1 | .left{ |
3. float
+overflow
优点:设置简单;
1 | .left{ |
3. table
HTML结构还是和第一个一样。
优点:加速table渲染,实现布局优先;缺点:代码量大,复杂
1 | .parent{ |
4. flex
优点:结构简单;缺点:兼容性差iE10+,性能不好,常用作小范围布局
1 | .parent{ |
多列定宽一列自适应
大家来看看想要达到的效果:
其实只是在上面的布局上,中间再加入一个center。
html结构如下:
1 | <div class="parent"> |
css部分:把center设置和left一样
1 | .left,.center{ |
一列不定宽,一列自适应
HTML结构同一列定宽一列自适应。
其实就是对一列定宽,一列自适应的后三个进行一下改造
实现效果和上面一样,但是宽度不在固定了!
1. float
+overflow
优点:兼容性好,使用最多,结构简单;(其实和上面的改变就是左侧使用内容去撑开高度,因为原来的实现已经达到了这个效果)
1 | .left{ |
2. table
缺点:支持IE8+,设置复杂。
对css进行如下更改:
1 | .parent{ |
3. flex
缺点:还是上面的问题
1 | .parent{ |
两列不定宽,一列自适应。
HTML结构同两列定宽一列自适应。
以float+overflow
为例,只需要把center
设置和left
一样就可以了。
1 | .left,.center{ |
除了这个方法之外,上面的不定宽中的三个方法都能使用
等分布局
html结构如下:
1 | <div class="parent"> |
按照惯例,先来分析一下实现过程。可以看到下图:
其实我们只需要给父容器增加一个G,也就是一个负的margin就可以实现了,下面就来看看吧:
1. float
+margin
优点:设置简单;缺点:支持IE8+,在布局变更时,需改变css样式(width:XX%)结构和样式耦合在了一起
1 | p{background:#666;}/*对div中的p标签设置才有间隔效果,所以在设置内容时,也是在p中设置*/ |
实现效果如下:
效果不是就达到了呢?其实还不尽然,可以看到最左边还有一个宽度,我们不想要怎么办?
这并不是一个bug,而是我们的设置导致的,现在来删除上面的 padding-left: 20px;
吧,可以看到成了这样子:
如果你需要有填充的话,自行设置吧
2. table
+(fix)
html部分在上面的基础上,在最外层增加<div class="parent-fix">
包裹住<div class="parent">
1 | .parent-fix{ |
3. flex
1 | .parent{ |
实现效果如下:
这里使用的是margin,因为flex自动分配剩余空间
等高布局
大家先来看看想要的效果:
是不是很熟悉?html和第一部分一样:
但是两侧高度等同于高度最高的部分。
1 | <div class="parent"> |
在使用table
和flex
布局时就自然实现了等高布局
这里就不贴了,代码实现参考上面。主要是下面这个方案:
float
实现
实际上没有完全相同,只是达到了效果
1 | .parent{ |
再一次提醒:实际情况中使用,需要在外层容器清除浮动。