在页面开发的过程中,CSS 页面布局技术允许我们拾取网页中的元素,并且控制它们相对正常布局流、周边元素、父容器或者主视口/窗口的位置。
当前主要的布局方式有:浮动布局(Float)、定位布局(Position)、弹性布局(Flex)、网格布局(Grid)等,本文将探讨 flex 弹性布局。
Flex 弹性布局,定义了一种针对用户界面设计而优化的 CSS 盒子模型。在弹性布局模型中,弹性容器的子元素可以在任何方向上排布,也可以“弹性伸缩”其尺寸,既可以增加尺寸以填满未使用的空间,也可以收缩尺寸以避免父元素溢出。子元素的水平对齐和垂直对齐都能很方便的进行操控。通过嵌套这些框(水平框在垂直框内,或垂直框在水平框内)可以在两个维度上构建布局。
弹性盒子(Flexbox)
Flexbox 是 CSS Flexible Box Layout Module 的常用名称,这是一种用于在单个维度(行或列)中显示项目的布局模型
。
伸缩盒子(Flex Container)
弹性项目(Flex Item)
Flex Container(弹性容器)的一级子元素(设置 display: flex 或 display: inline-flex 的子元素)将成为弹性元素。弹性容器内的连续文本,也将成为弹性元素。
主轴(Main Axis)
主轴是由弹性容器 flexbox 中弹性方向 flex-direction 属性所定义的的。用来定义主轴上的子元素排列顺序。
交叉轴(Cross Axis)
弹性容器 flexbox 的交叉轴和主轴 main axis 垂直的。用来定义主轴上的子元素排列顺序。
伸缩性(Flex)
flex 是一个 CSS 的 display 属性中新添加一个值。 随着 inline-flex 的使用,它将使它适用的元素成为一个 flex container(伸缩容器),而这个元素的每个子元素将成为 flex item(伸缩项目)。伸缩项目将参与到 flex 布局中,所有由 CSS Flexible Box Layout Module(CSS 伸缩盒布局模型)定义的属性都能被它们使用。
flex 属性是 flex-grow, flex-shrink 和 flex-basis 属性的简写。
可选值:
flex 和 inline-flex 区别在于,inline-flex 容器为 inline 特性,因此可以和图片文字一行显示;flex 容器保持块状特性,宽度默认 100%,不和内联元素一行显示。
语法:
选择器 {
display: flex | inline-flex;
}
<style>
.container {
background-color: #7f8c8d;
border: 5px dashed #34495e;
/* flex 伸缩布局-开始 */
display: flex;
/* flex-direction: row | row-reverse | column | column-reverse; */
/* flex-wrap: nowrap | wrap | wrap-reverse; */
/* flex-flow: || ; */
/* flex 伸缩布局-结束 */
}
.item-box {
margin: 5px;
width: 100px;
height: 50px;
background-color: #ecf0f1;
color: #000;
line-height: 50px;
text-align: center;
}
.item-box:nth-of-type(odd) {
height: 80px;
line-height: 80px;
}
style>
<body>
<div class="container">
<div class="item-box item1">item1div>
<div class="item-box item2">item2div>
<div class="item-box item3">item3div>
<div class="item-box item4">item4div>
<div class="item-box item5">item5div>
<div class="item-box item6">item6div>
<div class="item-box item7">item7div>
<div class="item-box item8">item8div>
div>
body>
指定了内部元素是如何在 flex 容器中布局的,定义了主轴的方向(正方向或反方向)。
可选值:
指定 flex 元素单行显示还是多行显示
。如果允许换行,这个属性允许你控制行的堆叠方向。
可选值:
flex-flow 属性是 flex-direction 和 flex-wrap 的简写。
语法:
选择器 {
flex-flow: ;
}
设置了一个 flex 项主尺寸的 flex增长系数
。它指定了 flex 容器中剩余空间的多少应该分配给项目(flex 增长系数)。
主尺寸是项的宽度或高度,这取决于 flex-direction 值。剩余的空间是 flex 容器的大小减去所有 flex 项的大小加起来的大小。如果所有的兄弟项目都有相同的 flex-grow 系数,那么所有的项目将获得相同的剩余空间,否则将根据不同的 flex-grow 系数定义的比例进行分配。
属性值:
<style>
.container {
margin-top: 30px;
background-color: #7f8c8d;
border: 5px dashed #34495e;
display: flex;
}
.item-box {
margin: 5px;
width: 100px;
height: 50px;
background-color: #ecf0f1;
color: #000;
line-height: 50px;
text-align: center;
}
.item-box:nth-of-type(odd) {
height: 80px;
line-height: 80px;
}
.item1 {
flex-grow: 1; /* 设置 item1 的增长系数 */
}
.item2 {
flex-grow: 2; /* 设置 item2 的增长系数 */
}
style>
<body>
<div class="container">
<div class="item-box item1">item1div>
<div class="item-box item2">item2div>
<div class="item-box item3">item3div>
<div class="item-box item4">item4div>
<div class="item-box item5">item5div>
div>
body>
指定了 flex 元素的收缩规则
。flex 元素仅在默认宽度之和大于容器的时候才会发生收缩,其收缩的大小是依据 flex-shrink 的值。
属性值:
指定了 flex 元素在主轴方向上的初始大小。如果不使用 box-sizing 改变盒模型的话,那么这个属性就决定了 flex 元素的内容盒(content-box)的尺寸。
当一个元素同时被设置了 flex-basis (除值为 auto 外) 和 width (或者在 flex-direction: column 情况下设置了 height) , flex-basis 具有更高的优先级。
可选值:
flex CSS 简写属性设置了弹性项目如何增大或缩小以适应其弹性容器中可用的空间。
选择器 {
/* 关键字值 */
flex: auto;
flex: initial;
flex: none;
/* 一个值, 无单位数字: flex-grow */
flex: 2;
/* 一个值, width/height: flex-basis */
flex: 10em;
flex: 30px;
flex: min-content;
/* 两个值: flex-grow | flex-basis */
flex: 1 30px;
/* 两个值: flex-grow | flex-shrink */
flex: 2 2;
/* 三个值: flex-grow | flex-shrink | flex-basis */
flex: 2 2 10%;
/*全局属性值 */
flex: inherit;
flex: initial;
flex: unset;
}
可以使用一个,两个或三个值来指定 flex 属性。
单值语法: 值必须为以下其中之一:
双值语法: 第一个值必须为一个无单位数,并且它会被当作 的值。第二个值必须为以下之一:
三值语法:
可选值:
规定了弹性容器中的可伸缩项目在布局时的顺序。元素按照 order 属性的值的增序进行布局。拥有相同 order 属性值的元素按照它们在源代码中出现的顺序进行布局。
order 仅仅对元素的视觉顺序 (visual order) 产生作用
,并不会影响元素的逻辑或 tab 顺序。 order 不可以用于非视觉媒体,例如 speech。
属性值:
<style>
其它css样式同上 {
}
.item1 {
order: 2; /* 设置 order 排列次序 */
}
.item2 {
order: 1; /* 设置 order 排列次序 */
}
style>
<body>
HTML 结构同上
body>
设置了浏览器如何沿着弹性盒子布局的纵轴和网格布局的主轴在内容项之间和周围分配空间。弹性盒子需要有多余空间,并且该属性对单行弹性盒子模型无效。(即:带有 flex-wrap: nowrap)。
可选值:
<style>
.container {
margin-top: 30px;
height: 400px; /* 设置弹性盒子的高度,需要大于子盒子的默认高度 */
background-color: #7f8c8d;
border: 5px dashed #34495e;
/* flex 伸缩布局-开始 */
display: flex;
flex-wrap: wrap;
align-content: space-around;
/* flex 伸缩布局-结束 */
}
.item-box {
margin: 5px;
width: 100px;
height: 50px;
background-color: #ecf0f1;
color: #000;
line-height: 50px;
text-align: center;
}
.item-box:nth-of-type(odd) {
height: 80px;
line-height: 80px;
}
style>
<body>
<div class="container">
<div class="item-box item1">item1div>
<div class="item-box item2">item2div>
<div class="item-box item3">item3div>
<div class="item-box item4">item4div>
<div class="item-box item5">item5div>
div>
body>
align-items 属性将所有直接子节点上的 align-self 值设置为一个组。实现弹性布局中子元素的交叉轴上对齐
。
可选值:
<style>
.container {
margin-top: 30px;
background-color: #7f8c8d;
border: 5px dashed #34495e;
/* flex 伸缩布局-开始 */
display: flex;
flex-wrap: wrap;
align-items: center;
/* flex 伸缩布局-结束 */
}
.item-box {
margin: 5px;
width: 100px;
height: 50px;
background-color: #ecf0f1;
color: #000;
line-height: 50px;
text-align: center;
}
.item-box:nth-of-type(odd) {
height: 80px;
line-height: 80px;
}
style>
<div class="container">
<div class="item-box item1">item1div>
<div class="item-box item2">item2div>
<div class="item-box item3">item3div>
<div class="item-box item4">item4div>
<div class="item-box item5">item5div>
div>
会对齐当前 grid 或 flex 行中的元素,并覆盖已有的 align-items 的值。align-self 属性不适用于块类型的盒模型和表格单元。如果任何 flexbox 元素的侧轴方向 margin 值设置为 auto,则会忽略 align-self。控制的是当个元素的对齐方式
。
可选值:
<style>
.container {
margin-top: 30px;
background-color: #7f8c8d;
border: 5px dashed #34495e;
/* flex 伸缩布局-开始 */
display: flex;
flex-wrap: wrap;
align-items: center;
/* flex 伸缩布局-结束 */
}
.item-box {
margin: 5px;
width: 100px;
height: 50px;
background-color: #ecf0f1;
color: #000;
line-height: 50px;
text-align: center;
}
.item-box:nth-of-type(odd) {
height: 80px;
line-height: 80px;
}
.item2 {
align-self: flex-end;
}
style>
<div class="container">
<div class="item-box item1">item1div>
<div class="item-box item2">item2div>
<div class="item-box item3">item3div>
<div class="item-box item4">item4div>
<div class="item-box item5">item5div>
div>
定义了浏览器之间,如何分配顺着弹性容器主轴(或者网格行轴) 的元素之间及其周围的空间。
可选值:
<style>
.container {
margin-top: 30px;
background-color: #7f8c8d;
border: 5px dashed #34495e;
/* flex 伸缩布局-开始 */
display: flex;
flex-wrap: wrap;
justify-content: center;
/* flex 伸缩布局-结束 */
}
.item-box {
margin: 5px;
width: 100px;
height: 50px;
background-color: #ecf0f1;
color: #000;
line-height: 50px;
text-align: center;
}
.item-box:nth-of-type(odd) {
height: 80px;
line-height: 80px;
}
style>
<body>
<div class="container">
<div class="item-box item1">item1div>
<div class="item-box item2">item2div>
<div class="item-box item3">item3div>
<div class="item-box item4">item4div>
<div class="item-box item5">item5div>
div>
body>
place-content 属性是 align-content 和 justify-content 的简写. 使用这两个属性的值可以用于任何的布局情况。
用来设置行元素之间的间隙(gutter) 大小。
用来设置元素列之间的间隔 (gutter) 大小。
用来设置网格行与列之间的间隙(gutters),该属性是 row-gap and column-gap 的简写形式。
可选值:
<style>
.container {
margin-top: 30px;
background-color: #7f8c8d;
border: 5px dashed #34495e;
/* flex 伸缩布局-开始 */
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 10px 10px;
/* flex 伸缩布局-结束 */
}
.item-box {
margin: 5px;
width: 100px;
height: 50px;
background-color: #ecf0f1;
color: #000;
line-height: 50px;
text-align: center;
}
.item-box:nth-of-type(odd) {
height: 80px;
line-height: 80px;
}
style>
<body>
<div class="container">
<div class="item-box item1">item1div>
<div class="item-box item2">item2div>
<div class="item-box item3">item3div>
<div class="item-box item4">item4div>
<div class="item-box item5">item5div>
div>
body>
弹性布局是现在比较流行的布局方式了,我们分别从如何定义一个弹性盒子出发,学习关于弹性布局的专业名字,并将其子元素控制的 css 属性做了深入的认识与比较。
在 css 的一般属性中,可以控制主轴方向、是否换行以及对 flex 元素的缩放进行测试;其次是对齐属性的认识,关于交叉轴的对齐方式有三种,分别是:align-content(控制除子元素外的对于空间对齐),align-items(为子元素行中空间对齐),align-self(单一控制某一个 flex 子元素的对齐。然后就是关于主轴上的元素对齐,最后,属性 gap 则是控制子元素之间的间隔。
本文介绍到的css属性有很多,感兴趣的小伙伴们可以运行测试。
最后,如果您有更好的方法,欢迎在留言区中分享;或者实际操作中遇到什么问题均可留言或者私信我,感谢您的观看!
官方文档:
MDN Web Docs - Basic Concepts of Flexbox
MDN Web Docs - CSS Flexible Box Layout