Flex 与 Grid 布局完整对比、原理区别、实战教学指南

前言

Flex 与 Grid 是现代 CSS 两大核心布局体系,大部分开发者无法精准区分二者的使用场景,尤其容易混淆 normal、stretch 默认渲染规则。本文采用「文字讲解+代码实例」的教学模式,从零拆解两者核心原理、默认行为、适配场景与底层区别,解决日常开发布局错乱、属性失效的问题。

一、核心本质区别(概念+代码演示)

1. Flex 布局:一维单方向布局

Flex 属于一维布局,仅支持水平横向垂直纵向单一方向排布,无法同时控制行和列,适合流式、自适应伸缩的布局场景。

基础一维排布代码示例:

/* 仅横向一维排布,无法控制列规整度 */
.flex-demo {
  display: flex;
  gap: 10px;
}
.flex-demo div {
  background: #f5f7fa;
  padding: 20px;
}
<div class="flex-demo">
  <div>内容1</div>
  <div>内容2</div>
  <div>内容3</div>
</div>

2. Grid 布局:二维行列布局

Grid 是 CSS 唯一的二维布局体系,可同时精准定义行轨道、列轨道,统一控制所有子元素的行列位置和尺寸,适合规整、矩阵式布局场景。

基础二维行列排布代码示例:

/* 同时定义3列2行,标准二维网格 */
.grid-demo {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-template-rows: 80px 80px;
  gap: 10px;
}
.grid-demo div {
  background: #f5f7fa;
}
<div class="grid-demo">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
</div>

二、核心重难点:默认属性渲染差异(实战高频坑点)

normal、stretch 是两者最大的区别,也是日常布局失效的核心原因,下面通过代码直观对比差异。

1. justify-content 默认值与生效规则

Flex 布局规则

Flex 布局下,justify-content 默认值为 normal,浏览器自动映射为 flex-start。子元素默认收缩为内容宽度,靠左排列,右侧留白。stretch 值在 Flex 中完全无效

Flex 默认渲染效果演示:

.flex-default {
  display: flex;
  width: 800px;
  border: 1px solid #eee;
  /* 默认隐含:justify-content: normal */
}
.flex-default .item {
  padding: 20px;
  background: #e8f4ff;
}
<div class="flex-default">
  <div class="item">内容1</div>
  <div class="item">内容2</div>
</div>

渲染结果:两个子元素宽度由内容决定,靠左排列,容器右侧存在大量空白,不会自动拉伸填满。

Flex 实现宽度铺满的唯一方式(flex:1):

.flex-fill .item {
  flex: 1; /* 唯一主轴拉伸方案 */
  padding: 20px;
  background: #e8f4ff;
}

Grid 布局规则

Grid 布局下,justify-content 默认值为 normal,浏览器自动映射为 stretch。当网格轨道总宽度小于容器宽度时,会自动拉伸行列轨道,填满整个容器。stretch 值仅在 Grid 中生效

Grid 默认拉伸效果演示:

.grid-default {
  display: grid;
  width: 800px;
  grid-template-columns: 200px 200px; /* 总宽度400px,小于容器800px */
  border: 1px solid #eee;
  /* 默认隐含:justify-content: stretch */
}
.grid-default .item {
  background: #e8f4ff;
}
<div class="grid-default">
  <div class="item">1</div>
  <div class="item">2</div>
</div>

渲染结果:两列网格自动拉伸,均分填满800px容器,无右侧留白。

2. 子元素默认尺寸行为差异

Flex 布局尺寸规则

主轴水平方向:子元素自适应内容宽度,默认不拉伸;交叉轴垂直方向:子元素默认拉伸撑满父容器高度(align-items: stretch)。

Flex 横竖尺寸差异化演示:

.flex-size {
  display: flex;
  width: 800px;
  height: 150px;
  border: 1px solid #eee;
}
.flex-size .item {
  background: #e8f4ff;
  margin: 0 5px;
  /* 无宽度设置,自适应内容 */
  /* 无高度设置,自动撑满150px */
}

Grid 布局尺寸规则

Grid 主轴、交叉轴双向默认拉伸,子元素默认完全填满整个网格单元格,元素尺寸由预设的网格轨道决定,不受内容尺寸影响。

Grid 双向拉伸演示:

.grid-size {
  display: grid;
  width: 800px;
  height: 150px;
  grid-template-columns: 1fr 1fr;
  border: 1px solid #eee;
}
.grid-size .item {
  background: #e8f4ff;
  /* 宽高自动填满单元格,无需手动设置 */
}

三、Flex 布局完整特性、适用场景与代码案例

1. 核心特性

Flex 基于一维流动布局,支持元素自动伸缩、挤压、自动换行,适配数量不固定、内容自适应的布局场景,灵活性强,轻量化无冗余。

2. 实战适用场景+代码示例

适用场景:导航栏、按钮组、标签栏、水平列表、居中自适应布局、数量不固定的流式布局

通用导航栏实战模板:

.nav-flex {
  display: flex;
  gap: 30px;
  align-items: center;
  flex-wrap: wrap;
  padding: 0 20px;
  background: #fff;
}
<div class="nav-flex">
  <a href="#">首页</a>
  <a href="#">分类</a>
  <a href="#">关于我们</a>
</div>

3. 不适用场景

无法实现行列严格对齐的矩阵布局、无法完成页面整体骨架布局、不支持跨行跨列规整排版,强行使用会出现布局错乱。


四、Grid 布局完整特性、适用场景与代码案例

1. 核心特性

Grid 基于二维网格布局,可精准定义行列轨道,支持跨行跨列、精准定位,自带拉伸铺满特性,搭配 auto-fit、minmax 可实现超强自适应规整布局。

2. 实战适用场景+代码示例

适用场景:卡片列表、商品矩阵、图片画廊、页面整体骨架布局、九宫格、行列规整的自适应布局

万能响应式卡片模板(企业级常用):

.card-grid {
  display: grid;
  /* 自动适配列数,最小宽度220px,剩余空间均分 */
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 16px;
}
<div class="card-grid">
  <div class="item">卡片1</div>
  <div class="item">卡片2</div>
  <div class="item">卡片3</div>
</div>

3. 不适用场景

简单单行横向排布、需要元素自由挤压伸缩的轻量化场景,使用 Grid 会造成代码冗余、布局灵活性不足。


五、Flex 与 Grid 核心属性对比汇总

特性Flex 布局Grid 布局
布局维度一维布局,仅支持单行/单列排布二维布局,同时控制行、列轨道
justify-content 默认值normal 映射为 flex-start,元素靠左收缩normal 映射为 stretch,网格自动拉伸铺满
justify-content:stretch完全无效,浏览器自动忽略有效,拉伸网格轨道填满容器
子元素默认尺寸主轴适配内容,交叉轴拉伸撑满双向默认拉伸,填满整个单元格
自适应铺满实现子元素添加 flex:1 实现默认原生支持,无需额外属性
跨行跨列能力不支持支持 grid-column、grid-row 跨行跨列
自适应换行依赖 flex-wrap: wrap 实现依赖 auto-fit + minmax 实现更强自适应

六、实战开发选型标准

1. 简单单行排布、导航、按钮组、内容需要自由伸缩挤压,优先使用 Flex。

2. 元素数量不固定、需要流式自适应换行、轻量化布局,优先使用 Flex。

3. 卡片矩阵、商品列表、图片画廊、行列规整布局,优先使用 Grid。

4. 页面整体骨架、上下左右分区、需要跨行跨列定位的布局,优先使用 Grid。


七、高频疑难问题最终解答(原理+代码佐证)

问题1:为什么 Flex 默认子元素会收缩为内容宽度?

Flex 布局中 justify-content 默认值 normal 映射为 flex-start,核心规则为「元素优先自适应内容,剩余空间留白」,无 flex:1 时不会拉伸。

问题2:justify-content:stretch 为何有时生效有时无效?

该属性仅对 Grid 网格轨道生效,用于拉伸网格填满容器;Flex 一维布局无轨道概念,无法识别该属性,永久无效。

问题3:垂直拉伸和水平拉伸的区别?

垂直拉伸由 align-items: stretch 控制,是 Flex 和 Grid 通用的交叉轴规则;水平主轴拉伸,Flex 依赖 flex:1,Grid 依赖原生 stretch 规则,二者原理完全不同。

(注:部分内容可能由 AI 生成)

2026-06-22T04:50:38.png

RabbitMQ 新建队列(Add a new queue)红框区域完整详解

红框是手动创建 Queue 队列的配置表单,逐行拆解每个参数含义、业务用途、生产环境推荐配置;同时结合页面上方大量 *.x.delay 延迟队列做补充说明。

一、基础必填配置项

1. Virtual host(虚拟主机)

当前默认 /,代表当前选中的虚拟主机:

  • 作用:RabbitMQ 多租户隔离,不同 vhost 交换机、队列完全隔离,互不互通;
  • 规范:创建队列前必须选对业务所属虚拟主机,跨 vhost 无法互相收发消息。

2. Type(队列类型)

下拉选项:Default for virtual host / classic / quorum / stream

  1. classic(经典队列)
    传统磁盘队列,兼容所有旧版本,支持 TTL、死信、延迟、单消费者等全部特性;页面上方 *.x.delay 延迟队列全是 classic 类型。
  2. quorum(仲裁队列,3.8+推荐生产主用)
    集群高可用,消息复制多节点,宕机丢消息概率更低;但部分老高级特性支持有限。
  3. stream(流队列)
    海量日志、时序数据场景,支持重复消费、按位点读取,业务消息很少用。
  4. Default for virtual host:跟随该虚拟主机全局默认类型。

3. Name(队列名称,必填*)

队列唯一标识,生产者/消费者通过名称操作队列:

  • 规则:区分大小写,不能包含特殊控制字符;同 vhost 下名称不能重复;
  • 示例:order_pay_queueuser_notify_queue
  • 你截图里 enqueue.exchange.xxxx.x.delay延迟队列命名规范,用来存放等待到期的延时消息。

4. Durability(持久化)

两个选项:

  • Durable(持久,生产必选):队列元数据写入磁盘,RabbitMQ 重启后队列不会消失;
  • Transient(临时):仅内存存储,服务重启队列直接销毁,仅测试临时场景使用。

    注意:队列持久 ≠ 消息持久,消息持久还需要生产者发送时设置 delivery_mode=2

二、Arguments 自定义参数(高级特性,页面快捷按钮一键填充)

下方一排带问号的按钮是高频参数快捷入口,点击会自动填充键值对到上方输入框,逐个说明:

1. Auto expire(队列自动过期 x-expires

单位:毫秒。

  • 逻辑:队列空闲多久无消费者、无消息后自动删除;
  • 适用:临时一次性任务队列,避免大量闲置队列堆积。

2. Message TTL(消息过期 x-message-ttl

单位:毫秒。

  • 逻辑:队列内所有消息统一设置过期时间,超时未消费自动变成死信;
  • 你的截图里大量 *.x.delay 延迟队列核心就是靠这个参数实现延时。

3. Overflow behaviour(消息溢出策略 x-overflow

队列达到最大长度后如何处理新消息:

  • drop-head:丢弃队首最老消息(默认);
  • reject-publish:拒绝生产者新消息,返回报错。

4. Max length(队列最大消息数 x-max-length

限制队列最多存放多少条消息,超出触发溢出策略,防止消息无限堆积撑爆磁盘。

5. Max length bytes(队列最大字节 x-max-length-bytes

限制队列总占用磁盘大小,超出同样触发溢出策略。

6. Single active consumer(单一活跃消费者 x-single-active-consumer

开启后:队列同时只允许1个消费者处理消息,其他消费者挂起等待;

  • 核心用途:强制同队列严格顺序消费,多实例部署也不会并发乱序。

7. Dead letter exchange(死信交换机 DLX x-dead-letter-exchange

填写交换机名称,消息满足以下条件会转发到该交换机:

  1. 消息TTL超时;
  2. 消费者主动 NACK 且不重回队列;
  3. 队列达到最大长度溢出丢弃;
    是延迟队列、失败消息重试的核心依赖。

8. Dead letter routing key(死信路由键 x-dead-letter-routing-key

消息转发到死信交换机时使用的 routing-key,不填默认复用原消息路由键。

9. Leader locator(仲裁队列专用)

仅 quorum 队列生效,控制集群内队列主节点分配策略,单机部署无需配置。

三、底部按钮 Add queue

填写完所有配置后点击,即可在上方列表创建出新队列。

四、结合你截图里 *.x.delay 延迟队列补充说明

页面上大量 enqueue.exchange.数字.x.delayTTL延时队列,实现原理:

  1. 新建这类 delay 队列,配置 Message TTL(对应数字毫秒,如604800000=7天);
  2. 绑定普通交换机作为死信交换机;
  3. 生产者消息先发到 delay 队列,消息到期后自动通过DLX转发到业务队列,实现延时消费;
  4. 全部为 classic 持久队列,标有 TTL / DLX / DLK 标识(DLK=死信路由键)。

五、生产环境标准配置参考

普通业务队列

  • Virtual host:业务专属vhost
  • Type:classic / quorum(集群高可用选quorum)
  • Durability:Durable
  • Arguments:按需配置 DLX、Max length 防止消息丢失/堆积

延时delay队列(截图同款)

  • Durability:Durable
  • Arguments:

    • Message TTL = 延时毫秒
    • Dead letter exchange = 业务交换机
    • Dead letter routing key = 目标业务队列绑定键

2026-06-22T03:51:05.png

RabbitMQ 新增交换机(Add a new exchange)红框区域完整详解

红框是手动创建自定义Exchange交换机的表单,下面逐行拆解每个配置项含义、作用、业务场景:

1. Name(交换机名称,必填*)

  • 作用:自定义交换机唯一标识,生产者发消息时指定该名称路由消息。
  • 规范:不能包含空格、特殊控制字符,区分大小写;同一个虚拟主机(Virtual host /)下名称不能重复。
  • 示例:order_exchangepay_topic_ex

2. Type(交换机类型,下拉选择)

决定消息路由分发规则,4种核心类型:

  1. direct(默认选中)
    精准匹配:消息routing-key和队列绑定的binding-key完全相等才投递。
    适用:一对一精准推送,如订单状态通知、单点任务分发。
  2. fanout
    广播模式:忽略routing-key,所有绑定该交换机的队列全部收到消息。
    适用:全站公告、日志广播、多服务同步缓存。
  3. topic
    模糊通配匹配:支持 *(匹配一个单词)、#(匹配零/多个单词)。
    适用:日志分类、多维度事件(user.create/user.delete)。
  4. headers
    不依赖routing-key,靠消息header键值对匹配路由。
    适用:复杂多条件筛选场景,极少使用。

3. Durability(持久化)

两个选项:

  • Durable(持久,默认):交换机元数据存入磁盘,RabbitMQ重启后交换机不会丢失;生产环境必选。
  • Transient(临时):仅存内存,服务重启/崩溃后交换机直接销毁,测试临时场景使用。
注意:仅持久交换机不代表消息持久,消息持久需要队列+消息投递模式同时设置。

4. Auto delete(自动删除)

选项:Yes / No(默认No)

  • No:永久保留,手动删除才会销毁。
  • Yes:当最后一个绑定该交换机的队列解绑/删除时,RabbitMQ自动删除此交换机。
    适用:临时临时任务、一次性临时通道。

5. Internal(内部交换机)

选项:Yes / No(默认No)

  • No:普通交换机,生产者可以直接发送消息到这个交换机。
  • Yes:内部交换机,客户端无法直接发消息,只能由其他交换机通过alternate exchange备用交换机转发进来;多用于交换机嵌套路由、死信二次中转,业务极少用。

6. Arguments(自定义参数,键值对)

扩展配置,用于高级特性,输入框格式:键 = 值,右侧选择值类型(String/Number/Bool),点Add增加多组参数。

常用参数:

  1. Alternate exchange(备用交换机,页面单独快捷按钮)
    补充说明:下方Alternate exchange按钮是快捷添加参数alternate-exchange,填入另一个交换机名称。
    逻辑:当前交换机无法匹配到任何队列时,消息转发到备用交换机,避免消息丢失。
  2. x-delayed-type:延迟交换机插件参数,实现延时消息。
  3. x-message-ttl:交换机层面统一设置消息过期时间。

底部按钮 Add exchange

填写完所有配置后点击,完成交换机创建,上方列表会刷新出你新建的Exchange。

补充业务建议

  1. 线上业务通用配置参考:
    Name:自定义业务名
    Type:根据分发需求选direct/topic/fanout
    Durability:Durable
    Auto delete:No
    Internal:No
  2. 内置系统交换机(页面上方列表里amq.*开头)是RabbitMQ自带,不要修改;业务必须自己新建自定义交换机。
  3. Alternate exchange备用交换机是防丢消息常用方案,订单、支付等核心链路建议配置。

Agnes-AI 接口与 ComfyUI 节点说明

1. 官方原生:无内置 ComfyUI 节点

Agnes-AI 平台官方没有自带 ComfyUI 原生节点,它只对外提供标准 OpenAI 兼容 REST API(https://apihub.agnes-ai.com/v1),仅提供接口调用能力,不内置可视化节点封装。

2. 第三方配套:存在专用 ComfyUI 自定义节点包

有第三方开发了 closerAI_Agnes 自定义节点包,专门对接 Agnes-AI 全套接口,可直接在 ComfyUI 拖拽使用:

包含5个核心节点(分类:CloserAI/AgnesAI)

  1. CloserAI Agnes Text:调用文本大模型,对话、提示词生成、文案
  2. CloserAI Agnes Image:文生图、图生图、多参考图生成
  3. CloserAI Agnes Video:文生视频、图生视频
  4. CloserAI Agnes VideoPlayer:预览生成视频
  5. CloserAI Agnes MultiImageInput:批量传入多张参考图

使用前提

  1. 前往 platform.agnes-ai.com 注册,获取 API Key
  2. 下载节点包放入 ComfyUI custom_nodes/closerAI_Agnes/
  3. 重启 ComfyUI,填入密钥即可调用免费接口

3. 替代方案(不装第三方节点)

不想用自定义节点包,也能通过通用方式对接 Agnes API:

  • 使用 ComfyUI 通用 OpenAI/API 请求节点,自行填写 BaseURL、Key、模型名调用
  • Python 脚本调用 Agnes API,再把生成图/视频传入 ComfyUI 本地节点处理

总结

  • Agnes-AI 官方不提供 ComfyUI 节点;
  • 第三方有成熟完整的自定义节点包,一键接入文本/图像/视频全接口;
  • 底层是标准 OpenAI 格式 API,也可通用接口节点手动对接。

Agnes AI 是个啥Agnes AI 是全球模型榜单前十的一个 AI Lab。这次免费开放的是三个核心模型:文本模型 Agnes-2.0-Flash,能写代码、做知识问答、跑 Agent、规划复杂任务,编程和企业知识库场景很能打。在 Claw-Eval 这个智能体评估榜单上, 这个模型进入了 Top 10。

如何接入首先去官方的 API 平台获取一下密钥,地址:platform.agnes-ai.com