news 2026/9/28 7:28:47

ng-zorro-antd Space 组件垂直间距实战指南:从 `nzDirection=“vertical“` 到整行占位的完整方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ng-zorro-antd Space 组件垂直间距实战指南:从 `nzDirection=“vertical“` 到整行占位的完整方案
  • UI组件
  • 前端

【免费下载链接】ng-zorro-antd

Angular UI Component Library based on Ant Design

项目地址:https://gitcode.com/gh_mirrors/ng/ng-zorro-antd
点击查看免费下载

导读

在 Angular 项目中,如何让一组相邻组件之间保持统一、美观的垂直间距,是布局中最常见的问题之一。ng-zorro-antd 的 Space 组件(nz-space)通过nzDirection="vertical"即可一键完成纵向排列与间距控制,配合width: 100%还能让子元素独占一行。本文将围绕官方文档中的"垂直间距"示例,从组件 API、源码实现、样式原理到测试用例,为你提供一套可直接落地的最优实践。

什么是垂直间距

官方文档(vertical.md)对垂直间距场景的定义非常精炼:

相邻组件垂直间距。

也就是说,当多个组件(卡片、按钮、表单控件等)需要自上而下依次排列,并且彼此之间保持统一间隔时,nz-space的垂直模式就是首选方案。文档同时强调了一个关键能力:

可以设置width: 100%独占一行。

这意味着垂直排列下,如果你希望某个子元素占据整行宽度(例如全宽卡片、全宽输入框),只需要在子元素上设置width: 100%即可,其余子元素仍保持各自的内容宽度。

快速上手:一个可运行的垂直间距示例

官方 Demo(vertical.ts)给出了最直接的用法——垂直排列两张卡片,并为每个子项打上*nzSpaceItem标记:

import { Component } from '@angular/core'; import { NzCardModule } from 'ng-zorro-antd/card'; import { NzSpaceModule } from 'ng-zorro-antd/space'; @Component({ selector: 'nz-demo-space-vertical', imports: [NzCardModule, NzSpaceModule], template: ` <nz-space nzDirection="vertical"> <nz-card *nzSpaceItem nzTitle="Card" style="width: 300px"> <p>Card content</p> <p>Card content</p> </nz-card> <nz-card *nzSpaceItem nzTitle="Card" style="width: 300px"> <p>Card content</p> <p>Card content</p> </nz-card> </nz-space> ` }) export class NzDemoSpaceVerticalComponent {}

使用要点拆解

  • <nz-space nzDirection="vertical">:nzDirection是方向开关,取值为'vertical' | 'horizontal'(默认'horizontal',见 types.ts)。这里显式设为vertical,组件就会以纵向 flex 布局排列子项。
  • *nzSpaceItem:这是NzSpaceItemDirective(定义于 space-item.directive.ts,选择器为[nzSpaceItem])。只有被打上该标记的内容才会被nz-space识别为间距项并逐项包裹渲染;不加标记的内容不会参与间距计算。
  • style="width: 300px":示例通过固定宽度控制卡片大小。若去掉宽度改为width: 100%,卡片即可在垂直方向上独占一整行,这与文档中"可以设置width: 100%独占一行"的说明完全对应。
  • 模块导入:需要在组件的imports中引入NzSpaceModule(space.module.ts)以及子组件自身的模块(这里是NzCardModule)。

让子元素独占一行:width: 100%的两种落地写法

垂直间距最常见的场景是表单布局——每一项输入框都要撑满容器宽度。两种等价写法:

<!-- 写法一:直接在子组件上设置 --> <nz-space nzDirection="vertical" style="width: 100%"> <input *nzSpaceItem nz-input placeholder="用户名" style="width: 100%" /> <input *nzSpaceItem nz-input placeholder="密码" style="width: 100%" /> </nz-space>
<!-- 写法二:在容器上统一约束宽度 --> <nz-space nzDirection="vertical" style="width: 100%"> <input *nzSpaceItem nz-input style="width: 100%" /> </nz-space>

原理说明:nz-space根元素的样式是display: inline-flex(见 style/index.less),内联元素默认宽度由内容决定;而垂直模式下flex-direction: column,交叉轴方向(水平方向)的默认对齐是stretch,因此只要给子项(或容器)设定width: 100%,子项就会拉伸到与容器同宽,从而"独占一行"。这也是文档推荐该写法背后的样式机制。

垂直间距相关的完整 API 一览

垂直模式只是nz-space的一个方向选项,实际使用时通常会与间距、对齐等参数搭配。下表来自组件官方文档(index.zh-CN.md),已结合源码注释补充默认值与行为细节:

参数说明类型默认值是否支持全局配置
[nzSize]间距大小NzSpaceSize \| NzSpaceSize[]'small'✅
[nzDirection]间距方向'vertical' \| 'horizontal''horizontal'—
[nzAlign]对齐方式'start' \| 'end' \| 'baseline' \| 'center'——
[nzWrap]是否自动换行,仅在horizontal时有效booleanfalse—
[nzSplit]设置分隔符TemplateRef \| string——

其中nzSize的类型定义(types.ts):

export type NzSpaceType = 'small' | 'middle' | 'large'; export type NzSpaceSize = NzSpaceType | number;

垂直模式下的参数使用建议

  • nzSize:三档预设small(8px)、middle(16px)、large(24px),也可以直接传数字(如36)或数组[36, 18]分别指定水平间距与垂直间距。默认'small',即垂直模式下相邻组件间距为 8px。
  • nzAlign:在垂直模式下,start / center / end / baseline控制的是子项在水平方向的交叉轴对齐(如center让所有卡片水平居中,配合固定宽度使用效果最佳)。
  • nzWrap:官方文档明确标注"仅在horizontal时有效",垂直模式下无需关心。
  • nzSplit:在子项之间插入分隔符(字符串或模板),例如垂直步骤流中的分割线场景。

源码级原理:垂直间距是如何实现的

垂直间距的能力并非魔法,它由三部分代码协同完成,均在仓库内可查证:

1. 组件模板与宿主样式绑定

在 space.component.ts 中,nz-space的宿主绑定会根据方向动态切换 CSS 类:

host: { class: 'ant-space', '[class.ant-space-horizontal]': 'nzDirection === "horizontal"', '[class.ant-space-vertical]': 'nzDirection === "vertical"', // ...对齐类与换行绑定 '[style.column-gap.px]': 'horizontalSize', '[style.row-gap.px]': 'verticalSize' }

可见间距最终通过 CSScolumn-gap/row-gap直接以内联样式生效,垂直模式下真正起作用的是row-gap(行间距)。

2. 间距数值的归一化

源码中的SPACE_SIZE常量与normalizeSpaceSize函数(space.component.ts)是间距计算的核心:

const SPACE_SIZE: Record<NzSpaceType, number> = { small: 8, middle: 16, large: 24 }; function normalizeSpaceSize(size: NzSpaceSize | [NzSpaceSize, NzSpaceSize]) { const [horizontalSize, verticalSize] = (Array.isArray(size) ? size : [size, size]).map(s => typeof s === 'number' ? s : SPACE_SIZE[s] ); return { horizontalSize, verticalSize }; }

当nzSize传单个值时,水平、垂直间距取相同值;传数组[水平, 垂直]时可分别控制。这也是垂直布局中想让"行间距"与"列间距"不同时的官方支持方式。

3. 样式层:flex 纵向排列

style/index.less 定义了布局根基:

.@{space-prefix-cls} { display: inline-flex; &-vertical { flex-direction: column; } // ... align-* 对齐类 }

总结调用链:nzDirection="vertical"→ 添加ant-space-vertical类 →flex-direction: column→ 子项纵向堆叠;nzSize→normalizeSpaceSize解析 →row-gap生效 → 相邻组件之间出现统一间距;*nzSpaceItem标记的子项被逐个包裹为.ant-space-item(见组件模板中的@for循环)。

测试用例验证:间距与方向的确定性行为

仓库中的 space.component.spec.ts 用单元测试锁定了垂直间距的关键行为,可作为你使用时的行为契约:

  • 方向切换:direction.set('vertical')后断言根元素包含ant-space-vertical类;切回horizontal则包含ant-space-horizontal。
  • 预设尺寸:small→columnGap/rowGap均为8px;middle→16px;large→24px,与源码常量完全一致。
  • 自定义尺寸:nzSize = 36时两个 gap 均为36px;nzSize = [36, 18]时columnGap为36px、rowGap为18px,验证了数组参数的分向生效。
  • 对齐兜底:horizontal方向且未显式设置nzAlign时,自动使用center对齐(源码ngOnChanges中的兜底逻辑,space.component.ts);垂直方向则不做默认对齐。

与其他 Space 场景的区分与组合

垂直间距并非孤立功能,它与同组件的其他 Demo 构成完整能力矩阵(均位于 components/space/demo):

  • 水平间距(basic.ts):默认方向horizontal,适合按钮组、操作栏等行内元素场景,是垂直模式的"镜像"用法。
  • 间距大小(size.md):专门演示nzSize的large/middle三档切换,未设置时默认为small。
  • 紧凑模式(nz-space-compact):当需要表单组件之间紧凑连接且合并边框(如 Button、Input、Select、DatePicker、Cascader、TimePicker、TreeSelect)时使用,与nz-space的等距排列诉求互补,二者适用场景不同。

按官方文档的定位:Space 为内联元素提供间距并逐项包裹子元素,适合行、列中多个子元素的等距排列;Flex 组件则是块级布局工具,适合更灵活的分布控制。垂直间距场景下,nz-space nzDirection="vertical"通常比手写 CSS 更简洁、可维护。

小结

  • 垂直间距 =nz-space+nzDirection="vertical"+ 子项标记*nzSpaceItem,开箱即用;
  • 需要子元素整行占位时,配合width: 100%即可,机制由inline-flex + flex-direction: column保证;
  • 间距由nzSize驱动(预设 8/16/24px 或任意数字、数组),通过row-gap内联样式生效;
  • 官方单元测试已锁定方向切换、尺寸归一化与对齐兜底行为,可放心在生产环境中使用。
  • UI组件
  • 前端

【免费下载链接】ng-zorro-antd

Angular UI Component Library based on Ant Design

项目地址:https://gitcode.com/gh_mirrors/ng/ng-zorro-antd
点击查看免费下载
上一篇:scrcpy 实战:1 秒把手机投屏到电脑,键盘鼠标全接管
下一篇:终极USB设备共享指南:使用usbipd-win实现Windows到WSL的无缝连接

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 7:27:22

从聊天框到流程操作系统:WorkBuddy AI 工作台搭建实战

前阵子同事问我&#xff1a;你天天在终端里敲来敲去&#xff0c;电脑上那个叫 WorkBuddy 的东西到底能帮你省多少事&#xff1f;我当时愣了一下&#xff0c;因为说实话&#xff0c;头两周我没觉得它比普通 AI 聊天窗好用多少。问一句答一句&#xff0c;让它改改代码还行&#x…

作者头像 李华
网站建设 2026/9/28 7:26:15

Harness工程化:让Agent从Demo走向高并发生产级服务

1. 为什么“简单Agent”正在成为团队技术债的温床最近三个月&#xff0c;我帮三支不同行业的团队做过Agent项目复盘——一家做ERP库存调度的制造业客户、一家做销售话术生成的SaaS公司、还有一家做内部知识助手的金融科技团队。他们有个惊人的一致点&#xff1a;最初上线的Agen…

作者头像 李华
网站建设 2026/9/28 7:24:07

基于YOLOv8的无人机射频信号检测:364张图复现94.3%识别率

简介&#xff1a;面向无人机射频信号检测与目标识别场景的高质量标注数据集&#xff0c;适用人群为低空安防、无人机反制、智慧城市等方向的研究人员与算法工程师&#xff0c;可解决无人机监测中样本稀缺、标注成本高等现实问题。资源包含364张原始图片及一一对应的txt格式标注…

作者头像 李华
网站建设 2026/9/28 7:24:00

三相不控整流APF模型仿真:从架构设计到调试避坑全攻略

说实话&#xff0c;这些年我前后手把手搭过不少电能质量仿真模型&#xff0c;也帮着不少硕士生和工程师调试过网上下载的APF模型。一个很直观的体会是&#xff1a;APF&#xff08;有源电力滤波器&#xff09;模型在Matlab/Simulink里的资料一抓一大把&#xff0c;但真正能"…

作者头像 李华
网站建设 2026/9/28 7:23:13

Hermes 本地搭建高效运行完整方案:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华