关键属性
float
浮动元素将会从文档的正常流中删除,但是不同于absolute和fixed定位,浮动元素还是会对正常流中的元素产生影响。 正常情况下浮动元素的表现有如下特点:
- 不会产生边距重叠
- 它的包含块是离它最近的块元素
- 会生成块级框架,即使它本身是行内元素 这是因为浮动会创建BFC(参见 W3C Block formatting contexts)
浮动元素的摆放有如下特点:
- 浮动元素不会超出他的包含块的content边界
- 浮动元素不会重叠
- 浮动元素不会一直上浮,他不会超过它之前的元素的顶端
- 左浮动元素必须尽可能的相左,右浮动元素必须尽可能的向右,并且尽可能的向上浮动,在满足其他约束条件的情况下
- 行内元素与浮动元素重叠时,它的边框背景和内容都在浮动元素之上显示
- 块级元素与一个浮动元素重叠时,它的边框和背景在浮动元素之下显示,而内容在它之上显示
float带来的问题以及清楚浮动这里不再赘述
position
static 默认值 元素位于正常流中
relative 相对定位 相对于元素本来的位置偏移 它原本所占的空间依然保留
absolute 绝对定位 元素将从文档流中删除 相对于它的position不是static的上级元素进行偏移 它将会生成一个块级框 即使它本身不是块级框 (同理 也是因为创建了BFC)
fixed 固定定位 表现相当于决定定位 但是它是相对于浏览器窗口进行偏移
margin
页面上的大部分间隔都是因为存在margin,而且margin不会破坏正常流,所以margin在布局中是一个很重要的属性。
margin可以设置为负值,这将会使元素超出他的父元素或者与其他元素重叠
垂直方向上的margin会产生合并,一般有三种情况,相邻元素,父元素和他的第一个或者最后一个子元素,空元素,一般会取两个margin中大的那个值。但值得注意的是浮动和绝对定位的元素的边距并不会合并
布局
三栏 两边定宽 中间自适应
双飞翼布局
{% jsfiddle hangbale/jtekk4ev html,css,result %}
双飞翼布局的优点不再赘述,这里的关键是,main需要设置浮动以及负边距的运用,
如果main不设置浮动,left是不能上移并且漂浮到左边的,同时浮动以后,这三个块可以看作是一个相左的浮动流,正常情况下,他们会从做到右排列一行,但是因为main的宽度是100%,导致left被挤下去了,使用负边距可以把它们相左拉回来。
圣杯布局
{% jsfiddle hangbale/na9aucLy html,css,result %}
可以看出,圣杯布局在实现三栏的布局上都使用了浮动和负边距,但在处理侧栏的位置上有所区别,圣杯布局使用相对定位使侧栏偏移不至于挡住main部分,相对来说,双飞翼布局的实现更加简洁。
flexbox
使用flex实现相当简单,需要注意的是main需要设置flex-grow,同时为了保证main的优先加载,需要设置order {% jsfiddle hangbale/fz6pvwo8 html,css,result %}
水平居中
text-align
在父级元素上使用text-align:center
即可,这种方法适用于inline和inline-block元素
margin
适用于有最大宽度限制的块级元素,可以使用
{
margin:0 auto;
width: 200px;
/* 或者 */
max-width: 200px;
}
float
单独使用float并不能实现居中。还需要配合相对定位或者负边距。浮动的特点是创建了BFC,浏览器会重新计算浮动元素的宽度
{% jsfiddle hangbale/Lv25ky2d html,css,result %}
container浮动以后,宽度就是子元素的宽度,然后将将他想对定位右移-50%;这个50%是相对于body的,然后inner左移50%,这个百分比相对于container,这就相当于inner先向右移动窗口宽度的一般,然后左移自身宽度的一般,也就达到了居中的效果,这里的相对定位也可以采用负边距来实现。
{% jsfiddle hangbale/rxz3Ln6v html,css,result %}
绝对定位
这种方法也极其常用,特别是在作弹出层的时候
{
position:absolute;
width: 500px;
left: -50%;
margin: 0 0 0 -250px;
}
这种只适用于定宽的元素,对于不定宽的元素可以使用css3的translate:-50%,因为translate的百分值是相对于自身的宽度的,或者也可以结合上面浮动的例子组合一下。
flexbox
.container {
display:flex;
}
.inner {
margin:auto;
}
flex太强大。这样可以实现水平和垂直方向上同时居中
垂直居中
padding填充
这种方式必须知道父元素的高度以及元素本身的高度,或者使用css3的calc计算,限制比较多
line-height
适用于高度确定的单行文本,设置line-height=height
table
需要搭配vertical-align属性使用,不需要定高,会根据元素内容动态增加高度,但是只兼容IE8及以上的浏览器 {% jsfiddle hangbale/8ko2sLsw html,css,result %}
position
原理上和绝对定位水平居中一样,两者组合可以实现水平和垂直同时居中 {% jsfiddle hangbale/17axt2np html,css,result %}
这里是使用的translate,适用于不知道不定宽高的元素,如果设置了宽高,可以使用负边距
flex
原理同水平居中,不再赘述
多列
在实现栅格系统的时候,就会用到多列布局。实现方式包括
- 浮动 Bootstrap的栅格系统就是使用的浮动。兼容性好
- table 难以控制样式
- inline-block 块与块之间会产生空隙,需要清除(可使用font-size:0)
页脚固定在底部
这个问题很常见,会有两种情况,内容区域不能完全撑开body以及内容区域完全撑开body。 如果使用position的话不能满足内容区域完全撑开body的情况。比较合适的方法是使用单独的DIV为内容区域占位 {% jsfiddle hangbale/yep4z3v7 html,css,result %}
这个方法还有好几种变形,从原理上来说都差不多,首先设置body高度100%,这是为了方便占位元素设置最小高度100%;从而满足内容区域不能完全撑开body的情况,然后需要把footer用负边距拉回。
还可以使用flex
{% jsfiddle hangbale/k0w56unn html,css,result %}