CSS 学习笔记 - Flex 布局
传统布局方式的局限性
传统的网页布局方式,采用 display
+ position
+ float
的方式来实现。这种方式,无法实现一些复杂的布局,并且在实现某些布局时,会有一些局限性。
比如,最常见的多列布局,我们一般是通过 float
来实现的。这种方式并不是标准,float
属性一开始是用来实现文字环绕图片的效果,后来人们发现这货比 display: inline
之类的属性好用,便用它来实现多列布局。
再如,垂直居中的实现,也是各种奇淫技巧,并没有标准的实现方式。
即使是最简单的水平居中,也经常通过 margin: 0 auto
来实现的。虽然居中的功能是实现了,但从语义方面来说,这种写法也不是很规范。
当然,并不是说,非标准的就是不好。但是非标准的方式,对新手来说,往往学习成本比较高,并且还有各种副作用。比如用 float
实现布局需要我们手动清除浮动,而清除浮动的方式也是各种奇淫技巧。
本文介绍的Flex 布局,能为我们解决这些问题。
这篇文章主要介绍 Flex 相关的概念和每一个属性的用法。
Flex 布局是什么
Flex 布局是 Flexible Box 的缩写,也叫做弹性布局。我们可以通过下面的方式来实现 Flex 布局。
.box {
display: -webkit-flex;
display: flex;
}
设置了 display: flex
的元素,其子元素 的 float
、clear
和 vertical-align
属性将会失效。
Flex 模型介绍
在学习 Flex 的用法之前,我们先来学习 Flex 的基本概念。
- 设置了
display: flex
的元素称为 Flex 容器(flex container)、其子元素称为 Flex 项(flex item)。 - 默认水平方向为主轴(main axis)、主轴开始位置称为 main start,主轴结束位置称为 main end。
- 与主轴垂直的轴是交叉轴(cross axis),交叉轴开始位置称为 cross start,交叉轴结束位置称为 cross end。
Flex 容器
Flex 容器支持以下六个属性:
- flex-direction
- flex-wrap
- flex-flow
- justify-content
- align-items
- align-content
flex-direction
flex-direction
属性用来设置主轴的方向。它有以下四个值。
row
(默认值):水平向右为主轴方向。
row-reverse
:水平向左为主轴方向。
column
:垂直向下为主轴方向。
colunm-reverse
:垂直向上为主轴方向。
主轴和交叉轴是相互垂直的,也就是说,如果设置了主轴的方向为垂直方向,那么交叉轴的方向就是水平方向。
flex-wrap
flex-wrap
属性用来设置 Flex 项的换行方式。它有以下三个值。
nowrap
(默认值):不换行。
wrap
:换行。
wrap-reverse
:换行,先排最后一行。
flex-flow
flex-flow
属性是 flex-direction
与 flex-wrap
的缩写。默认值 row nowrap
。
flex-flow: flex-direction flex-wrap;
justify-content
justify-content
属性用来设置 Flex 项在主轴上的排列方式。它有以下五个值。
flex-start
(默认值):从 main start 开始排列。
flex-end
:从 main end 开始排列。
center
:在主轴上居中。
space-between
:两端对齐。Flex 项之间的距离相等。
space-around
:每一个 Flex 项左右的距离相等。两项之间的距离是旁边的距离的两倍。
align-items
align-items
属性用来设置 Flex 项在交叉轴上的对齐方式。它有以下五个值。
flex-start
:交叉轴的起始位置(cross start)对齐。
flex-end
:交叉轴的结束位置(cross end)对齐。
center
:交叉轴的中点对齐。
baseline
: Flex 项的第一行文字的基线对齐。
stretch
(默认值):Flex 项目将占满整个 Flex 容器的高度。但是如果 Flex 项设置了高度,该属性不起作用。
align-content
align-content
属性用来设置交叉轴上多行对齐方式,类似于 justity-content
。这个属性只有在交叉轴上的行数大于一时才起作用。它有以下六个属性。
stretch
(默认值):多行占满整个轴线。
注意:如果 Flex 设置了高度,这个属性不起作用。
flex-start
:与交叉轴的起始位置对齐。
flex-end
:与交叉轴的结束位置对齐。
center
:与交叉轴的中点位置对齐。
space-between
:在交叉轴上两端对齐,每行之间的距离相等。
space-around
:每行的上下距离相等。两行之间的间距是最上面和最下面的间距的两倍。
Flex 项
Flex 项支持以下属性:
- order
- flex-grow
- flex-shrink
- flex-basis
- flex
- align-self
order
order
属性用来设置 Flex 项的顺序。默认为 0
。数值越小,Flex 项越排在前面。
.item:nth-child(1){
order: 3;
}
.item:nth-child(2){
order: 2;
}
.item:nth-child(3){
order: 1;
}
flex-basis
flex-basis
属性用来设置 Flex 项的宽度,用法与 width
一样。可以当做是 width
的别名。默认值为 auto
。如果元素同时设置了 flex-basis
属性和 width
属性,flex-basis
属性会覆盖 width
属性,即 width
属性不会起作用。
如果是 Flex 项,建议使用 flex-basis
而不是 width
,这样比较符合规范。
flex-grow
flex-grow
属性用来设置,当 Flex 容器的宽度大于所有 Flex 项目的宽度的总和时,剩下的空间如何分配给子元素。若 Flex 容器的宽度小于或等于所有 Flex 项目宽度的总和,即没有剩余空间,该属性不会起作用。
对于 flew-grow
大于 1 的 Flex 项,会按照 flew-grow
的值的比例分配剩余的空间。比例越大,分配的就越大。flew-grow
值为 2 的 Flex 项分配到的宽度是flew-grow
值为 1 的两倍。
默认值是 0
,即按原先的大小显示,不需要分配额外的宽度。
举个例子,Flex 容器中共有三个 Flex 项,他们 flew-grow
的值分别为 0、2、3。则第二个 Flex 项目的最终宽度为:原先的宽度 + 剩余的宽度 * 2 / (2 + 3)。
flex-shrink
flex-shrink
属性用来设置,当 Flex 容器的宽度小于所有 Flex 项目宽度的总和,即空间不足时,Flex 项如何缩小宽度。只有空间不足时,该属性才会起作用。
值越大,减小的就越大。值为 0,表示不减小。默认值为 1
。
关于减小后的宽度的计算还是有点麻烦的,鉴于篇幅有限,不再此说明。
flex
flex
属性是 flex-grow
、flex-shrink
和 flex-basis
的缩写。默认值为 1 1 auto
。
flex: flex-grow flex-shrink flex-basis;
align-self
Flex 容器的 align-items
属性会作用于所有 Flex 项,如果你希望某个 Flex 项不遵循 align-items
属性设置的值,可以用 align-self
属性覆盖。用法与 align-items
一致。
总结
Flex 布局会是未来布局的首选,尽管在兼容性方面还是有点不足。你可以根据下面的脑图,回顾一下这篇文章讲解过的知识。
下一篇文章,会讲解如何用 Flex 实现常见的布局。
参考
CSS 学习笔记 - Flex 布局的更多相关文章
- CSS学习笔记09 简单理解BFC
引子 在讲BFC之前,先来看看一个例子 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- css学习笔记四
广州天气变冷了,css学习笔记还是要总结. 总结: 1:几米页面静态页面主要是一列结构头部banner图,mainbody部分放文字内容和图书图片,底部是页面的版权信息 2:腾讯软件中心静态页面制作( ...
- CSS学习笔记10 相对定位,绝对定位与固定定位
文档流中的元素的位置由元素在 (X)HTML 中的位置决定,这就是最原始的普通流,前面讲到的浮动CSS学习笔记08 浮动可以改变元素在文档流中的位置,除了这个我们还可以通过使用CSS的position ...
- CSS学习笔记08 浮动
从CSS学习笔记05 display属性一文中,我们知道div是块元素,会独占一行,即使div的宽度很小,像下面这样 应用display属性的inline属性可以让div与div共享一行,除了这种方法 ...
- CSS学习笔记之选择器
目录 1.元素选择器 2.继承 3.选择器分组 4.声明分组 5.后代选择器 6.子元素选择器 7.相邻兄弟选择器 8.类选择器 9.ID 选择器 10.属性选择器 11.伪类 12.伪元素 1.元素 ...
- 2022-07-10 第五小组 pan小堂 css学习笔记
css学习笔记 什么是 CSS? CSS 指的是层叠样式表* (Cascading Style Sheets) CSS 描述了如何在屏幕.纸张或其他媒体上显示 HTML 元素 CSS 节省了大量工作. ...
- HTML+CSS学习笔记 (7) - CSS样式基本知识
HTML+CSS学习笔记 (7) - CSS样式基本知识 内联式css样式,直接写在现有的HTML标签中 CSS样式可以写在哪些地方呢?从CSS 样式代码插入的形式来看基本可以分为以下3种:内联式.嵌 ...
- HTML+CSS学习笔记 (6) - 开始学习CSS
HTML+CSS学习笔记 (6) - 开始学习CSS 认识CSS样式 CSS全称为"层叠样式表 (Cascading Style Sheets)",它主要是用于定义HTML内容在浏 ...
随机推荐
- POJ 3342 Party at Hali-Bula / HDU 2412 Party at Hali-Bula / UVAlive 3794 Party at Hali-Bula / UVA 1220 Party at Hali-Bula(树型动态规划)
POJ 3342 Party at Hali-Bula / HDU 2412 Party at Hali-Bula / UVAlive 3794 Party at Hali-Bula / UVA 12 ...
- Eclipse简单插件开发-启动时间提示
1.新建Plug-in Project 不用改其他选项,直接点击"Next",然后点击"Finish" 2.新建ShowTime.java package ...
- 微信小程序 瀑布流布局
今天做小程序的时候,碰到一个比较常见的需求,就是要瀑布流布局,两列,交错分布,大概如下图 最终要实现的结果就是如左图所示. 不过在微信小程序里面,不能通过JavaScript来直接操作dome,所以一 ...
- 玩玩微信公众号Java版之二:接收、处理及返回微信消息
前面已经配置了微信服务器,那么先开始最简单的接收微信消息吧~ 可以用我们的微信号来直接进行测试,下面先看测试效果图: 这是最基本的文本消息的接收.处理及返回,来看看是怎么实现的吧! 首先可 ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 基于android的语音质量评估
最近研究如何通过android评估通话质量,希望获取的参数有:(1)接通时长 (2)掉话次数 (3)语音是否清晰,以下将给出接通时长和掉话次数的详细定义: 接通时长:通话一方开始拨号到另一方开始振铃的 ...
- 数位dp模板 [dp][数位dp]
现在才想到要学数位dp,我是不是很弱 答案是肯定的 以一道自己瞎掰的题为模板 //题: //输入数字n //从0枚举到n,计算这n+1个数中含有两位数a的数的个数 //如12930含有两位数93 #i ...
- luogu P1494 岳麓山上打水 [iddfs]
题目描述 今天天气好晴朗,处处好风光,好风光!蝴蝶儿忙啊,蜜蜂也忙,信息组的同学们更加忙.最近,由于XX原因,大家不得不到岳麓山去提水.55555555~,好累啊. 信息组有一个容量为q升的大缸,由于 ...
- FTP publisher plugin插件
说明:这个插件可以将构建的产物(例如:Jar)发布到FTP中去. 官方说明:FTP publisher plugin 安装步骤: 系统管理→管理插件→可选插件→Artifact Uploaders→F ...
- LNMP环境的安装
一.LNMP的安装 1.准备工作 #清理已经安装包 rpm -e httpd rpm -e mysql rpm -e php yum -y remove httpd yum -y remove mys ...