持续创作,加速成长!这是我参与「AdminJS · 6 月更文挑战」的第28天,点击查看活动详情
核心描述
在我看来,flex 布局的好处,就两个字,“简单”,如果要用一句话,就是用最简单的语法实现最常见的样式布局。
-
flex 布局:Flexible Box 模型,通常被称为 flexbox,是一种一维的布局模型。它给 flexbox 的子元素之间提供了强大的空间分布和对齐能力。
-
flex 常见用途:如果说概念太复杂,那不如直接列出来 flex 能解决的场景问题,更符合实际应用
- 一行多列,等分布局
- 一行内,文字和图片垂直居中对齐:登录框的 icon 、input、label 垂直居中布局
- 子元素在父元素中水平垂直居中对齐
-
flex 的属性值说明
- html 示例代码
<div class="parent"> <div class="child">1</div> <div class="child">2</div> <div class="child">3</div> </div>
- flex 布局中父元素可以设置的属性值及说明:
<style> .parent { display: flex; // 应用 flex 布局 flex-direction: row; // 子元素的布局排列方向,row-横向正向;row-reverse-横向反方向;column-竖向正向,column-reverse-竖向反方向 flex-wrap:nowrap; //表示是否换行 flex-flow: row norwap; // 表示 flex-direction 和 flex-wrap 的缩写 justify-content: center; // 表示水平方向的对齐方式,如果默认 flex-direction:row,则可以用来做水平居中布局 align-items: center; // 表示垂直方向的对齐方式,如果默认flex-direction:row,则可以用来做垂直居中布局 align-content: center; // 该属性,对单行弹性布局无效,一般应用场景较少。作用是指明垂直方向每一行 flex 元素的对齐和分布方式 } </style>
- flex 布局中直接子元素可以设置的属性值及说明:
<style> .child { flex: 1; // 该属性是 flex-grow、flex-shrink、flex-basis 的缩写 order:1; // 改变某一个 flex 直接子元素的排序位置 align-self:1; // 控制单独某一个 flex 子项的垂直对齐方式,与父元素的 align-items 区别是,在父元素中 align-items 表示所有子元素的垂直排列方式,而 align-self 表示当前子元素的垂直排列方式,仅影响一个元素 flex-grow: 1; // 拓展当前 flex 直接子元素所占据的宽度,拓展所占用的空间就是父元素除去所有子元素之外的空白间隙,不支持负数,默认是0 flex-shrink:1; // 收缩当前 flex 直接子元素所占的宽度,当 flex 父元素空间不足时,收缩单个元素比例,不支持负数,默认是1 flex-basis:1; // 当前 flex 直接子元素在分配父元素剩余空间之前元素的默认大小,默认值是 auto } </style>
-
flex:1
表示什么意思:等同于 flex: 1 1 0,等同于 flex-grow:1;flex-shrink:1;flex-basis:0,元素可以在flex-basis为 0 的基础上伸缩。flex:initial
:flex 默认值,相当于 flex:0 1 auto- flex-grow:0; flex-shrink:1; flex-basis:auto
- 在这里 flex-grow 的值为 0,所以 flex 元素不会超过它们 flex-basis 的尺寸。flex-shrink 的值为 1, 所以可以缩小 flex 元素来防止它们溢出。flex-basis 的值为 auto. Flex 元素尺寸可以是在主维度上设置的,也可以是根据内容自动得到的。
flex:auto
: 相当于 flex: 1 1 auto;- flex-grow:1; flex-shrink:1; flex-basis:auto
- 和上面的 flex:initial 基本相同,但是这种情况下,flex 元素在需要的时候既可以拉伸也可以收缩。
flex:none
:相当于 flex:0 0 auto- flex-grow:1; flex-shrink:1; flex-basis:auto
- 元素既不能拉伸或者收缩,但是元素会按具有 flex-basis: auto 属性的 flexbox 进行布局。
-
常见示例-实现水平垂直居中:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<style>
.parent {
display: flex;
/* 水平居中 */
justify-content: center;
/* 垂直居中 */
align-items: center;
width: 200px;
height: 80px;
border: 1px dotted #333;
background: green;
}
.child {
background-color: antiquewhite;
border: 1px solid #000;
width: 50px;
height: 30px;
}
</style>
<body>
<div class="parent">
<div class="child">1</div>
<div class="child">2</div>
<div class="child">3</div>
</div>
</body>
</html>
知识拓展
- 个人理解:
- 有了 flex 布局之后,以往的很多 margin 、 float、 position:absolute 等等用于子元素在父元素的各种位置设置,都可以不用再深入研究了,基本能覆盖 80% 以上的场景
- flex 对浏览器的兼容性基本包括了 ie11 及以上,尤其是微软官方宣布不再维护 IE 之后,更没有理由不应用 flex 布局了
- flex 布局可以嵌套使用
- 如果你开发小程序,也可以直接使用 flex 布局
参考资料
- MDN-flex 布局的基本概念:developer.mozilla.org/zh-CN/docs/…
- Can I use:caniuse.com/flexbox
- 写给自己看的display: flex布局教程:www.zhangxinxu.com/wordpress/2…
浏览知识共享许可协议
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。