css基础精华---Flex 布局教程:实例篇
转载地址:http://www.ruanyifeng.com/blog/2015/07/flex-examples.html
http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html
上一篇文章介绍了Flex布局的语法,今天介绍常见布局的Flex写法。
你会看到,不管是什么布局,Flex往往都可以几行命令搞定。
我只列出代码,详细的语法解释请查阅《Flex布局教程:语法篇》。我的主要参考资料是Landon Schropp的文章和Solved by Flexbox。
一、骰子的布局
骰子的一面,最多可以放置9个点。
下面,就来看看Flex如何实现,从1个点到9个点的布局。你可以到codepen查看Demo。
如果不加说明,本节的HTML模板一律如下。
<div class="box"><span class="item"></span> </div>
上面代码中,div元素(代表骰子的一个面)是Flex容器,span元素(代表一个点)是Flex项目。如果有多个项目,就要添加多个span元素,以此类推。
1.1 单项目
首先,只有左上角1个点的情况。Flex布局默认就是首行左对齐,所以一行代码就够了。
.box {display: flex; }
设置项目的对齐方式,就能实现居中对齐和右对齐。
.box {display: flex;justify-content: center; }
.box {display: flex;justify-content: flex-end; }
设置交叉轴对齐方式,可以垂直移动主轴。
.box {display: flex;align-items: center; }
.box {display: flex;justify-content: center;align-items: center; }
.box {display: flex;justify-content: center;align-items: flex-end; }
.box {display: flex;justify-content: flex-end;align-items: flex-end; }
1.2 双项目
.box {display: flex;justify-content: space-between; }
.box {display: flex;flex-direction: column;justify-content: space-between; }
.box {display: flex;flex-direction: column;justify-content: space-between;align-items: center; }
.box {display: flex;flex-direction: column;justify-content: space-between;align-items: flex-end; }
.box {display: flex; }.item:nth-child(2) {align-self: center; }
.box {display: flex;justify-content: space-between; }.item:nth-child(2) {align-self: flex-end; }
1.3 三项目
.box {display: flex; }.item:nth-child(2) {align-self: center; }.item:nth-child(3) {align-self: flex-end; }
1.4 四项目
.box {display: flex;flex-wrap: wrap;justify-content: flex-end;align-content: space-between; }
HTML代码如下。
<div class="box"><div class="column"><span class="item"></span><span class="item"></span></div><div class="column"><span class="item"></span><span class="item"></span></div> </div>
CSS代码如下。
.box {display: flex;flex-wrap: wrap;align-content: space-between; }.column {flex-basis: 100%;display: flex;justify-content: space-between; }
1.5 六项目
.box {display: flex;flex-wrap: wrap;align-content: space-between; }
.box {display: flex;flex-direction: column;flex-wrap: wrap;align-content: space-between; }
HTML代码如下。
<div class="box"><div class="row"><span class="item"></span><span class="item"></span><span class="item"></span></div><div class="row"><span class="item"></span></div><div class="row"><span class="item"></span><span class="item"></span></div> </div>
CSS代码如下。
.box {display: flex;flex-wrap: wrap; }.row{flex-basis: 100%;display:flex; }.row:nth-child(2){justify-content: center; }.row:nth-child(3){justify-content: space-between; }
1.6 九项目
.box {display: flex;flex-wrap: wrap; }
二、网格布局
2.1 基本网格布局
最简单的网格布局,就是平均分布。在容器里面平均分配空间,跟上面的骰子布局很像,但是需要设置项目的自动缩放。
HTML代码如下。
<div class="Grid"><div class="Grid-cell">...</div><div class="Grid-cell">...</div><div class="Grid-cell">...</div> </div>
CSS代码如下。
.Grid {display: flex; }.Grid-cell {flex: 1; }
2.2 百分比布局
某个网格的宽度为固定的百分比,其余网格平均分配剩余的空间。
HTML代码如下。
<div class="Grid"><div class="Grid-cell u-1of4">...</div><div class="Grid-cell">...</div><div class="Grid-cell u-1of3">...</div> </div>
.Grid {display: flex; }.Grid-cell {flex: 1; }.Grid-cell.u-full {flex: 0 0 100%; }.Grid-cell.u-1of2 {flex: 0 0 50%; }.Grid-cell.u-1of3 {flex: 0 0 33.3333%; }.Grid-cell.u-1of4 {flex: 0 0 25%; }
三、圣杯布局
圣杯布局(Holy Grail Layout)指的是一种最常见的网站布局。页面从上到下,分成三个部分:头部(header),躯干(body),尾部(footer)。其中躯干又水平分成三栏,从左到右为:导航、主栏、副栏。
HTML代码如下。
<body class="HolyGrail"><header>...</header><div class="HolyGrail-body"><main class="HolyGrail-content">...</main><nav class="HolyGrail-nav">...</nav><aside class="HolyGrail-ads">...</aside></div><footer>...</footer> </body>
CSS代码如下。
.HolyGrail {display: flex;min-height: 100vh;flex-direction: column; }header, footer {flex: 1; }.HolyGrail-body {display: flex;flex: 1; }.HolyGrail-content {flex: 1; }.HolyGrail-nav, .HolyGrail-ads {/* 两个边栏的宽度设为12em */flex: 0 0 12em; }.HolyGrail-nav {/* 导航放到最左边 */order: -1; }
如果是小屏幕,躯干的三栏自动变为垂直叠加。
@media (max-width: 768px) {.HolyGrail-body {flex-direction: column;flex: 1;}.HolyGrail-nav,.HolyGrail-ads,.HolyGrail-content {flex: auto;} }
四、输入框的布局
我们常常需要在输入框的前方添加提示,后方添加按钮。
HTML代码如下。
<div class="InputAddOn"><span class="InputAddOn-item">...</span><input class="InputAddOn-field"><button class="InputAddOn-item">...</button> </div>
CSS代码如下。
.InputAddOn {display: flex; }.InputAddOn-field {flex: 1; }
五、悬挂式布局
有时,主栏的左侧或右侧,需要添加一个图片栏。
HTML代码如下。
<div class="Media"><img class="Media-figure" src="" alt=""><p class="Media-body">...</p> </div>
CSS代码如下。
.Media {display: flex;align-items: flex-start; }.Media-figure {margin-right: 1em; }.Media-body {flex: 1; }
六、固定的底栏
有时,页面内容太少,无法占满一屏的高度,底栏就会抬高到页面的中间。这时可以采用Flex布局,让底栏总是出现在页面的底部。
HTML代码如下。
<body class="Site"><header>...</header><main class="Site-content">...</main><footer>...</footer> </body>
CSS代码如下。
.Site {display: flex;min-height: 100vh;flex-direction: column; }.Site-content {flex: 1; }
七,流式布局
每行的项目数固定,会自动分行。
CSS的写法。
.parent {width: 200px;height: 150px;background-color: black;display: flex;flex-flow: row wrap;align-content: flex-start; }.child {box-sizing: border-box;background-color: white;flex: 0 0 25%;height: 50px;border: 1px solid red; }
(完)
文档信息
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
- 发表日期: 2015年7月14日
- 更多内容: 档案 » 开发者手册
- 博客文集:《前方的路》,《未来世界的幸存者》
- 社交媒体: twitter, weibo
- Feed订阅:
相关文章
- 2017.08.17: 全文搜索引擎 ElasticSearch 入门教程
全文搜索属于最常见的需求,开源的 ElasticSearch (以下简称 Elastic)是目前全文搜索引擎的首选。
- 2017.07.29: 窗口管理器 xmonad 教程
开发者最需要的,就是一个顺手的开发环境。
- 2017.07.18: Pull Request 的命令行管理
Github 的一大特色就是 Pull Request 功能(简写为 PR)。
- 2017.06.22: HTML 自定义元素教程
组件是 Web 开发的方向,现在的热点是 JavaScript 组件,但是 HTML 组件未来可能更有希望。
广告(购买广告位)
留言(91条)
Cheney 说:
引用Cola的发言:里面这“vertical-align: center;”还有用么。
vertical-align 没有 center 的值,要给也只能给 middle。反正好像也没有用到。
2015年7月16日 09:58 | # | 引用
Cola 说:
引用Cheney的发言:vertical-align 没有 center 的值,要给也只能给 middle。反正好像也没有用到。
codepen 的demo里面有这一句
2015年7月22日 10:54 | # | 引用
bolo 说:
关于四项目的第二个布局(四个角各一个点):
如果骰子的四个点大小变小,
flex-wrap;flex-basis:100%;
的解决方案会导致下方的两个点不会对齐在左下角右下角
原作者给的方案会好些:
.box {
display: flex;
justify-content: space-between;
}
.box .column {
display: flex;
flex-direction: column;
justify-content: space-between;
}
2015年7月26日 12:59 | # | 引用
听雨剑主 说:
有个项目就是用的display:-webkit-flex,然后使用overflow:scroll-y进行滚动,不过滚动效果远没有使用原生滚动好,不知道有没有什么其他比较好的解决方案。
2015年8月 4日 16:38 | # | 引用
dvaknheo 说:
Visual Studio .Net 的布局方式, flex 能做到么
如一下两者格式,都要把主内容放在第一
树| 主内容
树|_______
树|底板
树| 主内容
__|_______
底板
2015年9月28日 10:42 | # | 引用
george.hu 说:
谢谢楼主这么详细的教程
但是项目三是有点问题的,在容器上应该加上一个flex-direction:column的属性
.box {
display: flex;
flex-direction:column;
}
.item:nth-child(2) {
align-self: center;
}
.item:nth-child(3) {
align-self: flex-end;
}
2015年10月28日 22:12 | # | 引用
fonglezen 说:
引用前端菜鸟的发言:display:flex现在应该是用兼容性的吧,在部分的安卓手机里面不好用,现在还在用display:box
觉得应该与时俱进,4.0安卓的用户都占据了97%以上了吧。还有2.x的,估计也是不怎么上网不怎么用手机的用户吧。所以可以放心大胆放心用。
2015年10月29日 11:00 | # | 引用
yooly 说:
骰子的布局,阮老师的从左到右排版,我学了一下,改成从上到下,哈哈,flex太好用了,http://codepen.io/anon/pen/qOywrB
2015年11月 4日 15:23 | # | 引用
phc 说:
在骰子的布局中的第四个项目中确定能达到像图中所示的吗,如果每个项目之间没有margin值,从主轴的右边对齐那不是第一行的三个点都要靠右吗,而不是每个都有间隔
我的代码设置成如下才能达到阮老师的效果
display: flex;
flex-wrap: wrap;
flex-direction:row-reverse;
justify-content:space-between;
align-content:space-between;
2015年11月 6日 10:08 | # | 引用
小房子 说:
.Grid-cell2.u-1of3 {
flex: 1 0 33.3333%;
background-color:#7CFC00;
}
.Grid-cell2.u-1of4 {
flex: 1 0 25%;
background-color:#E74D3C;
}
如果flex的放大比例都为1的话,那它的宽度在什么基础上进行变化的啊?一直没搞懂这个
2016年1月26日 15:42 | # | 引用
小静 说:
非常感谢,很喜欢您的教程,发现1.3三项目少了.box{justify-content: space-between;},难道只有我一个人发现了...
2016年4月10日 13:54 | # | 引用
汤米 说:
"1.4 四项目"的代码有点问题,如果设置justify-content:flex-end的话,第一行的3个元素不会那么平均的分布的,而是挤在右边,像float:right似的
2016年4月22日 10:59 | # | 引用
张阳 说:
单项目中第五个,水平和垂直居中,父级设置display:flex;后,子元素设置margin:auto;应该是最简单的。我是在新书css揭秘上看的。具体的原理我还不太懂。
2016年5月25日 18:16 | # | 引用
Eliza 说:
我只想说阮老师这篇大部分是抄的
https://philipwalton.github.io/solved-by-flexbox/
2016年6月 7日 11:10 | # | 引用
cody 说:
引用Eliza的发言:我只想说阮老师这篇大部分是抄的
https://philipwalton.github.io/solved-by-flexbox/
他自己开篇就说了= =
2016年6月14日 16:00 | # | 引用
开源无憾 说:
引用Eliza的发言:我只想说阮老师这篇大部分是抄的
https://philipwalton.github.io/solved-by-flexbox/
黑的毫无水平,按你这个思路,所有这类文章都是“抄”的CSS官方文档。
2016年6月19日 12:21 | # | 引用
王冬 说:
太厉害了,就连菜鸟教程的flex教程都是转自这里的。
http://www.runoob.com/w3cnote/flex-grammar.html
2016年6月24日 11:53 | # | 引用
军 说:
项目1.3是错的,这样写样式不能是截图上面的。
flex-direction: column;justify-content: space-between;
box得加上这两条属性
2016年7月 1日 11:30 | # | 引用
韩辉 说:
阮老师,我想问一下。flex布局中,各个item之间的间距是如何设置的呢?用margin可以做到,但是面试的时候面试官说不用margin也可以。不是很理解。我看到的flex布局都是item连接到一起的。
2016年9月23日 15:22 | # | 引用
deg 说:
flex布局能不能实现这样的效果:容器内的项目固定宽高,设备宽度减小,项目自动换行,换行之后内容部分整体保持水平居中,同时保持项目七的流式布局?能的话改如何实现?
2016年10月29日 10:47 | # | 引用
koz 说:
1.2那
.box {
display: flex;
}
.item:nth-child(2) {
align-self: center;
}
这个错了,得不到图中的效果。
2016年12月27日 00:08 | # | 引用
哈喽基地 说:
引用不再犹豫的发言:flex布局怎样设置单个子项在主轴上的位置?
我也有在想呢,有时候需要将子项设置在位置,特别是需要按某个比例。
2017年3月14日 10:53 | # | 引用
辣牛 说:
引用Cola的发言:里面这“vertical-align: center;”还有用么。
设为Flex布局以后,子元素的float、clear和vertical-align属性将失效。
2017年3月17日 17:36 | # | 引用
赵瑞 说:
一个点的时候,只设置.box {display:flex} 是不行的,因为父元素的align-items默认值为stretch,会使子元素的高度充满整个容器,而不是在左上角。所以应该还要给.box加上align-items: flex-start;
2017年3月18日 21:12 | # | 引用
webkws 说:
.item {
flex-grow: 1;
flex-shrink: 1;
flex-basis: 0%;
}
flex:1 => 1 1 0
2017年4月15日 22:22 | # | 引用
季一辉 说:
引用koz的发言:1.2那
.box {
display: flex;
}.item:nth-child(2) {
align-self: center;
}
这个错了,得不到图中的效果。
2017年4月18日 13:23 | # | 引用
xiaoyujia 说:
色子布局中两个点的项目中的倒数第二个:一个点在正中间另一个点在左上角那个布局不对吧?
.box {
display: flex;
}
.item:nth-child(2) {
align-self: center;
}
这样写并不能保证到达效果,当外层盒子的尺寸变大时候,正中间的那个点就偏离中心位置了,图例中的‘视觉居中’是色子的尺寸和点的尺寸凑巧的结果吧
2017年6月16日 23:48 | # | 引用
雨枫 说:
后面的例子父元素的宽度是怎么设置的?
css基础精华---Flex 布局教程:实例篇相关推荐
- Flex 布局教程实例
Flex 布局教程实例 一.Flex 布局是什么? Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 任何一个容器都可以指定为 F ...
- Flex布局(实例篇)
Flex布局 我们可以看到,不管是什么布局,Flex往往都可以几行命令搞定. 一.骰子的布局 骰子的一面,最多可以放置9个点. 下面,就来看看Flex如何实现,从1个点到9个点的布局.你可以到code ...
- Flex 布局教程:语法篇(阮一峰)
阿里云 > 教程中心 > html教程 > Flex 布局教程:语法篇(阮一峰) Flex 布局教程:语法篇(阮一峰) 发布时间:2018-03-12 来源:网络 上传 ...
- Flex 布局教程:实例篇
上一篇文章介绍了Flex布局的语法,今天介绍常见布局的Flex写法. 你会看到,不管是什么布局,Flex往往都可以几行命令搞定. 我只列出代码,详细的语法解释请查阅<Flex布局教程:语法篇&g ...
- 43个实例xHTML+CSS(DIV+CSS)网页及导航布局教程
在中国,很多前端javascript:;" onClick="javascript:tagshow(event, '%BF%AA%B7%A2');" target=&qu ...
- Flex 布局教程:语法篇
阮一峰的网络日志 » 首页 » 档案 上一篇:ES6 的功能侦测库 下一篇:Flex 布局教程:实 分类: 开发者手册 Flex 布局教程:语法篇 作者: 阮一峰 日期: 2015年7月10日 网页布 ...
- css 快速入门之 flex 布局教程
css 快速入门之 flex 布局教程 flex 简称弹性布局,是2009年W3C提出的 css3 新属性. 弹性布局(flexible box)模块旨在提供一个更加有效的方式来布置,对齐和分布在容器 ...
- Flex布局教程(非常受用)
目录 前言: 一.语法篇 1.概述 2.Flex 布局怎么用 任何一个容器都可以指定为 Flex 布局 行内元素也可以使用 Flex 布局: Webkit 内核的浏览器,必须加上-webkit前缀: ...
- HTML Flex布局教程
Flex 布局教程:语法篇 bShare.addEntry({ title: document.getElementById("page-title").innerHTML, ur ...
最新文章
- CMD 输入中文看不到输入法的解决方法
- Java2021中级面试题
- 解决AJAX表单用POST方式提交Checkbox复选框的问题
- 学霸真的比学渣更讨女孩子欢心吗?
- primefaces 带参数的组件
- 【Luogu】P3343地震后的幻想乡(对积分概率进行DP)
- Cloud Toolkit 应用部署、文件上传支持上传进度实时展示
- 漫步数理统计二——集合论
- 解决由于sz rz导致抓包时文件容量增加
- vSAN其实很简单-如何处理“vSAN磁盘写满”问题?
- 做游戏,学编程(C语言) 17 猪小弟
- Hugging Face Course-Introduction学习小记 (part2)
- mac 安装android apk文件,.apk文件用苹果系统怎么打开
- 回文子串、回文子序列相关题目
- 瘦子的肠道菌群和胖子的区别_胖子和瘦子的终极 PK:比基因?比运动?比肠道细菌!...
- vm安装win xp镜像遇到的安装问题之一
- 「6.1K Star 项目推荐」github主页”快速装修“神器
- 一文讲透,商业智能BI的未来形态,发展现状及前景分析|推荐收藏
- QT编译错误:cannot find file: *.pro
- android 自定义相册选择,Android图片选择器,支持拍照、从相册选择、裁剪、自定义主题...
热门文章
- The Mythical Man-Month
- Matplotlib将image和图表的尺寸对齐
- Etcd特性学习1——KV操作
- 2022年最新四川水利水电施工安全员模拟试题题库及答案
- 数据可视化总结2021.05.17
- 冲压工艺:四十种工艺详细介绍,值得收藏
- 使用nltk.stem.wordnet.WordNetLemmatizer()时报错BadZipFile(“File is not a zip file“)的解决方法
- 【图像分割】TransUNet学习笔记
- css实现div阴影效果
- SMIC工艺库的命名规则