一. flex
布局
1. 认识flexbox
Flexbox
翻译为弹性盒子:- 弹性盒子是一种用于按行或按列布局元素的一维布局方法
grid
布局是二维的,但是出现的相对晚些,兼容性不太好,功能是比flex
强大
- 元素可以膨胀以填充额外的空间,收缩以适应更小的空间
- 通常我们使用
flexbox
来进行布局的方案称之为flex
布局(flex layout
)
- 弹性盒子是一种用于按行或按列布局元素的一维布局方法
flex
布局时目前web
开发中使用最多的布局方案:flex
布局(Flexible
布局,弹性布局)- 目前特别在移动端可以说已经完全普及
- 在**
PC
端也几乎已经完全普及和使用**,只有非常少数的网站需要兼容低版本浏览器的依然在用浮动来布局
- 为什么需要
flex
布局呢?- 长久以来,
css
布局中唯一可靠而且浏览器兼容的布局工具只有floats
和positioning
- 但是这两种方法本身存在很大的局限性,并且他们用于布局实在是无奈之举
- 长久以来,
- 如何让元素变成一个弹性盒子
flexbox
呢?display: flex;
2. 原先布局存在的痛点
- 原来的布局存在哪些痛点呢? 举例说明:
比如在父内容里面垂直居中一个块内容
比如使容器的所有子项等分可用宽度/高度,而不管有多少宽度/高度可用
比如使多列布局中的所有列采用相同的高度,即使它们包含的内容量不同
3. flex布局的出现
所以长久以来, 大家非常期待一种真正可以用于对元素布局的方案: 于是
flex
布局出现了Nature and nature's laws lay hid in night; God said "Let Newton be" and all was light
- 自然与自然的法则在黑夜隐藏,于是上帝说,让牛顿出现吧!于是世界就明亮了起来
flexbox
在使用时, 我们最担心的是它的兼容性问题:我们可以在
caniuse
上查询到具体的兼容性
4. flex布局的特性
两个重要的概念:
开启了
flex
布局的元素叫做flex container
flex container
里面的直接子元素叫做flex item
当
flex container
中的子元素变成了flex item
时,具备以下特点:flex item
的布局将受flex container
属性的设置来进行控制和布局flex item
不再严格区分块级元素和行内级元素flex item
默认情况下宽高是包裹内容的,可以设置宽高
设置
display
属性为flex
或者inline-flex
可以成为flex container
flex
:flex container
以block-level
形式存在inline-flex
:flex container
以inline-level
形式存在- 为什么
flex container
行为是块级元素? - https://developer.mozilla.org/zh-CN/docs/Web/CSS/display
注意:
- 当
flex item
为position:absolute/fixed
的元素时,将不再具备flex item
元素的特性
5. flex布局的模型

6. flex相关的属性
应用在flex container 上的CSS属性 | 应用在flex items 上的CSS属性 |
---|---|
flex-flow | flex-grow |
flex-direction | flex-basis |
flex-wrap | flex-shrink |
flex-flow | order |
justify-content | align-self |
align-items | flex |
align-content |
6.1 flex container相关的属性
flex-direction
flex items
默认都是沿着main axis
(主轴)从main start
开始往main end
方向排布flex-direction
决定了main axis
的方向,有4个取值:row
(默认值)、row-reverse
、column
、column-reverse
flex-wrap
flex-wrap
决定了flex container
是单行还是多行nowrap
(默认):单行wrap
:多行wrap-reverse
:多行(对比wrap、cross start
与cross end
相反)
flex-flow
flex-flow
属性是flex-direction
和flex-wrap
的简写顺序任意,并且都可以省略
justify-content
justify-content
决定了flex items
在main axis
上的对齐方式flex-start
(默认值):让flex items
与main start
对齐flex-end
:让flex items
与main end
对齐center
:居中对齐space-between
:- 同一行中的
flex items
之间的距离相等 - 与
main start、main end
两端对齐
- 同一行中的
space-around
:- 同一行中的
flex items
之间的距离相等 flex items
与main start、main end
之间的距离是flex items
之间距离的一半
- 同一行中的
space-evenly
:同一行中的
flex items
之间的距离相等flex items
与main start、main end
之间的距离等于flex items
之间的距离
align-items
align-items
决定了flex items
在cross axis
上的对齐方式normal
:在弹性布局中,效果和stretch
一样(默认值),均匀分布项目,拉伸自动大小的项目直至填充盒子stretch
:当flex items
在cross axis
方向的size
为auto
时,会自动拉伸至填充flex container
flex-start
:与cross start
对齐flex-end
:与cross end
对齐center
:居中对齐baseline
:与基准线对齐
align-content
该属性对单行弹性盒子模型无效(即:带有
flex-wrap: nowrap
)align-content
决定了多行flex items
在cross axis
上的对齐方式,用法与justify-content
类似stretch
(默认值):与align-items
的stretch
类似flex-start
:与cross start
对齐flex-end
:与cross end
对齐center
:居中对齐space-between
:- 同一行中的
flex items
之间的距离相等 - 与
cross start、cross end
两端对齐
- 同一行中的
space-around
:- 同一行中的
flex items
之间的距离相等 flex items
与cross start、cross end
之间的距离是flex items
之间距离的一半
- 同一行中的
space-evenly
:同一行中的
flex items
之间的距离相等flex items
与cross start、cross end
之间的距离 等于flex items
之间的距离
6.2 flex items相关的属性
order
order
决定了flex items
的排布顺序可以设置任意整数(正整数、负整数、0),值越小就越排在前面
默认值是 0
align-self
flex items
可以通过align-self
覆盖flex container
设置的align-items
auto
(默认值):遵从flex container
的align-items
设置stretch、flex-start、flex-end、center、baseline
,效果跟align-items
一致
flex-grow
flex-grow
决定了flex items
如何扩展(拉伸/成长)- 可以设置任意非负数字(正小数、正整数、0),默认值是 0
- 当
flex container
在main axis
方向上有剩余size
时,flex-grow
属性才会有效
如果所有
flex items
的flex-grow
总和sum
超过 1,每个flex item
扩展的size
为flex container
的剩余size * flex-grow / sum
flex items
扩展后的最终size
不能超过max-width\max-height
注意:
- 当
flex items
没有设置具体的宽高且该flex items
自身display
值为flex
时,其内部item
文字内容单行不换行时,且内容溢出时,flex-grow
会扩展出去,设置该flex items
的overflow:hidden
即可
flex-shrink
flex-shrink
决定了flex items
如何收缩(缩小)- 可以设置任意非负数字(正小数、正整数、0),默认值是 1
- 当
flex items
在main axis
方向上超过了flex container
的size
,flex-shrink
属性才会有效
- 如果所有
flex items
的flex-shrink
总和超过 1,每个flex item
收缩的size
为flex items
超出flex container
的size
* 收缩比例 / 所有flex items
的收缩比例之和
flex items
收缩后的最终size
不能小于min-width\min-height
注意:
img
不会收缩- 当
flex item
超过flex
容器的宽度时,flex item
默认会收缩至flex
容器的宽度,如果想某个flex item
不收缩,将其flex-shrink: 0
即可
flex-basis
- 设置
flex items
在main axis
方向上的base size
auto
(默认值)、具体的宽度数值(100px
)
- 决定
flex items
最终base size
的因素,从优先级高到低max-width\max-height\min-width\min-height
flex-basis
width\height
- 内容本身的
size
flex-grow
为0
的情况下,flex-basis
为0
的话,会导致item
元素base
宽度为0
,如果内容有元素的话会呈多行显示,每行只显示一个单词(汉字)
flex
flex
是flex-grow
||flex-shrink
||flex-basis
的简写,flex
属性可以指定1个,2个或3个值单值语法:值必须为以下其中之一:
- 一个无单位数(
<number>
):它会被当作<flex-grow>
的值,<flex-shrink>
的值被假定为1
,然后<flex-basis>
的值被假定为0
- 一个有效的宽度(
width
)值:它会被当作<flex-basis>
的值 - 关键字
none
,auto
或initial
- 一个无单位数(
双值语法:第一个值必须为一个无单位数,并且它会被当作
<flex-grow>
的值- 第二个值必须为以下之一:
- 一个无单位数:它会被当作
<flex-shrink>
的值 - 一个有效的宽度值:它会被当作
<flex-basis>
的值
- 一个无单位数:它会被当作
- 第二个值必须为以下之一:
三值语法:
- 第一个值必须为一个无单位数,并且它会被当作
<flex-grow>
的值 - 第二个值必须为一个无单位数,并且它会被当作
<flex-shrink>
的值 - 第三个值必须为一个有效的宽度值, 并且它会被当作
<flex-basis>
的值
- 第一个值必须为一个无单位数,并且它会被当作
7. 常见问题的解决方案

- 类似上面使用
justify-content:space-between
最后一行可能会遇到的情况 - 方法一:
- 不设置
space-between
,给每个元素添加margin-right
,最右边的margin-right: 0;
- 不设置
- 方法二:
- 在
flex items
最后面添加几个没有内容的元素即可,推荐i
元素flex items
不区分块级、行内级,默认宽高由内容决定,需要设置添加的元素宽度等同于item
的宽度,高度设置为0
不可见- 所以不给
i
元素添加内容,则没有宽高,就看不见,但是在space-between
中,仍然会对添加的i
元素进行排布
- 添加个数:排布的列数 - 2
- 在

类似上面这种,给红框中间的
flex
子元素设置flex:1;
,内层的元素设置nowrap
的情况下,内容超出的时候,会将flex
子元素撑开css.main .news-section .news { flex: 1; overflow: hidden; padding: 0 17px; }
给
flex
为1
的item
设置overflow:hidden
即可解决

- 如上图所示,
flex
容器中,因为连字符的一些影响导致红框的子元素内容本应该显示在一行的,却出现断字的情况- 方法一:
- 使用不间断连字符,
ctrl
+shift
+连字符键
- 使用不间断连字符,
- 方法二:
- 使用类似
-
符号的字符实体:&minus
- 使用类似
- 方法三:
- 给内容溢出排不下的子元素设置
flex: 1;
- 给内容溢出排不下的子元素设置
- 方法一:

当浏览器窗口宽度减少的时候,主
banner
图宽度固定,保持图片核心内容居中显示css/* 方案一:img结构 */ img { position: relative; transform: translateX(-50%); left: 50%; } /* 方案二:背景图 */ background: url(../img/main_bg.jpg) no-repeat center top;
二. 去除元素内容滚动时默认的滚动条
这里以类名为
box
的元素为例子css/* 去除类名为box的元素滚动时的滚动条 */ .box::-webkit-scrollbar { display: none; }