插槽实现左右分栏布局的核心是父组件控制结构、子组件注入内容,结合 CSS Grid 或 Flex 实现响应式栅格;通过具名插槽(left/right)、grid-template-columns 控制比例,@media 断点调整布局,支持动态折叠与多端适配。

用插槽实现左右分栏布局,核心是让父组件控制结构、子组件注入内容,再结合 CSS Grid 或 Flex 布局完成响应式栅格。不需要写死 DOM 结构,也不依赖第三方 UI 库。
用具名插槽划分左右区域
在布局组件中定义两个具名插槽,比如 left 和 right,分别承载侧边栏和主内容:
<template>
<div class="layout-grid">
<aside class="layout-left">
<slot name="left"></slot>
</aside>
<main class="layout-right">
<slot name="right"></slot>
</main>
</div>
</template>
使用时按需传入内容:
<Layout>
<template #left>
<NavMenu />
</template>
<template #right>
<ArticleList />
</template>
</Layout>
用 CSS Grid 实现响应式栅格
在布局组件的样式中,用 grid-template-columns 控制左右比例,并配合 @media 调整断点:
.layout-grid {
display: grid;
grid-template-columns: 250px 1fr;
gap: 16px;
}
@media (max-width: 768px) {
.layout-grid {
grid-template-columns: 1fr;
}
.layout-left { order: 2; }
.layout-right { order: 1; }
}
- 桌面端:左侧固定 250px,右侧自适应
- 移动端:单列堆叠,通过 order 调整渲染顺序(让主内容优先)
- 可扩展为三栏(如加
name="right-extra"插槽 +grid-template-columns: 250px 1fr 300px)
支持动态宽度与折叠交互
若需支持侧边栏收起/展开,可在布局组件中加一个 collapsed prop,控制插槽容器的显示与 Grid 列宽:
.layout-grid {
grid-template-columns: v-bind('collapsed ? "0px" : "250px") 1fr;
overflow-x: hidden;
}
.layout-left {
width: 250px;
transform: translateX(v-bind('collapsed ? "-250px" : "0"'));
transition: transform 0.2s ease;
}
- 插槽内容仍正常渲染,仅视觉隐藏,语义和可访问性不受影响
- 避免用
v-if移除插槽,否则会中断子组件生命周期 - 配合
@update:collapsed事件向外同步状态
适配不同设备的栅格行为
真正灵活的响应式不只是“隐藏/显示”,而是按设备能力切换布局逻辑:
- 平板横屏(≥768px):双栏,左 30%,右 70%
- 手机竖屏(
- 支持 prefers-reduced-motion:禁用动画但保持结构完整
- 可引入
useBreakpoints(如 VueUse)监听断点,驱动插槽渲染策略

















