前端知识——css 之 flex 布局

2023-11-12

一、认识 flex 布局

长久以来,CSS 布局中唯一可靠且跨浏览器兼容的布局工具只有 floats 和 positioning。 但是这两种方法本身存在很大的局限性, 并且他们用于布局实在是无奈之举。

一些布局上的痛点无法解决:

  • 比如在父内容里面垂直居中一个块内容
  • 比如使容器的所有子项等分可用宽度/高度,而不管有多少宽度/高度可用
  • 比如使多列布局中的所有列采用相同的高度,即使它们包含的内容量不同

1. flex 布局的重要概念

两个重要的概念:

  • 开启了 flex 布局的元素叫 flex container
  • flex container 里面的直接子元素叫做 flex item

使元素成为 flex container:

  • display: flex: flex container 以 block-level 形式存在(常用)
  • display: inline-flex: flex container 以 inline-level 形式存在

flex item元素具有以下特点:

  • flex item的布局将受flex container属性的设置来进行控制和布局
  • flex item不再严格区分块级元素和行内级元素
  • flex item默认情况下是包裹内容的, 但是可以设置宽度和高度

在这里插入图片描述

二、flex 相关属性

属性分为两类:
在这里插入图片描述

1. flex container 中的属性

1.1 flex-direction:item 的排布方向

flex items 默认都是沿着 main axis(主轴)从 main start 开始往 main end 方向排布

flex-direction 决定了 main axis 的方向,有 4 个取值:

  • row(默认值)
  • row-reverse
  • column
  • column-reverse

在这里插入图片描述

1.2 flex-wrap:排布是否换行

flex-wrap 决定了 flex container 是单行还是多行:

  • nowrap(默认):单行
  • wrap:多行
  • wrap-reverse:多行(对比 wrap,cross start 与 cross end 相反)

在这里插入图片描述

注意:
flex-wrap 取默认值时,若一行放不下所有的item元素,则会等比例压缩每个item的宽度,不会换行

1.3 flex-flow:属性的合并写法

flex-flow 属性是 flex-direction 和 flex-wrap 的简写,顺序任何

flex-flow: row-reverse wrap-reverse

1.4 justify-content:item 的水平对齐方式

justify-content 决定了 flex items 在 main axis 上的对齐方式:

  • flex-start(默认值):与 main start 对齐
  • flex-end:与 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 之间的距离

在这里插入图片描述

1.5 align-item:item 的垂直对齐方式

align-items 决定了 flex items 在 cross axis 上的对齐方式:

  • normal:在弹性布局中,效果和stretch一样
  • flex-start:与 cross start 对齐
  • flex-end:与 cross end 对齐
  • center:居中对齐
  • stretch:当 flex items 在 cross axis 方向的 size 为 auto 时(未定义高度),会自动拉伸至填充 flex container
  • baseline:与文字的基准线对齐

在这里插入图片描述

1.6 align-content:多行 item 的垂直对齐方式

align-content 决定了多行 flex items 在 cross axis 上的对齐方式:

  • 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 之间的距离

在这里插入图片描述

2. flex-item 中的属性

2.1 order:item 的排布顺序

order 决定了 flex items 的排布顺序:

  • 可以设置任意整数(正整数、负整数、0),值越小就越排在前面
  • 默认值是 0

2.2 align-self:覆盖 align-items 设置的垂直对齐方式

通过 align-self 覆盖 flex container 设置的 align-items:

  • auto(默认值):遵从 flex container 的 align-items 设置
  • stretch、flex-start、flex-end、center、baseline,效果跟 align-items 一致

在这里插入图片描述

2.3 flex-grow:item 如何拉伸

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)
  • items 扩展后的最终 size 不能超过 max-width\max-height

在这里插入图片描述

2.4 flex-shrink:item 如何收缩

flex-shrink 决定了 flex items 如何收缩(缩小):

  • 可以设置任意非负数字(正小数、正整数、0),默认值是 1
  • 当 flex items 在 main axis 方向上超过了 flex container 的 size,flex-shrink 属性才会有效

注意:

  • 如果所有 flex items 的 flex-shrink 总和超过 1,每个 flex item 收缩的 size = items超出flex container的size * (收缩比例 / 所有flex items的收缩比例之和)
  • flex items 收缩后的最终 size 不能小于 min-width\min-height

2.5 flex-basis:设置 items 的 base size

flex-basis 用来设置 flex items 在 main axis 方向上的 base size:

  • auto(默认值)、具体的宽度数值(100px)
  • 若item中某个英文单词超出flex-basis宽度(中文不会出现此种情况),可以自动显示完全,若设置的是width则不可

在这里插入图片描述

决定 flex items 最终 base size 的因素,从优先级高到低:

  • max-width\max-height\min-width\min-height
  • flex-basis
  • width\height
  • 内容本身的 size

2.6 flex 属性:属性的合并写法

flex 是 flex-grow || flex-shrink || flex-basis 的简写,flex 属性可以指定1个、2个或3个值。
在这里插入图片描述

单值:

  • 一个无单位数(number): 它会被当作 flex-grow 的值。
  • 一个有效的宽度(width)值: 它会被当作 flex-basis 的值。
  • 关键字none,auto或initial

双值:

  • 第一个值必须为一个无单位数,并且它会被当作 flex-grow 的值
  • 第二个值必须为以下之一:
    • 一个无单位数:它会被当作 flex-shrink 的值
    • 一个有效的宽度值: 它会被当作 flex-basis 的值

三值:

  • 第一个值必须为一个无单位数,并且它会被当作 flex-grow 的值。
  • 第二个值必须为一个无单位数,并且它会被当作 flex-shrink 的值。
  • 第三个值必须为一个有效的宽度值, 并且它会被当作 flex-basis 的值

三、一个布局思考

在日常应用布局中,经常会出现item个数未知的情况。此时布局会出现下列情况:

在这里插入图片描述

<!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>
		<style>
			.container {
				width: 500px;
				background-color: orange;
				
				display: flex;
				flex-wrap: wrap;
				justify-content: space-between;
			}
			
			.item {
				width: 110px;
				height: 140px;
			}
			.container > i {
				/* 只能设置宽度,不能设置高度,这样i的数量超出时也不会影响布局 */
				width: 110px;
			}
		</style>
	</head>
	
	<body>
		<div class="container">
			<div class="item item1">1</div>
			<div class="item item2">2</div>
			<div class="item item3">3</div>
			<div class="item item1">1</div>
			<div class="item item2">2</div>
			<div class="item item3">3</div>
			<div class="item item1">1</div>
			<div class="item item2">2</div>
			<div class="item item3">3</div>
			<div class="item item3">3</div>
			<div class="item item3">3</div>
			<!-- 添加i的个数是列数减-2 -->
			<i></i><i></i>
		</div>
		
		<script src="./js/itemRandomColor.js"></script>
	</body>
</html>

item 多出1个的时候,布局仍是正常的;只有item大于等于2个时,才会出现分散的分布,需要i进行补齐。因此添加i的个数是列数减-2

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前端知识——css 之 flex 布局 的相关文章

  • 可以将position:absolute元素设为粘性吗?

    In CSS position sticky使元素能够显示position static行为 即 它采用文档流中的默认位置 直到到达某个滚动位置 然后采用position fixed行为 那么 这是否意味着我们不能使用position st
  • 删除特定数据表上的所有边框

    我需要使用 PrimeFaces 隐藏一个数据表的所有边框 而不是全部 我尝试了很多事情 但没有人奏效 有谁知道该怎么做 我已将以下样式 单独 应用于ui datatable class border hidden important bo
  • 在 Android 上禁用标注(上下文菜单)

    在网络应用程序中 我需要禁用移动浏览器在触摸并按住 长按 触摸目标 例如 img 或链接 我已经在使用了 webkit touch callout none 它在 iPhone 和 iPad 上运行良好 但似乎不适用于 Android 在
  • 在 ember-cli 中安装 Foundation 5

    我对 ember 相当陌生 对构建工具也很陌生 我目前正在使用通常的基础安装以及基础 cli 和指南针来编译我的 css 这有点痛苦 并且对于团队工作来说非常糟糕 我认为用 Bower 安装文件并使用会更好ember cli compass
  • 滚动时的 CSS 背景模糊

    我有固定的背景图像 滚动时我希望图像变得模糊 我知道如何在 css 中进行模糊 但在特定的滚动位置进行 这是一个例子 https medium com good music f160ba9e6c52 https medium com goo
  • 如何在Yii框架中向Form添加类?

    我在 Yii 中有一个表单 我想向该表单添加一个类
  • 导航栏下拉菜单(折叠)在 Bootstrap 5 中不起作用

    我在尝试使用以下命令创建响应式菜单或下拉按钮时遇到问题Bootstrap 5一切似乎都正常 导航图标和下拉图标出现 但它不起作用 当我单击nav图标或dropdown按钮 无dropdown menu apears 我想特别提到的是 我还包
  • 删除 IE9 边缘周围的 2px 灰色边框

    我正在尝试对这个网站进行编码 尝试关键字 并且我正在尝试找出如何删除这个阴影2px灰色边框延伸到 IE9 窗口的内部 至少顶部 左侧和底部 我的边距设置为零 因此所有页面元素都到达页面的最边缘 但使用 IE9 它们会停在这个灰色边框处 我没
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 使用 JavaScript 移动页面上的按钮

    我的按钮可以移动 但奇怪的是 我无法弄清楚偏移是否有问题 我希望我的按钮随着鼠标光标移动 但现在它的移动方式不是我想要的 有时它会消失 另外 创建的新按钮是重叠的 我不知道如何解决这个问题并拥有更好的外观 var coorA var coo
  • 具有 100% 高度行和 Internet Explorer 9 的表格

    我有以下示例 div style height 150px background color AAAAFF div
  • css3按钮背景颜色无限过渡

    有没有办法仅使用 css3 使按钮的背景颜色从灰色渐变为蓝色 然后又回到灰色 一个很好的例子是默认操作按钮是可可 我知道这可以在 javascript 中完成 但我宁愿只使用 css 来完成此操作 您好 我已经通过 CSS3 动画制作了按钮
  • IE 11 中的 CSS Display Flex 无法正常工作,图像会溢出

    我正在使用 CSSdisplay flex 以某种方式显示它们 在 Chrome 中 它看起来很完美 很漂亮 但在 IE 中 图像超出了我放置它们的元素 https jsfiddle net m42k7Lk5 8 https jsfiddl
  • 指南针字体输出错误的字体文件路径

    font face font family HelveticaNeueLTStd Lt src url css fonts HelveticaNeueLTStd Lt otf format opentype 这是我的指南针代码的输出 inc
  • 如何在 select2 下拉列表中换行?

    我正在使用 select 2 下拉菜单 然后在其内容中显示一些长句子 我想在句子的正确位置添加换行符 但下拉菜单是自动调整的 For example the content of the dropdown right now looks l
  • CSS:仅显示字符串的前两个字母

    是否可以使用纯 CSS 仅显示字符串的前两个字母 到目前为止我已经尝试过 没有成功 first letter 仅针对第一个字母 无论如何对我不起作用 nth of everything 需要额外的 javascript 文本溢出 省略号 正
  • 有角度的动态背景图片

    在 html 模板中 我有这种带有动态图像的样式 div style background none width 200px height 150px div 它适用于网络浏览器和 Android 浏览器 但是 使用 style 的动态背景
  • 为 Angular2 中的组件加载多个样式表

    我正在构建一个 angular2 应用程序 当我尝试为同一组件加载多个样式表时 我面临多个问题 这是我正在做的代码 import Component from angular core Component selector my tag t
  • 使用css bootstrap时如何仅向一列添加右边框?

    我正在尝试使用CSS引导框架 http getbootstrap com css tables在我的项目中 我正在使用带有以下类的表table table bordered table striped 我想删除除第一列之外的所有列的边框 这
  • 表格行未扩展到全宽

    我有一个表格 当我将表格的宽度设置为 100 并将表格行的宽度设置为 100 时 没有任何反应或宽度发生变化 Table Normal position relative display block margin 10px auto pad

随机推荐

  • oracle按照首汉字首字母排序

    按照拼音顺序 ORDER BY nlssort NAME NLS SORT SCHINESE PINYIN M 按照部首顺序 ORDER BY nlssort NAME NLS SORT SCHINESE RADICAL M 按照笔画顺序
  • websocket实现聊天室(一)

    最近接到一个聊天室的任务 之前在学校完全没有接触过这方面的需求 在网上查找资料后 基本确定了实现方案 现在就开始着手学习 在此记录一下遇到的问题 初识websocket 在简单了解websocket后 我觉得与http请求类似 不过webs
  • 读取g2o 文件的python实现

    可以读取2D 和 3D的 g2o 文件 并可以把四元数的位姿转换为节点和边数据 import argparse import numpy as np import pyquaternion File Format Vertex 2D Rob
  • H.264 标准简介

    JVT Joint Video Team 视频联合工作组 于2001年12月在泰国Pattaya成立 它由ITU T和ISO两个国际标准化组织的有关视频编码的专家联合组成 JVT的工作目标是制定一个新的视频编码标准 以实现视频的高压缩比 高
  • Visual Studio编译出来的程序无法在其它电脑上运行

    在其它电脑 比如Windows Server 2012 上运行Visual Studio编译出来的应用程序 结果报错 无法启动此程序 因为计算机中丢失VCRUNTIME140 dll 尝试重新安装该程序以解决此问题 解决方法 属性 gt 配
  • PNP和NPN磁感应开关有什么区别

    1 我们以磁性开关为例 先要搞清楚PNP NPN 表示的意思是什么 P表示正 N表示负 PNP表示平时为高电位 信号到来时信号为负 NPN表示平时为低电位 信号到来时信号为高电位输出 接近开关和光电开关只是检测电路不同输出相同 至于PLC接
  • Spring 提示:无法找到元素 'aop:aspectj-autoproxy'

    问题描述 org springframework beans factory xml XmlBeanDefinitionStoreException Line 18 in XML document from class path resou
  • 程序员从初级到中级10个秘诀

    新闻来源 techrepublic comJustin James曾发表过一篇博文 10 tips for advancing from a beginner to an intermediate developer 为我们分享如何才能完成
  • syskey (win7启动密码)加密和破解方法

    1 什么是syskey Syskey是NT Service Pack 3中带的一个工具 用来保护SAM数据库不被离线破解 用过去的加密机制 如果攻击者能够得到一份加密过的SAM库的拷贝 他就能够在自己的机器上来破解用户口令 2 如何开启sy
  • [Json依赖] JSONObject的依赖包

  • Windos10专业版开启远程桌面协助

    我需要控制局域网的电脑 这台电脑是win10专业版 搜索 远程桌面设置 进入后启动远程桌面设置 然后发现当前用户已经有访问权 当前用户没有密码 那么远程失败 解决方法是 按win r 输入GPEDIT MSC 计算机配置 gt 安全设置 g
  • 前端框架React

    前端框架React 组件基础 React事件机制 哪些方法会让React重新渲染 render会做什么 React类组件和函数组件 React高阶组件 和普通组件的区别 适用场景 React受控组件和非受控组件 React有状态组件和无状态
  • java enum compare_Java Compare Enum value

    In Java you can use operator to compare Enum value 1 Java Enum example Language java package com mkyong java public enum
  • 啥?简单的题都不会,可咋整呢?

    目录 一 寻找原因 二 寻找解决方法 三 常见的刷题网站 刷题技巧 明明自觉学会了不少知识 可真正开始做题时 却还是出现了 一支笔 一双手 一道力扣 Leetcode 做一宿 的窘境 你是否也有过这样的经历 题型不算很难 看题解也能弄明白
  • Python3获取股票行情数据(中国个股/中国指数/全球指数)

    usr local bin python3 coding utf 8 source http www cnblogs com txw1958 import os io sys re time json base64 import webbr
  • Js常用面试题目知识整理

    Js代码题 1 千分位 题目 要求返回参数数字的千分位分隔符字符串 思路 在字符串长度不确定的情况下 可以使用递归 comma number 1000 是获取数字最后三位 将其放在返回值的最后面 并且在前面加一个逗号 comma Math
  • freenom域名申请教程

    freenom域名申请教程 1 注册 申请域名 打开freenom官网 注册一个账户 注意 如果没有明显的注册按钮 可以通过如下方式同时申请域名和注册账户 打开域名申请 不用注册 选择好了域名之后 点击Checkout 选择免费期限 最长的
  • shell脚本编程 实例讲解(键盘输入三个数字,按照从大到小的书顺序输出)

    1 键盘输入三个数字 按照从大到小的书顺序输出 排序题 a b c 2 10 9 a 2 b 10 c 9 第一步 两两相互进行比较 比较三次 第二步 不论谁大谁小 最后都输出 a b c 从大从小 a永远存储的都是最大值 a和b进行比较
  • 笔记&代码

    可视化前三步走 数据类型 分析目的 实现工具 2 1 类别数据可视化 显示各类别的绝对频数及百分比等 条形图 饼图等 2 1 1 条形图及其变种 垂直条形图 类别在x轴 水平条形图 类别在y轴 简单条形图 并列条形图 堆叠条形图 1 简单条
  • 前端知识——css 之 flex 布局

    目录 一 认识 flex 布局 1 flex 布局的重要概念 二 flex 相关属性 1 flex container 中的属性 1 1 flex direction item 的排布方向 1 2 flex wrap 排布是否换行 1 3