首页 > 其他分享 >CSS Flex 布局教程

CSS Flex 布局教程

时间:2024-10-10 15:46:55浏览次数:12  
标签:Flex 教程 flex basis shrink item 项目 grow CSS

简介

弹性盒子是 CSS3 的一种新的布局模式。CSS3 弹性盒( Flexible Box 或 flexbox),是一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的布局方式。引入弹性盒布局模型的目的是提供一种更加有效的方式来对一个容器中的子元素进行排列、对齐和分配空白空间。

弹性盒子由弹性容器(Flex container)和弹性子元素(Flex item)组成。弹性容器通过设置 display 属性的值为 flex 或 inline-flex将其定义为弹性容器。弹性容器内包含了一个或多个弹性子元素。

Flex适用于较高版本浏览器,如果是想要兼容较底版本,则推荐使用。好了,让我们速开始:

Flex 基本概念

在 flex 容器中默认存在两条轴,水平主轴(main axis) 和垂直的交叉轴(cross axis),这是默认的设置,当然你可以通过修改使垂直方向变为主轴,水平方向变为交叉轴,这个我们后面再说。

在容器中的每个单元块被称之为 flex item,每个项目占据的主轴空间为 (main size), 占据的交叉轴的空间为 (cross size)。

这里需要强调,不能先入为主认为宽度就是 main size,高度就是 cross size,这个还要取决于你主轴的方向,如果你垂直方向是主轴,那么项目的高度就是 main size

Flex 容器:

首先,实现 flex 布局需要先指定一个容器,任何一个容器都可以被指定为 flex 布局,这样容器内部的元素就可以使用 flex 来进行布局。

.container {
    display: flex | inline-flex;       //可以有两种取值
}

分别生成一个块状或行内的 flex 容器盒子。简单说来,如果你使用块元素如 div,你就可以使用 flex,而如果你使用行内元素,你可以使用 inline-flex

注:当时设置 flex 布局之后,子元素的 float、clear、vertical-align 的属性将会失效。

有下面六种属性可以设置在容器上,它们分别是:

1. flex-direction
2. flex-wrap
3. flex-flow
4. justify-content
5. align-items
6. align-content

1. flex-direction: 决定主轴的方向(即项目的排列方向)

.container {
    flex-direction: row | row-reverse | column | column-reverse;
}

默认值:row,主轴为水平方向,起点在左端。

  • row-reverse:主轴为水平方向,起点在右端

  • column:主轴为垂直方向,起点在上沿

  • column-reverse:主轴为垂直方向,起点在下沿

2. flex-wrap: 决定容器内项目是否可换行

默认情况下,项目都排在主轴线上,使用 flex-wrap 可实现项目的换行。

默认值:nowrap 不换行,即当主轴尺寸固定时,当空间不足时,项目尺寸会随之调整(变形)而并不会挤到下一行。

  • wrap:项目主轴总尺寸超出容器时换行,第一行在上方

  • wrap-reverse:换行,第一行在下方

3. flex-flow: flex-direction 和 fl****x-wrap 的简写形式

.container {
    flex-flow: <flex-direction> || <flex-wrap>;
}

没什么用,老老实实分开写

4. justify-content:定义了项目在主轴的对齐方式。

.container {
    justify-content: flex-start | flex-end | center | space-between | space-around;
}

PS:非常好用,类似自动化编排

建立在主轴为水平方向时测试,即 flex-direction: row

默认值: flex-start 左对齐

  • flex-end:右对齐

  • center:居中

  • space-between:两端对齐,项目之间的间隔相等,即剩余空间等分成间隙。

  • space-around:每个项目两侧的间隔相等,所以项目之间的间隔比项目与边缘的间隔大一倍。(边0.5,间隔1)

5. align-items: 定义了项目在交叉轴上的对齐方式

.container {
    align-items: flex-start | flex-end | center | baseline | stretch;
}

建立在主轴为水平方向时测试,即 flex-direction: row

默认值为 stretch 即如果项目未设置高度或者设为 auto,将占满整个容器的高度。

假设容器高度设置为 100px,而项目都没有设置高度的情况下,则项目的高度也为 100px。

  • flex-start:交叉轴的起点对齐

假设容器高度设置为 100px,而项目分别为 20px, 40px, 60px, 80px, 100px, 则如上图显示。

  • flex-end:交叉轴的终点对齐

  • center:交叉轴的中点对齐

  • baseline: 项目的第一行文字的基线对齐

以文字的底部为主,仔细看图可以理解。

6. align-content: 定义了多根轴线的对齐方式,如果项目只有一根轴线,那么该属性将不起作用

.container {
    align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}

这个这样理解:

当你 flex-wrap 设置为 nowrap 的时候,容器仅存在一根轴线,因为项目不会换行,就不会产生多条轴线。

当你 flex-wrap 设置为 wrap 的时候,容器可能会出现多条轴线,这时候你就需要去设置多条轴线之间的对齐方式了。

建立在主轴为水平方向时测试,即 flex-direction: row, flex-wrap: wrap

  • 默认值为 stretch,看下面的图就很好理解了

  • flex-start:轴线全部在交叉轴上的起点对齐(左上角)

  • flex-end:轴线全部在交叉轴上的终点对齐(右下角)

  • center:轴线全部在交叉轴上的中间对齐

  • space-between:轴线两端对齐,之间的间隔相等,即剩余空间等分成间隙。(类比justify-content)

  • space-around:每个轴线两侧的间隔相等,所以轴线之间的间隔比轴线与边缘的间隔大一倍。

Flex 项目属性:

有六种属性可运用在 item 项目上:

  1. order
  2. flex-basis
  3. flex-grow
  4. flex-shrink
  5. flex
  6. align-self

1. order: 定义项目在容器中的排列顺序,数值越小,排列越靠前,默认值为 0

.item {
    order: <integer>;
}

在 HTML 结构中,虽然 -2,-1 的 item 排在后面,但是由于分别设置了 order,使之能够排到最前面。

2. flex-basis: 定义了在分配多余空间之前,项目占据的主轴空间,浏览器根据这个属性,计算主轴是否有多余空间

.item {
    flex-basis: <length> | auto;
}

默认值:auto,即项目本来的大小, 这时候 item 的宽高取决于 width 或 height 的值。

当主轴为水平方向的时候,当设置了 flex-basis,项目的宽度设置值会失效,flex-basis 需要跟 flex-grow 和 flex-shrink 配合使用才能发挥效果。

  • 当 flex-basis 值为 0 % 时,是把该项目视为零尺寸的,故即使声明该尺寸为 140px,也并没有什么用。
  • 当 flex-basis 值为 auto 时,则跟根据尺寸的设定值(假如为 100px),则这 100px 不会纳入剩余空间。

3**. flex-grow: 定义项目的放大比例**

.item {
    flex-grow: <number>;
}

默认值为 0,即如果存在剩余空间,也不放大(依照basis)

当所有的项目都以 flex-basis 的值进行排列后,仍有剩余空间,那么这时候 flex-grow 就会发挥作用了。

如果所有项目的 flex-grow 属性都为 1,则它们将等分剩余空间。(如果有的话)

如果一个项目的 flex-grow 属性为 2,其他项目都为 1,则前者占据的剩余空间将比其他项多一倍。

当然如果当所有项目以 flex-basis 的值排列完后发现空间不够了,且 flex-wrap:nowrap 时,此时 flex-grow 则不起作用了,这时候就需要接下来的这个属性。

4. flex-shrink: 定义了项目的缩小比例

.item {
    flex-shrink: <number>;
}

默认值: 1,即如果空间不足,该项目将缩小,负值对该属性无效。

每个项目会被同比例进行缩小,因为默认值为 1。

  • 如果所有项目的 flex-shrink 属性都为 1,当空间不足时,都将等比例缩小。

  • 如果一个项目的 flex-shrink 属性为 0,其他项目都为 1,则空间不足时,前者不缩小。

5. flex: flex-grow, flex-shrink 和 flex-basis的简写

.item{
    flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
} 

flex 的默认值是以上三个属性值的组合。假设以上三个属性同样取默认值,则 flex 的默认值是 0 1 auto。

有关快捷值:auto (1 1 auto) 和 none (0 0 auto)

  • 当 flex 取值为一个非负数字,则该数字为 flex-grow 值,flex-shrink 取 1,flex-basis 取 0%,如下是等同的:
.item {flex: 1;}
.item {
    flex-grow: 1;
    flex-shrink: 1;
    flex-basis: 0%;
}
  • 当 flex 取值为 0 时,对应的三个值分别为 0 1 0%
.item {flex: 0;}
.item {
    flex-grow: 0;
    flex-shrink: 1;
    flex-basis: 0%;
}
  • 当 flex 取值为一个长度或百分比,则视为 flex-basis 值,flex-grow 取 1,flex-shrink 取 1,有如下等同情况(注意 0% 是一个百分比而不是一个非负数字)
.item-1 {flex: 0%;}
.item-1 {
    flex-grow: 1;
    flex-shrink: 1;
    flex-basis: 0%;
}

.item-2 {flex: 24px;}
.item-2 {
    flex-grow: 1;
    flex-shrink: 1;
    flex-basis: 24px;
}
  • 当 flex 取值为两个非负数字,则分别视为 flex-grow 和 flex-shrink 的值,flex-basis 取 0%,如下是等同的:
.item {flex: 2 3;}
.item {
    flex-grow: 2;
    flex-shrink: 3;
    flex-basis: 0%;
}
  • 当 flex 取值为一个非负数字和一个长度或百分比,则分别视为 flex-grow 和 flex-basis 的值,flex-shrink 取 1,如下是等同的:
.item {flex: 11 32px;}
.item {
    flex-grow: 11;
    flex-shrink: 1;
    flex-basis: 32px;
}

建议优先使用这个属性,而不是单独写三个分离的属性。

grow 和 shrink 是一对,grow 表示扩张因子,shrink 表示是收缩因子。

结尾

参照:

一劳永逸的搞定 flex 布局

CSS Flexible Box Layout

30 分钟学会 Flex 布局

标签:Flex,教程,flex,basis,shrink,item,项目,grow,CSS
From: https://blog.csdn.net/qq_45675429/article/details/142824119

相关文章

  • DevExpress WPF中文教程:如何解决数据更新的常见问题?
    DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。无论是Office办公软件的衍伸产品,还是以数据为......
  • ArgoWorkflow教程(六)---无缝实现步骤间参数传递
    之前我们分析了,Workflow、WorkflowTemplate、template3者之间如何传递参数。本文主要分析同一个Workflow中的不同step之间实现参数传递,比如将上一个步骤的输出作为下一个步骤的结果进行使用(而非以文件方式传递)。1.概述然后就是之前只分析了Workflow、WorkflowTemplat......
  • 传奇世界星河仿官元神法宝+单机版安装教程+无需虚拟机+GM
    今天给大家带来一款单机游戏的架设:传奇世界星河仿官元神法宝。另外:本人承接各种游戏架设(单机+联网)本人为了学习和研究软件内含的设计思想和原理,带了架设教程仅供娱乐。教程是本人亲自搭建成功的,绝对是完整可运行的,踩过的坑都给你们填上了。如果你是小白也没问题,跟着教程走也是可......
  • 富士胶片人像汽车照片Lr调色教程,手机滤镜PS+Lightroom预设下载!
    调色介绍富士胶片人像汽车照片的调色旨在营造出独特的复古、文艺氛围。通过Lightroom的调色工具,将人像与汽车完美融合在具有富士胶片特色的画面中,展现出别样的美感。预设信息调色风格:富士胶片风格预设适合类型:人像,街拍,自拍,模特照,封面照,汽车等预设格式:XMP+DNG手机滤镜资源......
  • 电影风格城市建筑地铁街拍摄影Lr调色教程,手机滤镜PS+Lightroom预设下载!
    调色介绍电影风格城市建筑地铁街拍摄影的Lr调色,旨在将城市建筑与地铁场景的街拍照片打造出具有电影质感的视觉效果,展现出都市的独特魅力与故事感。预设信息调色风格:电影风格预设适合类型:人像,地铁,街拍,自拍,公交车,火车,建筑等预设格式:XMP+DNG手机滤镜资源编号:00767支持软件:Li......
  • tp6发送邮件功能如何实现?tp6的使用教程?
    tp6发送邮件有哪些技巧?tp6发送邮件步骤与设置指南?tp6(ThinkPHP6)作为一款流行的PHP框架,提供了强大的邮件发送功能,使得开发者能够轻松实现这一需求。AokSend将详细介绍如何在tp6中实现邮件发送功能。tp6发送邮件:模板管理在实际应用中,邮件内容通常需要根据不同的场景进行定制......
  • uibot发送邮件:自动化邮件发送教程详解!
    uibot发送邮件的操作指南?uibot发送邮件的两种方式?在现代办公环境中,自动化流程的引入极大地提高了工作效率。uibot发送邮件功能成为了许多企业和个人实现邮件自动化发送的首选工具。AokSend将详细介绍如何使用uibot发送邮件。uibot发送邮件:准备工作确保您已经安装并配置好了......
  • CSS:transform-origin
    transform-origin:设置旋转元素的基点位置,即旋转轴的位置。而transform主要是平移和旋转的功能。使用transform-origin属性必须先使用transform属性(旋转)transform-origin:x-axisy-axisz-axis;默认值为:50%50%0x-axis的值可为left、center、right、lenght、%,left,center......
  • CSS规范写法
    CSS规范手册一 CSS书写顺序1.1 **{/*显示属性*/displaypositionfloatclearcursor… /*盒模型*/marginpaddingwidthheight/*排版*/vertical-alignwhite-spacetext-decorationtext-align… /*文字*/colorfontcontent/*边框背景。为什么要......
  • 【2024版】最简单的Pycharm安装 教程(新手小白都能学会)
    PyCharm安装教程1、点击右边链接→PyCharm安装包我们以专业版为例,下载完成后打开安装包点击下一步先选择安装位置,然后点击下一步勾选所有选项,点击下一步直接点击安装等待安装完成激火后PyCharm就可以使用了PyCharm专业版安装包、集活码获取:点击这里最......