news 2026/8/29 13:08:44

Vue3间距(Space)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue3间距(Space)

效果如下图:


在线预览

APIs

Space

参数说明类型默认值
width区域总宽度,单位pxstring | number‘auto’
align垂直排列方式‘stretch’ | ‘start’ | ‘end’ | ‘center’ | ‘baseline’‘start’
vertical是否为垂直布局booleanfalse
gap间距大小,数组时表示:[水平间距, 垂直间距]number | number[] | ‘small’ | ‘middle’ | ‘large’‘middle’
wrap是否自动换行,仅在horizontal时有效booleantrue

Slots

名称说明类型
default自定义内容v-slot:default

创建间距组件Space.vue

<script setup lang="ts">import{computed}from'vue'exportinterfaceProps{width?:string|number// 区域总宽度,单位 pxalign?:'stretch'|'start'|'end'|'center'|'baseline'// 垂直排列方式vertical?:boolean// 是否为垂直布局gap?:number|number[]|'small'|'middle'|'large'// 间距大小,数组时表示: [水平间距, 垂直间距]wrap?:boolean// 是否自动换行,仅在 horizontal 时有效}constprops=withDefaults(defineProps<Props>(),{width:'auto',align:'start',vertical:false,gap:'middle',wrap:true})constspaceWidth=computed(()=>{if(typeofprops.width==='number'){return`${props.width}px`}returnprops.width})constgapValue=computed(()=>{if(typeofprops.gap==='number'){return`${props.gap}px`}if(Array.isArray(props.gap)){return`${props.gap[1]}px${props.gap[0]}px`}if(['small','middle','large'].includes(props.gap)){constgapMap={small:'8px',middle:'16px',large:'24px'}returngapMap[props.gap]}})</script><template><divclass="space-wrap":class="[`space-${align}`, { 'space-vertical': vertical, 'space-flex-wrap': wrap }]":style="`width: ${spaceWidth}; gap: ${gapValue}; margin-bottom: -${Array.isArray(props.gap) && wrap ? props.gap[1] : 0}px;`"><slot></slot></div></template><style lang="less"scoped>.space-wrap{display:inline-flex;font-size:14px;color:rgba(0,0,0,0.88);transition:all0.3s;flex-direction:row;}.space-vertical{flex-direction:column;}.space-stretch{align-items:stretch;}.space-start{align-items:flex-start;}.space-end{align-items:flex-end;}.space-center{align-items:center;}.space-baseline{align-items:baseline;}.space-flex-wrap{flex-wrap:wrap;}</style>

在要使用的页面引入

其中引入使用了以下组件:

<script setup lang="ts">importSpacefrom'./Space.vue'import{ref}from'vue'constgapOptions=ref([{label:'small',value:'small'},{label:'middle',value:'middle'},{label:'large',value:'large'},{label:'customize',value:'customize'}])constgapSize=ref('middle')constcustomGapSize=ref(16)</script><template><div><h1>{{$route.name}}{{$route.meta.title}}</h1><h2class="mt30 mb10">基本使用</h2><Space align="center">Space<Button type="primary">Button</Button><Popconfirm title="Are you sure delete this task?"ok-text="Yes"cancel-text="No"><Button>Confirm</Button></Popconfirm></Space><h2class="mt30 mb10">设置间距</h2><Flex vertical><Radio:options="gapOptions"v-model:value="gapSize"/><Slider v-if="gapSize === 'customize'"v-model:value="customGapSize"/><Space:gap="gapSize !== 'customize' ? gapSize : customGapSize"><Button type="primary">Primary</Button><Button>Default</Button><Button type="dashed">Dashed</Button><Button type="link">Link</Button></Space></Flex><h2class="mt30 mb10">垂直间距</h2><Space vertical><Card title="Card"style="width: 300px"><p>Card content</p><p>Card content</p></Card><Card title="Card"style="width: 300px"><p>Card content</p><p>Card content</p></Card></Space><h2class="mt30 mb10">对齐</h2><divclass="space-align-container"><divclass="space-align-block"><Space align="center">center<Button type="primary">Primary</Button><spanclass="mock-block">Block</span></Space></div><divclass="space-align-block"><Space align="start">start<Button type="primary">Primary</Button><spanclass="mock-block">Block</span></Space></div><divclass="space-align-block"><Space align="end">end<Button type="primary">Primary</Button><spanclass="mock-block">Block</span></Space></div><divclass="space-align-block"><Space align="baseline">baseline<Button type="primary">Primary</Button><spanclass="mock-block">Block</span></Space></div></div><h2class="mt30 mb10">自动换行</h2><Space:gap="[8, 16]"style="width: 600px"><template v-for="n in 16":key="n"><Button type="primary">Button</Button></template></Space></div></template><style lang="less"scoped>.space-align-container{display:flex;align-items:flex-start;flex-wrap:wrap;}.space-align-block{margin:8px 4px;border:1px solid #40a9ff;padding:4px;flex:none;}.space-align-block.mock-block{display:inline-block;padding:32px 8px 16px;background:rgba(150,150,150,0.2);}</style>
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/29 13:07:11

后AI时代CTF转型:从解题竞技到研究退隐赛制设计

先说结论&#xff1a;AI 大模型正在把传统 CTF 题目从“能力检验”变成“查表题”。“Web 手查报错、逆向手调模拟器、密码学手跑脚本”的流程&#xff0c;越来越容易被大模型快速替代。那 CTF 还有存在的必要吗&#xff1f;我的看法是&#xff1a;有&#xff0c;但形式必须变。…

作者头像 李华
网站建设 2026/8/29 13:06:28

Autosar------Mcal Pwm模块配置及学习笔记

PWM原理脉冲宽度调制&#xff08;PWM)&#xff0c;简称脉宽调制。是利用微处理器的数字输出来对模拟电路进行控制的一种技术。频率指一秒钟内信号从高电平到低电平再回到高电平的次数&#xff08;一个周期&#xff09;&#xff0c;也就是说一秒钟PWM有多少个周期。 …

作者头像 李华
网站建设 2026/8/29 13:05:57

多机器人共享一个VLA大脑:架构拆解与Python原型

最近具身智能圈被一段“神秘模型 Demo”刷屏了&#xff1a;宇树的机器人与人形机器人站在一起&#xff0c;没有复杂的远程操控台&#xff0c;靠一个“共同的大脑”完成连续任务&#xff0c;而且官方放出的视频号称“10分钟一镜到底”。 很多开发者看完第一反应是&#xff1a;这…

作者头像 李华
网站建设 2026/8/29 13:05:01

SpringBoot大学城水电管理系统开发复盘:从源码到论文

简介&#xff1a;在高校后勤信息化建设中&#xff0c;水电管理长期依赖人工抄表与Excel统计&#xff0c;数据错漏频发、对账困难。如何构建一套可靠的水电管理系统&#xff0c;成为许多开发者和毕业设计选题关注的重点。从工程实践出发&#xff0c;围绕基于SpringBoot、MyBatis…

作者头像 李华
网站建设 2026/8/29 13:02:17

macOS菜单栏Claude用量监控小工具:跑任务前先看一眼剩余额度

这个项目来自 Hacker News 的 Show HN&#xff0c;作者做了一个 macOS 菜单栏小工具&#xff0c;专门用来盯 Claude 的用量情况。标题写得很有意思&#xff1a; “small enough to read before you run it” &#xff0c;意思是这个工具足够轻&#xff0c;小到你跑 Claude 任…

作者头像 李华