一文吃透 CSS Flex 布局

news2024/11/17 13:48:52

原文链接:一文吃透 CSS Flex 布局

教学游戏

这里有两个小游戏,可用来练习 flex 布局。

塔防游戏
送小青蛙回家

Flexbox 概述

Flexbox 布局也叫 Flex 布局,弹性盒子布局。

它决定了元素如何在页面上排列,使它们能在不同的屏幕尺寸和设备下可预测地展现出来,更简便、完整、响应式地实现各种页面布局。

它的主要思想是使父元素能够调整子元素的宽度、高度、排列方式,从而更好的适应可用的布局空间。

任何一个容器都可以指定为 Flex 布局。

.box{
  display: flex;
}

行内元素也可以使用 Flex 布局。

.box{
display: inline-flex;
}

Webkit 内核的浏览器,必须加上-webkit前缀。

.box{
  display: -webkit-flex; /* Safari */
  display: flex;
}

注意,设为 Flex 布局以后,子元素的floatclearvertical-align属性将失效。当布局涉及到不定宽度,分布对⻬的场景时,我们可以优先考虑弹性盒布局。

基本概念

采用 Flex 布局的元素,称为 Flex 容器(flex container),简称"容器"。它的所有 {% span blue , 子元素 %}(注意是子元素,不是全部后代元素)自动成为容器成员,称为 Flex 项目(flex item),简称"项目"。

容器默认存在两根轴: 水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end

项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size

容器属性

以下6个属性设置在容器上。

  • flex-direction
  • flex-wrap
  • flex-flow
  • justify-content
  • align-items
  • align-content

flex-direction

flex-direction 属性决定主轴的方向(即项目的排列方向)。

.box {
  flex-direction: row | row-reverse | column | column-reverse;
}
属性值含义
row默认值,主轴为水平方向(水平布局),起点在左端,从左向右排列
row-reverse主轴为水平方向(水平布局),起点在右端,从右向左排列
column主轴为垂直方向(垂直布局),起点在上沿,从上往下排列
column-reverse主轴为垂直方向(垂直布局),起点在下沿,从下往上排列

flex-wrap

默认情况下,项目都排在一条线(又称"轴线")上。flex-wrap属性定义,如果一条轴线排不下,如何换行。

.box{
  flex-wrap: nowrap | wrap | wrap-reverse;
}
属性值含义
nowrap默认值,表示不换行
wrap换行
wrap-reverse换行,第一行在下方
  1. flex-wrap: nowrap: 默认值,不换行。当主轴的长度是固定并且空间不足时,项目尺寸会随之进行调整,而不会换行。
  2. flex-wrap: wrap: 换行,第一行在上面
  3. wrap-reverse: 换行,第一行在下方。

flex-flow

flex-flow属性是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap

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

justify-content

justify-content属性定义了项目在主轴上的对齐方式。

.box {
  justify-content: flex-start | flex-end | center | space-between | space-around;
}
属性值含义
flex-start默认值,左对齐
flex-end右对齐
center居中
space-between两端对齐,项目之间的间隔都相等
space-around每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍

flex-start
flex-end
center
space-between
space-around

align-items

align-items属性定义项目在交叉轴上如何对齐。

.box {
  align-items: flex-start | flex-end | center | baseline | stretch;
}
属性值含义
flex-start交叉轴的起点对齐
flex-end交叉轴的终点对齐
center交叉轴的中点对齐
baseline项目的第一行文字的基线对齐
stretch(默认值) 如果项目未设置高度或设为auto,将占满整个容器的高度

(1)flex-start: 交叉轴的起点对齐(上面或左边)。设置容器高度为 100px,项目高度分别为 20px、40px、60px、80px、100px,效果如图所示:

(2)flex-end: 交叉轴的终点对齐(下面或右边)。设置容器高度为 100px,项目高度分别为 20px、40px、60px、80px、100px,效果如图所示:

(3)center: 交叉轴的中点对齐。设置容器高度为 100px,项目高度分别为 20px、40px、60px、80px、100px,效果如图所示:

(4)stretch: 默认值、如果元素未设置高度或设为auto,将占满整个容器的高度。假设容器高度设置为 100px,而项目没有设置高度,则项目的高度也为 100px:

(5)baseline:以元素的第一行文字的基线对齐

align-content

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

.box {
  align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}
属性值含义
flex-start与交叉轴的起点对齐
flex-end与交叉轴的终点对齐
center与交叉轴的中点对齐
space-between与交叉轴两端对齐,轴线之间的间隔平均分布
space-around每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍
stretch默认值,轴线占满整个交叉轴

(1)stretch: 默认值,轴线占满整个交叉轴。这里我们先设置每个项目都是固定宽度,效果如下:

下面就去掉每个项目的高度,它会占满整个交叉轴,效果如下:

(2)flex-start: 从交叉轴开始位置填充

(3)flex-end: 从交叉轴结尾位置填充

(4)center: 与交叉轴中点对齐

(5)space-between: 与交叉轴两端对齐,轴线之前的间隔平均分布

(6)space-around: 每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍

项目属性

以下6个属性设置在项目上。

  • order
  • flex-grow
  • flex-shrink
  • flex-basis
  • flex
  • align-self

order

order属性用来定义项目的排列顺序。数值越小,排列越靠前,默认为 0 。使用形式如下:

.item {
    order: <integer>;
}

flex-grow

flex-grow属性定义项目的放大比例,默认为 0 ,即如果存在剩余空间,也不放大。

.item {
  flex-grow: <number>; /* default 0 */
}

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

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

flex-shrink

flex-shrink属性定义了项目的缩小比例,默认为 1 ,即如果空间不足,该项目将缩小。

.item {
  flex-shrink: <number>; /* default 1 */
}

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

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

负值对该属性无效。

flex-basis

flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。

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

它可以设为跟widthheight属性一样的值(比如350px),则项目将占据固定空间。

当主轴设置为水平时,当设置了flex-basis,设置的项目宽度值会失效,flex-basis需要跟flex-growflex-shrink配合使用才能生效。有两种特殊的值:

  • 当 flex-basis 值为 0 % 时,项目尺寸会被认为是0,因此无论项目尺寸设置多少都用;
  • 当 flex-basis 值为 auto 时,则跟根据尺寸的设定值来设置大小。

flex

flex属性是flex-grow, flex-shrinkflex-basis的简写,默认值为0 1 auto。后两个属性可选。

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

该属性有两个快捷值auto (1 1 auto)none (0 0 auto)

建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值。

(1)默认值:flex:0 1 auto,即在有剩余空间时,只放大不缩小

.item {
  flex:0 1 auto;
}
.item {
  flex-grow: 0;
  flex-shrink: 1;
  flex-basis: auto;
}

(2)flex: none,即有剩余空间时,不放大也不缩小,最终尺寸通常表现为最大内容宽度。

.item {
  flex:0 0 auto;
}
.item {
  flex-grow: 0;
  flex-shrink: 0;
  flex-basis: auto;
}

(3)flex: 0,即当有剩余空间时,项目宽度为其内容的宽度,最终尺寸表现为最小内容宽度。

.item {
  flex:0 1 0%;
}
.item {
  flex-grow: 0;
  flex-shrink: 1;
  flex-basis: 0%;
}

(4)flex: auto,即元素尺寸可以弹性增大,也可以弹性变小,具有十足的弹性,但在尺寸不足时会优先最大化内容尺寸。

.item {
  flex:1 1 auto;
}
.item {
  flex-grow: 1;
  flex-shrink: 1;
  flex-basis: auto;
}

(5)flex: 1,即元素尺寸可以弹性增大,也可以弹性变小,具有十足的弹性,但是在尺寸不足时会优先最小化内容尺寸。

.item {
  flex:1 1 0%;
}
.item {
  flex-grow: 1;
  flex-shrink: 1;
  flex-basis: 0%;
}

align-self

align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch

.item {
  align-self: auto | flex-start | flex-end | center | baseline | stretch;
}

推荐阅读

Flex 布局教程:语法篇
Flex 布局教程:实例篇
FlexBox (“弹性盒子”) 介绍
弹性盒子(flexbox)布局属性详解
10分钟彻底掌握 CSS Flex 布局

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/660259.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql索引、事务以及存储引擎

目录 一、索引 1.概述 2.作用 3.索引的缺点 4.创建索引的原则依据 5.索引分类和创建 5.1普通索引 5.2唯一索引 5.3主键索引 5.4组合索引&#xff08;单列索引与多列索引&#xff09; 5.5全文索引&#xff08;FULLTEXT&#xff09; 6.查看索引 7.删除索引 二、事务…

测试必会技能之接口性能测试方案你会不会写?

目录 一、 性能测试术语解释 二、 性能测试方法及目标 三、 性能需求分析 四、 性能测试范围 五、 并发数计算方法 六、 性能测试用例与场景 七、 性能测试工具选择 八、 性能测试结果分析 九、 性能测试通过标准 总结&#xff1a; 一、 性能测试术语解释 …

腾讯云服务器可用区什么意思?

腾讯云服务器可用区什么意思&#xff1f;可用区&#xff08;Zone&#xff09;是指腾讯云在同一地域内电力和网络互相独立的物理数据中心&#xff0c;一个可用区故障不会影响另一个可用区的正常运行&#xff0c;所以可用区用于构建高容灾、高可靠性应用。腾讯云服务器网来详细说…

java为什么不支持多继承

Java为什么不支持多继承 前面我们提到过“继承则好比武侠中的传承血脉&#xff0c;子类可以继承父类的属性和方法&#xff0c;并且可以根据需要进行自我扩展&#xff0c;这样就不用从头造轮子&#xff0c;提高了代码的重用性和可维护性。”&#xff0c;在java中支持接口实现多继…

龙芯电脑(LoongArch)如何升级BIOS(UEFI固件)

龙芯UEFI 获取地址&#xff08;包括3A5000 台式机&#xff0c;笔记本&#xff0c;3C5000 服务器&#xff09;&#xff1a; gitee: https://gitee.com/loongson/Firmware github: https://github.com/loongson/Firmware 根据自身机型选择相应的固件&#xff08;Image目录有相…

第七章——微分方程

注&#xff1a;//之后的都是注释&#xff0c;不是过程。 一、求常系数线性齐次微分方程的通解 1.一般形式&#xff1a;ypyqy0。 2.齐次&#xff1a;“齐次”的含义就是次数相等&#xff0c;ypyqy0都是一次幂&#xff0c;所以是齐次线性微分方程&#xff0c;如果说加上一个常…

有理函数积分

有理函数积分&#xff0c;一共分为三步&#xff1a; ①有理函数拆分 ②求待定系数 ③积分 一、有理函数拆分 有理函数拆分就是需要把被积函数拆开成若干项简单真分式相加。 &#xff08;真分式&#xff1a;分子最高次幂&#xff1c;分母最高次幂&#xff09; 简单真分式&#x…

自定义注解实现数据脱敏

自定义注解实现数据脱敏 在实际开发中经常会遇到有一些信息不能全部展示用户&#xff0c;需要隐藏&#xff08;可以叫脱敏&#xff09;一部分的情况比如地址&#xff0c;电话&#xff0c;手机号&#xff0c;身份证等。 脱敏的做法目前我知道的方法有&#xff1a; 1&#xff09;…

JMeter 性能测试基本过程及示例,希望可以帮到你

目录 jmeter 为性能测试提供了一下特色&#xff1a; 基本过程 总结 jmeter 为性能测试提供了一下特色&#xff1a; jmeter 可以对测试静态资源&#xff08;例如 js、html 等&#xff09;以及动态资源&#xff08;例如 php、jsp、ajax 等等&#xff09;进行性能测试 jmeter 可…

(CVPR-2014)DeepPose:通过深度神经网络进行人体姿态估计

DeepPose&#xff1a;通过深度神经网络进行人体姿态估计 论文题目&#xff1a;DeepPose: Human Pose Estimation via Deep Neural Networks 论文是谷歌发表在CVPR 2014的工作 论文地址 Abstract 我们提出了一种基于深度神经网络 (DNN) 的人体姿态估计方法。姿势估计被表述为基…

202318读书笔记|《芭蕉·芜村·一茶:俳句三圣新译300》——樱花——让一整个春夜亮起来!

202318读书笔记&#xff5c;《芭蕉芜村一茶&#xff1a;俳句三圣新译300》——樱花——让一整个春夜亮起来&#xff01; 《芭蕉芜村一茶&#xff1a;俳句三圣新译300》诗歌&#xff0c;词&#xff0c;短歌&#xff0c;俳句我都喜欢&#xff0c;读起来轻松明快&#xff01; 松尾…

【代码实验】YOLO V7利用pycocotools进行评估时的一些问题

文章目录 一、无法使用pycocotools进行评估二、使用pycocotools计算的结果与YOLO自身的mAP差异较大的原因 一、无法使用pycocotools进行评估 yolov7有自己的计算mAP方式&#xff0c;但是在使用pycocotools进行test时&#xff0c;出现了pycocotools unable to run: Results do …

Java关键词synchronized

目录 一、通过卖票系统观察多线程的安全隐患 二、synchronized的基本知识 1.使用synchronized的原因 2.synchronized的作用 3.synchronized的基本格式 a.synchronized加在方法名前 b.synchronized用在方法中 4. Java锁机制 5.synchronized注意事项 三、使用synchronize…

【可变参数列表如何可变?】

可变参数列表 本章重点 学会使用可变参数列表的使用与原理 函数传参补充知识 如果函数没有形式参数&#xff0c;仍然可以给函数传递参数。在c语言中&#xff0c;只要发生了函数调用并且传递了函数&#xff0c;必定形成临时变量。所谓的临时拷贝本质就是在栈帧内部形成的&#…

Tcl常用命令备忘录-基础篇

一、置换 1、变量置换 在Tcl中&#xff0c;$符号可以用来引用变量。变量置换可以用来将变量的值嵌入到代码中。例如&#xff1a; set name "Tom" puts "Hello, $name!"这个示例中&#xff0c;变量$name的值会在输出语句中被替换为"Tom"。 2…

腾讯云服务器镜像市场快速搭建WordPress博客网站教程

通过腾讯云服务器的镜像市场搭建WordPress网站非常简单&#xff0c;不需要手动配置WP所需的Web环境&#xff0c;一键即可安装WordPress博客&#xff0c;腾讯云百科使用腾讯云服务器通过镜像市场的WordPress镜像搭建WP网站教程&#xff1a; 目录 腾讯云服务器通过市场镜像安装…

SpringMvc拦截器和手写模拟SpringMvc工作流程源码详解

目录 1. SpringMvc简介 1.1 什么是MVC 1.2 什么是SpringMvc 1.3 SpringMvc 能干什么 1.4 SpringMvc 工作流程 2. SpringMvc拦截器和过滤器 2.1 拦截器 2.1.1 拦截器作用 2.1.2 拦截器和过滤器的区别 2.1.3 拦截器方法说明 2.1.4 多个拦截器执行顺序 2.1.5 自定义拦…

29 虚拟地址到物理地址的转换

前言 呵呵 这是 linux 中内存管理中很基础的一环 用户程序 操作的地址都是虚拟地址, 虚拟地址通过 mmu 转换为物理地址 用户程序 看到的地址都是一个完整的世界, 只有具体需要使用的时候 产生缺页中断, 然后 分配具体的物理页 这里 要说的就是 虚拟地址 到 物理地址 的转…

1001router6-react

文章目录 1 一级路由2 Navigate3 NavLink 自定义高亮样式4 useRoutes()5 嵌套路由6 路由传参6.1 传递params参数6.2 传递search参数6.3 传递state参数 7 编程式导航7.1 路由跳转7.2 前进、后退 8 钩子函数8.1 useInRouterContext()8.2 useNavigationType()8.3 useOutlet()8.4 u…

手写Spring框架---AOP实现

目录 容器是OOP的高级工具 系统需求 关注点分离Concern Separation 原有实现 AOP的成员 Advice的种类 单个Aspect的执行顺序 多个Aspect的执行顺序 Introduction-引入型Advice 代理模式 JDK动态代理 Spring AOP的实现原理之JDK动态代理 Spring AOP的实现原理之CGL…