卍卍各种页面常见布局+知名网站实例分析+相关阅读推荐卍卍
卍卍阅前必看:本文总结了各种常见的布局实现,网上搜的“史上最全布局”好像也没有这么全吧?哈哈!就当作一个知识整理吧。至于每个方法的优缺点分析会陆续补上。还有就是这篇文章没提到的其他布局,待本人后续想到或遇到定会在此及时更新。各位读者如果发现问题或者有什么意见
卍卍在github上Markdown不支持目录,所以准备了一个在线demo文档。←点这里阅读(已附带目录)
[From github] https://github.com/Sweet-KK/css-layout(内容随时更新)
目录(PC端推荐用法后面加^P)
[TOC]
水平居中
一,二,三章都是parent+son的简单结构,html代码和效果图就不贴出来了,第四章以后才有
文本/行内/行内块级^P
原理:text-align只控制行内内容(文字、行内元素、行内块级元素)如何相对他的块父元素对齐
1 | #parent{text-align: center;} |
优缺点
- 优点:简单快捷,容易理解,兼容性非常好
- 缺点:只对行内内容有效;属性会继承影响到后代行内内容;如果子元素宽度大于父元素宽度则无效,但是后代行内内容中宽度小于设置text-align属性的元素宽度的时候,也会继承水平居中
单个块级元素^P
原理:根据规范介绍得很清楚了,有这么一种情况:在margin有节余的同时如果左右margin设置了auto,将会均分剩余空间。另外,如果上下的margin设置了auto,其计算值为0
1 | #son{ |
优缺点
- 优点:简单;兼容性好
- 缺点:必须定宽,并且值不能为auto;宽度要小于父元素,否则无效
多个块级元素
原理:text-align只控制行内内容(文字、行内元素、行内块级元素)如何相对他的块父元素对齐
1 | #parent{text-align: center;} |
优缺点
- 优点:简单,容易理解,兼容性非常好
- 缺点:只对行内内容有效;属性会继承影响到后代行内内容;块级改为inline-block换行、空格会产生元素间隔
使用position实现^P
原理:子绝父相,top、right、bottom、left的值是相对于父元素尺寸的,然后margin或者transform是相对于自身尺寸的,组合使用达到水平居中的目的
1 | #parent{ |
优缺点
- 优点:使用margin-left兼容性好;不管是块级还是行内元素都可以实现
- 缺点:代码较多;脱离文档流;使用margin-left需要知道宽度值;使用transform兼容性不好(ie9+)
任意个元素(flex)
原理:就是设置当前主轴对齐方式为居中。说不上为什么,flex无非就是主轴侧轴是重点,然后就是排列方式的设置,可以去看看文末的flex阅读推荐
1 | #parent{ |
优缺点
- 优点:功能强大;简单方便;容易理解
- 缺点:PC端兼容性不好,移动端(Android4.0+)
- flex务必带上兼容,写法请参考文末阅读推荐,也可以使用autoprefixer
★本章小结:
- 对于水平居中,我们应该先考虑,哪些元素有自带的居中效果,最先想到的应该就是
text-align:center了,但是这个只对行内内容有效,所以我们要使用text-align:center就必须将子元素设置为display: inline;或者display: inline-block;; - 其次就是考虑能不能用
margin: 0 auto;,因为这都是一两句代码能搞定的事,实在不行就是用绝对定位去实现了; - 移动端能用flex就用flex,简单方便,灵活并且功能强大,无愧为网页布局的一大利器!务必带上兼容,写法可参考文末阅读推荐,也可以使用Autoprefixer。
垂直居中
一,二,三章都是parent+son的简单结构,html代码和效果图就不贴出来了,第四章以后才有
单行文本/行内/行内块级^P
原理:line-height的最终表现是通过inline box实现的,而无论inline box所占据的高度是多少(无论比文字大还是比文字小),其占据的空间都是与文字内容公用水平中垂线的。
1 | #parent{ |
优缺点
- 优点:简单;兼容性好
- 缺点:只能用于单行行内内容;要知道高度的值
多行文本/行内/行内块级
原理同上
1 | #parent{ /*或者用span把所有文字包裹起来,设置display:inline-block转换成图片的方式解决*/ |
优缺点
- 优点:简单;兼容性好
- 缺点:只能用于行内内容;需要知道高度和最终呈现多少行来计算出line-height的值,建议用span包裹多行文本
图片^P
原理:vertical-align和line-height的基友关系
1 | #parent{ |
优缺点
- 优点:简单;兼容性好
- 缺点:需要添加
font-size: 0;才可以完全的垂直居中;不过需要注意html中#parent包裹img之间需要有换行或空格;熟悉line-height和vertical-align的基友关系较难
单个块级元素
html代码:
1 | <div id="parent"> |
使用tabel-cell实现:
原理:CSS Table,使表格内容垂直对齐方式为middle
1 | #parent{ |
优缺点
- 优点:简单;适用于宽度高度未知情况;兼容性好(ie8+)
- 缺点:设置tabl-cell的元素,宽度和高度的值设置百分比无效,需要给它的父元素设置
display: table;才生效;table-cell不感知margin,在父元素上设置table-row等属性,也会使其不感知height;设置float或position会对默认布局造成破坏,可以考虑为之增加一个父div定义float等属性;内容溢出时会自动撑开父元素
使用position实现:^P
1 | /*原理:子绝父相,top、right、bottom、left的值是相对于父元素尺寸的,然后margin或者transform是相对于自身尺寸的,组合使用达到水平居中的目的*/ |
使用flex实现:
原理:flex设置排列方式、对齐方式罢了,请查阅文末flex阅读推荐
1 | #parent{ |
优缺点
- 优点:简单灵活;功能强大
- 缺点:PC端兼容性不好,移动端(Android4.0+)
- flex务必带上兼容,写法请参考文末阅读推荐,也可以使用autoprefixer
任意个元素(flex)
原理:flex设置对齐方式罢了,请查阅文末flex阅读推荐
1 | #parent{ |
优缺点
- 优点:简单灵活;功能强大
- 缺点:PC端兼容性不好,移动端(Android4.0+)
★本章小结:
- 对于垂直居中,最先想到的应该就是
line-height了,但是这个只能用于行内内容; - 其次就是考虑能不能用
vertical-align: middle;,不过这个一定要熟知原理才能用得顺手,建议看下vertical-align和line-height的基友关系 ; - 然后便是绝对定位,虽然代码多了点,但是胜在适用于不同情况;
- 移动端兼容性允许的情况下能用flex就用flex,务必带上兼容,写法可参考文末阅读推荐,也可以使用Autoprefixer。
水平垂直居中
一,二,三章都是parent+son的简单结构,html代码和效果图就不贴出来了,第四章以后才有
行内/行内块级/图片^P
原理:text-align: center; 控制行内内容相对于块父元素水平居中,然后就是line-height和vertical-align的基友关系使其垂直居中,font-size: 0; 是为了消除近似居中的bug
1 | #parent{ |
优缺点
- 优点:代码简单;兼容性好(ie8+)
- 缺点:只对行内内容有效;需要添加
font-size: 0;才可以完全的垂直居中;不过需要注意html中#parent包裹#son之间需要有换行或空格;熟悉line-height和vertical-align的基友关系较难
table-cell
原理:CSS Table,使表格内容垂直对齐方式为middle,然后根据是行内内容还是块级内容采取不同的方式达到水平居中
1 | #parent{ |
优缺点
- 优点:简单;适用于宽度高度未知情况;兼容性好(ie8+)
- 缺点:设置tabl-cell的元素,宽度和高度的值设置百分比无效,需要给它的父元素设置
display: table;才生效;table-cell不感知margin,在父元素上设置table-row等属性,也会使其不感知height;设置float或position会对默认布局造成破坏,可以考虑为之增加一个父div定义float等属性;内容溢出时会自动撑开父元素
button作为父元素
原理:button的默认样式,再把需要居中的元素表现形式改为行内或行内块级就好
1 | button#parent{ /*改掉button默认样式就好了,不需要居中处理*/ |
优缺点
- 优点:简单方便,充分利用默认样式
- 缺点:只适用于行内内容;需要清除部分默认样式;水平垂直居中兼容性很好,但是ie下点击会有凹陷效果!
绝对定位^P
原理:子绝父相,top、right、bottom、left的值是相对于父元素尺寸的,然后margin或者transform是相对于自身尺寸的,组合使用达到几何上的水平垂直居中
1 | #parent{position: relative;} |
优缺点
- 优点:使用margin兼容性好;不管是块级还是行内元素都可以实现
- 缺点:代码较多;脱离文档流;使用margin需要知道宽高;使用transform兼容性不好(ie9+)
绝对居中^P
原理:当top、bottom为0时,margin-top&bottom设置auto的话会无限延伸占满空间并且平分;当left、right为0时,margin-left&right设置auto的话会无限延伸占满空间并且平分
1 | #parent{position: relative;} |
优缺点
- 优点:无需关注宽高;兼容性较好(ie8+)
- 缺点:代码较多;脱离文档流
flex
原理:flex设置排列方式、对齐方式罢了,请查阅文末flex阅读推荐
1 | #parent{display: flex;} |
优缺点
- 优点:简单灵活;功能强大
- 缺点:PC端兼容性不好,移动端(Android4.0+)
- flex务必带上兼容,写法请参考文末阅读推荐,也可以使用autoprefixer
视窗居中
原理:vh为视口单位,视口即文档可视的部分,50vh就是视口高度的50/100,设置50vh上边距再
1 | #son{ |
优缺点
- 优点:简单;容易理解;两句代码达到屏幕水平垂直居中
- 缺点:兼容性不好(ie9+,Android4.4+)
★本章小结:
- 一般情况下,水平垂直居中,我们最常用的就是绝对定位加负边距了,缺点就是需要知道宽高,使用transform倒是可以不需要,但是兼容性不好(ie9+);
- 其次就是绝对居中,绝对定位设置top、left、right、bottom为0,然后
margin:auto;让浏览器自动平分边距以达到水平垂直居中的目的; - 如果是行内/行内块级/图片这些内容,可以优先考虑
line-height和vertical-align结合使用,不要忘了还有text-align,这个方法代码其实不多,就是理解原理有点困难,想要熟练应对各种情况还需好好研究; - 移动端兼容性允许的情况下能用flex就用flex,务必带上兼容,写法可参考文末阅读推荐,也可以使用Autoprefixer。
两列布局
左列定宽,右列自适应
效果:

利用float+margin^P
html代码:
1 | <body> |
css代码:
1 | #left { |
原理:#left左浮动,脱离文档流,#right为了不被#left挡住,设置margin-left大于等于#left的宽度达到视觉上的两栏布局
优缺点
- 优点:代码简单;容易理解;兼容性好
- 缺点:#left的宽度和#right的margin-left需要对应且固定
利用float+margin(fix)
html代码:
1 | <body> |
css代码:
1 | #left { |
优缺点
- 优点:代码较简单;兼容性好
- 缺点:相比(1)的方法,多了一个div,多写了一些代码;不容易理解;margin需要对应好
使用float+overflow^P
html代码:
1 | <body> |
css代码:
1 | #left { |
原理:#left左浮动,#right触发bfc达到自适应
优缺点:
- 优点:代码简单;容易理解;无需关注定宽的宽度,利用bfc达到自适应效果
- 缺点:#right设置margin-left需要大于#left的宽度才有效,或者直接给#left设置margin-right
使用table实现
html代码:
1 | <div id="parent"> |
css代码:
1 | #parent{ |
原理:CSS Table以表格的形式显示
优缺点:
- 优点:代码简单;容易理解;适用于宽度高度未知情况;兼容性好(ie8+)
- 缺点:margin失效;设置间隔比较麻烦;设置tabl-cell的元素,宽度和高度的值设置百分比无效,需要给它的父元素设置
display: table;才生效;table-cell不感知margin,在父元素上设置table-row等属性,也会使其不感知height;设置float或position会对默认布局造成破坏,可以考虑为之增加一个父div定义float等属性;内容溢出时会自动撑开父元素
使用position实现
html代码:
1 | <body> |
css代码:
1 | #parent{position: relative;} /*父相*/ |
原理:利用绝对定位算好宽高固定好两个盒子的位置
优缺点
- 优点:容易理解;兼容性好
- 代码较多;脱离文档流;左边盒子的width需要对应右边盒子的left值
使用flex实现
html代码:
1 | <body> |
css代码:
1 | #parent{ |
原理:flex设置排列方式、对齐方式罢了,请查阅文末flex阅读推荐
优缺点
- 优点:简单灵活;功能强大
- 缺点:PC端兼容性不好,移动端(Android4.0+)
- flex务必带上兼容,写法请参考文末阅读推荐,也可以使用autoprefixer
使用Grid实现
html代码:
1 | <body> |
css代码:
1 | #parent { |
原理:css grid布局,请查看文末的阅读推荐
优缺点
- 优点:灵活划分网格区域;新型布局利器,适用于页面三维布局
- 缺点:兼容性不好,移动端(Android5.0+)
左列自适应,右列定宽
效果:

使用float+margin^P
html代码:
1 | <body> |
css代码:
1 | #parent{ |
原理:一个左浮一个右浮,#left宽度100%所以要设置margin-left负值让#right上来一行,然后#parent设置padding-left的正值抵消掉#left的位移,此处换成margin也可以
优缺点
- 优点:代码简单;兼容性好;
- 缺点:较难理解;margin或padding的值要对应好;浮动脱离文档流,需要手动清除浮动,否则会产生高度塌陷
使用float+overflow^P
html代码:
1 | <body> |
css代码:
1 | #left { |
原理:#right右浮动,#left触发bfc达到自适应
优缺点:
- 优点:代码简单;容易理解;无需关注定宽的宽度,利用bfc达到自适应效果
- 缺点:#left设置margin-right需要大于#right的宽度才有效,或者直接给#right设置margin-left
使用table实现
html代码:
1 | <body> |
css代码:
1 | #parent{ |
原理:CSS Table以表格的形式显示
优缺点:
- 优点:代码简单;容易理解;适用于宽度高度未知情况;兼容性好(ie8+)
- 缺点:margin失效;设置间隔比较麻烦;设置tabl-cell的元素,宽度和高度的值设置百分比无效,需要给它的父元素设置
display: table;才生效;table-cell不感知margin,在父元素上设置table-row等属性,也会使其不感知height;设置float或position会对默认布局造成破坏,可以考虑为之增加一个父div定义float等属性;内容溢出时会自动撑开父元素
使用position实现
html代码:
1 | <body> |
css代码:
1 | #parent{position: relative;} /*父相*/ |
原理:利用绝对定位算好宽高固定好两个盒子的位置
优缺点
- 优点:容易理解;兼容性好
- 代码较多;脱离文档流;左边盒子的right需要对应右边盒子的width值
使用flex实现
html代码:
1 | <body> |
css代码:
1 | #parent{ |
原理:flex设置排列方式、对齐方式罢了,请查阅文末flex阅读推荐
优缺点
- 优点:简单灵活;功能强大
- 缺点:PC端兼容性不好,移动端(Android4.0+)
- flex务必带上兼容,写法请参考文末阅读推荐,也可以使用autoprefixer
使用Grid实现
html代码:
1 | <body> |
css代码:
1 | #parent { |
原理:css grid布局,请查看文末的阅读推荐
优缺点
- 优点:灵活划分网格区域;新型布局利器,适用于页面三维布局
- 缺点:兼容性不好,移动端(Android5.0+)
一列不定,一列自适应
(盒子宽度随着内容增加或减少发生变化,另一个盒子自适应)
效果图:

变化后:

使用float+overflow^P
html代码:
1 | <body> |
css代码:
1 | #left { |
原理:#left不设宽度左浮动,#right触发bfc达到自适应
优缺点:
- 优点:代码简单,容易理解,无需关注宽度,利用bfc达到自适应效果
- 缺点:#right设置margin-left需要大于#left的宽度才有效,或者直接给#left设置margin-right
使用flex实现
html代码:
1 | <body> |
css代码:
1 | #parent{display: flex;} |
原理:flex设置排列方式、对齐方式罢了,请查阅文末flex阅读推荐
优缺点
- 优点:简单灵活;功能强大
- 缺点:PC端兼容性不好,移动端(Android4.0+)
- flex务必带上兼容,写法请参考文末阅读推荐,也可以使用autoprefixer
使用Grid实现
html代码:
1 | <body> |
css代码:
1 | #parent{ |
原理:css grid布局,请查看文末的阅读推荐
优缺点
- 优点:灵活划分网格区域;新型布局利器,适用于页面三维布局
- 缺点:兼容性不好,移动端(Android5.0+)
★本章小结:
- 两列布局我们用得比较多的就是浮动,然后最简单就是把另外那个不是浮动的盒子触发bfc以达到自适应效果就O了。其次就是设置对应固宽值的的一些margin、padding去改变盒子的排布以达到我们的目的;
- 除了浮动,我们还可以用绝对定位,计算好宽高、位置去设置样式,这个简单也容易理解,就是脱离文档流并且代码稍微多了一点;
- 还有就是css table布局,其实这个挺强大的,也简单,兼容性不错(ie8+),但就是table表现的bug太多,不感知margin之类的一些属性。当然,要是需求足够,完全是可以先考虑这个的;
- 移动端兼容性允许的情况下能用flex就用flex,务必带上兼容,写法可参考文末阅读推荐,也可以使用Autoprefixer;
- 左列自适应,右列不定宽同理(参考4.1和4.3对应代码示例)。
三列布局
两列定宽,一列自适应
效果图:

使用float+margin
html代码:
1 | <body> |
css代码:
1 | #parent{min-width: 310px;} /*100+10+200,防止宽度不够,子元素换行*/ |
原理:两个盒子浮动,另一个盒子计算好两个盒子的宽度、间隔之和设置一个margin值
优缺点
- 优点:代码简单;容易理解;兼容性好
- 缺点:margin或padding的值要对应好;父元素宽度不够浮动元素会换行
使用float+overflow^P
html代码:
1 | <body> |
css代码:
1 | #parent{min-width: 320px;} /*100+10+200+20,防止宽度不够,子元素换行*/ |
原理:两个盒子浮动,另一个盒子触发bfc达到自适应
优缺点:
- 优点:代码简单,容易理解,无需关注定宽的宽度,利用bfc达到自适应效果
- 缺点:#right设置margin-left需要大于左边两个盒子宽度、间隔之和才有效。或者直接给#center设置margin-right;父元素宽度不够,浮动元素换行
使用position实现^P
html代码:
1 | <body> |
css代码:
1 | #parent {position: relative;} /*父相*/ |
原理:计算好盒子的宽度和间隔去设置位置
优缺点:
- 优点:容易理解;兼容性比较好;改变相对灵活
- 缺点:需手动计算宽度、间隔之和确定位置;
使用table实现^P
html代码:
1 | <body> |
css代码:
1 | #parent { |
原理:CSS Table以表格的形式显示
优缺点:
- 优点:代码简单;容易理解;适用于宽度高度未知情况;兼容性好(ie8+)
- 缺点:margin失效;设置间隔比较麻烦;设置tabl-cell的元素,宽度和高度的值设置百分比无效,需要给它的父元素设置
display: table;才生效;table-cell不感知margin,在父元素上设置table-row等属性,也会使其不感知height;设置float或position会对默认布局造成破坏,可以考虑为之增加一个父div定义float等属性;内容溢出时会自动撑开父元素
使用flex实现
html代码:
1 | <body> |
css代码:
1 | #parent { |
原理:flex设置排列方式、对齐方式罢了,请查阅文末flex阅读推荐
优缺点
- 优点:简单灵活;功能强大
- 缺点:PC端兼容性不好,移动端(Android4.0+)
- flex务必带上兼容,写法请参考文末阅读推荐,也可以使用autoprefixer
使用Grid实现
html代码:
1 | <body> |
css代码:
1 | #parent { |
原理:css grid布局,请查看文末的阅读推荐
优缺点
- 优点:灵活划分网格区域;新型布局利器,适用于页面三维布局
- 缺点:兼容性不好,移动端(Android5.0+)
两侧定宽,中间自适应
双飞翼布局方法^P
效果图:

html代码:
1 | <body> |
css代码:
1 | #header { |
圣杯布局方法
效果图:

html代码:
1 | <body> |
css代码:
1 | #header{ |
使用Grid实现
效果图:

html代码:
1 | <body> |
css代码:
1 | #parent { |
原理:css grid布局,请查看文末的阅读推荐
优缺点
- 优点:灵活划分网格区域;新型布局利器,适用于页面三维布局
- 缺点:兼容性不好,移动端(Android5.0+)
其他方法
效果图:

使用table实现^P
html代码:
1 | <body> |
css代码:
1 | #parent { |
原理:CSS Table以表格的形式显示
优缺点:
- 优点:代码简单;容易理解;适用于宽度高度未知情况;兼容性好(ie8+)
- 缺点:margin失效;设置间隔比较麻烦;设置tabl-cell的元素,宽度和高度的值设置百分比无效,需要给它的父元素设置
display: table;才生效;table-cell不感知margin,在父元素上设置table-row等属性,也会使其不感知height;设置float或position会对默认布局造成破坏,可以考虑为之增加一个父div定义float等属性;内容溢出时会自动撑开父元素
使用flex实现
html代码:
1 | <body> |
css代码:
1 | #parent { |
原理:flex设置排列方式、对齐方式罢了,请查阅文末flex阅读推荐
优缺点
- 优点:简单灵活;功能强大
- 缺点:PC端兼容性不好,移动端(Android4.0+)
- flex务必带上兼容,写法请参考文末阅读推荐,也可以使用autoprefixer
使用position实现^P
html代码:
1 | <body> |
css代码:
1 | #parent {position: relative;} /*父相*/ |
原理:计算好盒子的宽度和间隔去设置位置
优缺点:
- 优点:容易理解;代码相对其他方法较少;兼容性比较好;改变相对灵活
- 缺点:需手动计算宽度、间隔之和确定边距;
★本章小结:
- 两列定宽,一列自适应布局,个人推荐方法就是两列浮动,一列触发bfc去达到自适应效果,代码较少,需要注意的就是清除浮动和margin的设置以及父元素空间是否足够;
- 只要是三列布局,其实都可以用绝对定位去实现,理解起来不难,而且变化灵活,不太好的就是脱离文档流,导致不一定能撑起父元素高度,对于下面排布的盒子会有影响,还有需要手动计算边距的值去排布盒子;
- 其次可以选用css table布局,代码是最少的,就是bug有点多;
- 两侧定宽,中间自适应,就必须得说说圣杯布局和双飞翼布局,这两个是比较难理解的,然后圣杯布局有缺陷,如果浏览器无限变窄,圣杯布局将会乱套。绝对定位布局在不等高的时候也会对下面盒子排布产生影响。那么双飞翼布局似乎是最好的选择了。不管怎样,圣杯布局和双飞翼布局都是要好好学习的,这样对盒模型和浮动会有更深的理解;
- 移动端兼容性允许的情况下能用flex就用flex,务必带上兼容,写法可参考文末阅读推荐,也可以使用Autoprefixer;
多列布局
等宽布局
四列等宽
使用float实现^P
效果图:

html代码:
1 | <body> |
css代码:
1 | /*使整体内容看起来居中,抵消padding-left的影响*/ |
原理:根据父元素空间宽度平分,子元素设置浮动,用padding去模拟间隔,再给父元素一个位移抵消第一个间隔
优缺点:
- 优点:代码简单,容易理解;兼容性较好(ie8+)
- 缺点:需要手动清除浮动,否则会产生高度塌陷;由于是百分比平分宽度不能设置margin,否则占位超出父元素宽度换行显示
使用table实现^P
效果图:

html代码:
1 | <body> |
css代码:
1 | #parent { |
原理:CSS Table以表格的形式显示
优缺点:
- 优点:代码简单;容易理解;适用于宽度高度未知情况;兼容性好(ie8+)
- 缺点:margin失效;设置间隔比较麻烦;设置tabl-cell的元素,宽度和高度的值设置百分比无效,需要给它的父元素设置
display: table;才生效;table-cell不感知margin,在父元素上设置table-row等属性,也会使其不感知height;设置float或position会对默认布局造成破坏,可以考虑为之增加一个父div定义float等属性;内容溢出时会自动撑开父元素
使用flex实现
效果图:

html代码:
1 | <body> |
css代码:
1 | #parent { |
原理:flex设置排列方式、对齐方式罢了,请查阅文末flex阅读推荐
优缺点
- 优点:简单灵活;功能强大
- 缺点:PC端兼容性不好,移动端(Android4.0+)
- flex务必带上兼容,写法请参考文末阅读推荐,也可以使用autoprefixer
多列等宽
效果图:

使用float实现^P
html代码:
1 | <body> |
css代码:
1 | #parent {height: 500px;} |
原理:根据父元素空间宽度平分,子元素设置浮动,用padding去模拟间隔,再给父元素一个位移抵消第一个间隔
优缺点:
- 优点:代码简单,容易理解;兼容性较好(ie8+)
- 缺点:需要手动清除浮动,否则会产生高度塌陷;由于是百分比平分宽度不能设置margin,否则占位超出父元素宽度换行显示
使用table实现^P
html代码
1 | <body> |
css代码:
1 | #parent { |
原理:CSS Table以表格的形式显示
优缺点:
- 优点:代码简单;容易理解;适用于宽度高度未知情况;兼容性好(ie8+)
- 缺点:margin失效;设置间隔比较麻烦;设置tabl-cell的元素,宽度和高度的值设置百分比无效,需要给它的父元素设置
display: table;才生效;table-cell不感知margin,在父元素上设置table-row等属性,也会使其不感知height;设置float或position会对默认布局造成破坏,可以考虑为之增加一个父div定义float等属性;内容溢出时会自动撑开父元素
使用flex实现
html代码:
1 | <body> |
css代码:
1 | #parent { |
原理:flex设置排列方式、对齐方式罢了,请查阅文末flex阅读推荐
优缺点
- 优点:简单灵活;功能强大
- 缺点:PC端兼容性不好,移动端(Android4.0+)
- flex务必带上兼容,写法请参考文末阅读推荐,也可以使用autoprefixer
使用Grid实现
html代码:
1 | <body> |
css代码:
1 | #parent { |
原理:css grid布局,请查看文末的阅读推荐
优缺点
- 优点:灵活划分网格区域;新型布局利器,适用于页面三维布局
- 缺点:兼容性不好,移动端(Android5.0+)
九宫格布局
效果图:

使用table实现^P
html代码:
1 | <body> |
css代码:
1 | #parent { |
原理:CSS Table以表格的形式显示
优缺点:
- 优点:代码简单;容易理解;适用于宽度高度未知情况;兼容性好(ie8+)
- 缺点:margin失效;设置间隔比较麻烦;设置tabl-cell的元素,宽度和高度的值设置百分比无效,需要给它的父元素设置
display: table;才生效;table-cell不感知margin,在父元素上设置table-row等属性,也会使其不感知height;设置float或position会对默认布局造成破坏,可以考虑为之增加一个父div定义float等属性;内容溢出时会自动撑开父元素
使用flex实现
html代码:
1 | <body> |
css代码:
1 | #parent { |
原理:flex设置排列方式、对齐方式罢了,请查阅文末flex阅读推荐
优缺点
- 优点:简单灵活;功能强大
- 缺点:PC端兼容性不好,移动端(Android4.0+)
- flex务必带上兼容,写法请参考文末阅读推荐,也可以使用autoprefixer
使用Grid实现
CSS Grid非常强大,可以实现各种各样的三维布局,可查阅本文结尾的阅读推荐
html代码:
1 | <body> |
css代码:
1 | #parent { |
栅格系统^P
优缺点:
- 优点:代码简洁,容易理解;提高页面内容的流动性,能适应多种设备;
- 缺点:浮动脱离文档流,需要清除浮动;由于是百分比平分宽度不能设置margin,否则占位超出父元素宽度换行显示
用Less生成
1 | /*生成栅格系统*/ |
编译后的CSS代码:
1 | @media screen and (max-width: 768px) { |
★本章小结:
- 对于多列等宽布局,目前常用的还是浮动,宽度按百分比去平分。要是百分比的话就不太好设置margin,只能用padding去模拟间隔。又或者是固定宽度,计算好间隔,刚好填满或接近填满,这样倒是可以直接设置margin;
- 除了浮动,其实还可以用到inline-block,但是要注意html换行或空格都会占位,有可能导致空间不够换行显示,这样就要给父元素设置一个font-size:0,然后再给设置inline-block的盒子设置所需要大小的font-size;
- 然后就是css table布局了,想划分多少列都可以,灵活简单,就是一些不感知属性要注意;
- 移动端兼容性允许的情况下能用flex就用flex,务必带上兼容,写法可参考文末阅读推荐,也可以使用Autoprefixer;
全屏布局
效果图:

使用position实现^P
html代码:
1 | <body> |
css代码:
1 | html, body, #parent {height: 100%;overflow: hidden;} |
原理:计算好盒子的宽度和间隔去设置位置
优缺点:
- 优点:容易理解;兼容性好
- 缺点:代码繁多;需要计算好各个盒子的位置;
使用flex实现
html代码:
1 | <body> |
css代码:
1 | *{ |
原理:flex设置排列方式、对齐方式罢了,请查阅文末flex阅读推荐
优缺点
- 优点:简单灵活;功能强大
- 缺点:PC端兼容性不好,移动端(Android4.0+)
- flex务必带上兼容,写法请参考文末阅读推荐,也可以使用autoprefixer
使用Grid实现
html代码:
1 | <body> |
css代码:
1 | *{ |
原理:css grid布局,请查看文末的阅读推荐
优缺点
- 优点:灵活划分网格区域;新型布局利器,适用于页面三维布局
- 缺点:兼容性不好,移动端(Android5.0+)
网站实例布局
由于方法众多,分析的时候想到哪种用哪种了,只要IE9和谷歌上表现一致,我就不一一测试其他浏览器了,如果有什么问题或意见,请留言!
小米官网
兼容IE9+的方法
页面整体
经过测试,小米PC端官网不是整个页面我们可以分成顶、上、中、下、底五个结构,如图所示:

html代码:
1 | <body> |
css代码:
1 | *{ /*为了方便,就这样清空默认样式了*/ |
局部——header
header部分首先是一个水平居中的内容,内容盒子可以分成左右两个部分,如图所示:

html代码:
1 | <div class="header"> |
css代码:
1 | .container{ /*后面会继续用到*/ |
局部——top
top部分先有一个水平居中的内容,再就是内容由上到下可以分成四个部分,然后每个部分再细分……说不下去了,直接上图:

html代码:
1 | <div class="top"> |
css代码:
1 | .top { |
局部——center
center部分都是一些单元格展示,有很多类似的模块,就挑几个来实现了,直接看图吧:



html代码:
1 | <div class="center"> |
css代码:
1 | .center { |
局部——bottom
bottom部分首先是一个水平居中的内容,然后内容可以划分为上下两部分,每个部分都是浮动的li,如图:

html代码:
1 | <div class="bottom"> |
css代码:
1 | .bottom { |
局部——footer
footer划分如图:

html代码:
1 | <div class="footer"> |
css代码:
1 | .footer { |
全部代码(优化后)
html代码:
1 | <body> |
css代码:
1 | /*-------------------抽取公共样式-----------------*/ |
以上就是优化后的全部代码了,由于在下才疏学浅,所用方法仅仅是其中一种思路而已,至于够不够简单,优化怎么样,各位参考参考就好。
Flexbox+Grid(未来…)
html代码:
1 | <body> |
css代码:
1 | /*-------------------抽取公共样式-----------------*/ |
其他补充
移动端viewport
设置viewport:
1 | <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"> |
阅读推荐:
媒体查询
代码示例:
1 | @media (max-width: 767px) { ...css代码... } |
阅读推荐:
REM
阅读推荐:
Flexbox
阅读推荐:
CSS Grid
阅读推荐:
End:感谢(感谢作者书写整理,开头已说明出处,别无他意,仅供自己参考学习)
