2026/9/19 21:28:48

Vant Space 间距组件实战指南:横向布局一键拉齐,换行、对齐、源码全解

Vant Space 间距组件实战指南:横向布局一键拉齐,换行、对齐、源码全解 Vant Space 间距组件实战指南横向布局一键拉齐换行、对齐、源码全解【免费下载链接】vantA lightweight, customizable Vue UI library for mobile web apps.项目地址: https://gitcode.com/GitHub_Trending/va/vantVant 的 Space 间距组件专为解决移动端手动写 margin 对齐子元素的痛点而生把按钮、标签、卡片丢进一个van-space容器横向布局的间距就统一了还附带换行与对齐能力。下面从一个真实业务场景出发讲清楚它怎么用、为什么这么设计。一、为什么需要它购物车里的操作按钮组想象一个电商商品详情页的底部加购、收藏、立即购买三个按钮排成一排。如果逐个给按钮写margin-left第一个按钮的负 margin、最后一个按钮的多余 margin 都会成为样式事故的重灾区更麻烦的是不同页面的间距值各写各的设计稿改成 12px 后要翻一堆页面挨个改。Space的思路是把间距从子元素身上剥离出来由容器统一托管。容器只负责一件事让内部子项之间保持等距。这样间距的决策点只有一个——size属性。二、三步跑通注册到第一个示例引入方式与其他 Vant 组件一致按需全局注册import { createApp } from vue; import { Space } from vant; createApp(App).use(Space);最小可用示例四行模板拿到 8px 的等距排列van-space van-button typeprimary加入购物车/van-button van-button typeprimary收藏/van-button van-button typeprimary立即购买/van-button /van-space注意它默认是行内 Flexdisplay: inline-flex宽度由内容撑开所以不会像普通div那样强制占满一整行这点和预期排一行的语义是吻合的。三、能力拆解按使用场景看 Space横向还是纵向排列方向的切换结论direction决定间距往哪一侧注只有horizontal默认和vertical两个取值。van-space directionvertical fill van-button typeprimary block同意协议/van-button van-button typeprimary block取消/van-button /van-space垂直场景建议搭配fill与按钮的block使用fill把容器从行内 Flex 切成块级 Flex 占满父容器宽度按钮block后自然撑满于是得到整齐的通栏纵向按钮组。不配fill时容器只包裹内容宽度垂直排列的视觉意义就不大了。间距给多大size 的三种写法结论size同时接受数字、字符串、数组覆盖绝大多数设计稿标注方式。!-- 数字自动补 px等价 20px -- van-space :size20 van-tag标签A/van-tag van-tag标签B/van-tag /van-space !-- 字符串原样使用适合 rem/vw 方案 -- van-space size1.25rem van-tag标签A/van-tag van-tag标签B/van-tag /van-space !-- 数组[横向间距, 纵向间距]配合 wrap 使用效果最好 -- van-space size[12, 16] wrap van-tag标签A/van-tag van-tag标签B/van-tag /van-space数组写法的意义在于开启换行后元素之间的间距和行与行之间的间距是两个独立的值[12, 16]就表示列距 12px、行距 16px比两者强行共用一个值更贴近设计稿。高度不齐怎么办align 控制交叉轴对齐结论子元素高度不一致时align决定它们在交叉轴上贴哪条边可选start、center、end、baseline不传时水平模式按center处理垂直模式不额外约束。script setup import { ref } from vue; const align ref(baseline); /script template van-space :alignalign van-button typeprimary短文案/van-button div stylepadding: 24px 12px; background: #fff大块内容/div /van-space /template实际选值的小参考混排按钮和文本时用baseline让文字基线对齐纯按钮组用center最稳列表式布局用start顶部对齐。放不下就折行wrap 自动换行结论水平模式下加wrap子元素超出一行时自动折到下一行且折行后行间距依然可控。van-space wrap size[12, 16] van-button typeprimary block选项一/van-button van-button typeprimary block选项二/van-button van-button typeprimary block选项三/van-button van-button typeprimary block选项四/van-button /van-space筛选条件、标签云这类数量不定、宽度不定的列表基本都该开wrap。不开的话子元素会被 Flex 挤压在一行里互相变形移动端窄屏上尤其明显。四、API 速查Props参数说明类型默认值direction间距方向horizontal/verticalhorizontalsize间距大小数字自动补px数组表示[横向, 纵向]number \| string \| [number, string][]8即 8pxalign交叉轴对齐方式start/center/end/baseline水平模式按center处理wrap水平模式下是否自动换行booleanfalsefill是否作为块级元素撑满父容器booleanfalseSlots / 事件名称说明default放置需要排间距的子元素Space 不对外抛出事件。TS 项目里可以直接引用入口导出的SpaceProps、SpaceSize、SpaceAlign三个类型见 组件入口入口文件还通过withInstall包装并声明了VanSpace全局组件类型模板里用van-space时能获得完整的属性提示。五、实现揭秘整个组件不到 130 行全部逻辑集中在 Space.tsx样式在 index.less可以按三条线快速读懂。渲染链路render 函数先取默认插槽的 VNode 数组交给filterEmpty做清洗——递归展开 Fragment剔除注释节点、空 Fragment 和纯空白文本。这一步保证了模板里v-if留下的注释占位、格式化产生的空白不会变成隐形子项否则会给空气也分一份 8px 间距。关键方法getMarginStyle(isLast)是间距的唯一计算点。它先由getMargin归一化尺寸数字拼px字符串原样返回再按规则下发非末项水平模式写margin-right垂直模式或开了wrap时写margin-bottom末项普通模式返回空对象最后一个元素不该再留间距但wrap模式下仍保留margin-bottom——因为末项可能落在某一行中间行距不能断。这正是末项无间距 换行时行距不断两个细节的共同来源也是它不用gap而选 margin 注入的原因需要按末项和行尾两个条件分别处理gap给不了这种粒度。样式类名BEM 类名由createNamespace(space)生成van-space--verticalflex-direction: column、van-space--align-*四种align-items、van-space--wrapflex-wrap: wrap、van-space--fillinline-flex切flex各管一条规则互不叠加冲突。每个子元素外面套一层.van-space-item承载内联 margin这样间距样式不会渗透进子组件自身。行为侧由 index.spec.tsx 兜底覆盖了默认 8px 右间距且末项无间距、垂直模式类名与下间距、自定义 20px、alignstart类名、wrap类名demo.spec.ts 再用快照锁住 演示页面 的渲染结果。六、实战技巧与坑点何时开wrap子元素数量或宽度不可控标签云、筛选条件就开固定一行的工具栏别开开了反而让末项的margin-bottom给容器底部多垫出一截空白。fill只配directionvertical有意义水平模式下容器本来就只包内容fill切块级只会让容器占满整行视觉上通常不是你想要的。size用数组时顺序别搞反是[横向, 纵向]源码里size[0]喂给margin-right、size[1]喂给margin-bottom见 Space.tsx 的getMarginStyle。子元素会多一层div每个子项被.van-space-item包裹若子组件依赖:first-child/:last-child选择器或兄弟选择器行为可能和裸写不同需要精确定制时直接给van-space加类名走样式覆盖。七、收尾van-space用 5 个属性换掉了满屏的 margin一行包起来就是等距布局方向和尺寸随时可调换行与通栏场景也各有开关移动端排版里间距这件事可以放心交给它了。【免费下载链接】vantA lightweight, customizable Vue UI library for mobile web apps.项目地址: https://gitcode.com/GitHub_Trending/va/vant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考