Skip to content

Splitter 分隔面板

可将区域水平或垂直分隔,并通过拖拽自由调整各区域的大小。

ts
import { createApp } from 'vue'
import { Splitter as ElSplitter, SplitterPanel as ElSplitterPanel } from '@szhn/dh-design-pc'

const app = createApp()
app.use(ElSplitter)
app.use(ElSplitterPanel)

基础用法

最基础的用法,如果未传入默认尺寸则平均分配。

<template>
  <el-splitter style="height: 200px; border: 1px solid var(--el-border-color);">
    <el-splitter-panel>
      <div class="panel-content">Left Panel</div>
    </el-splitter-panel>
    <el-splitter-panel>
      <div class="panel-content">Right Panel</div>
    </el-splitter-panel>
  </el-splitter>
</template>

<script lang="ts" setup>
import { Splitter as ElSplitter, SplitterPanel as ElSplitterPanel } from '@szhn/dh-design-pc'

</script>

<style scoped>
.panel-content {
  padding: 16px;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}
</style>

垂直布局

通过 layout="vertical" 切换为垂直方向。

<template>
  <el-splitter layout="vertical" style="height: 240px; border: 1px solid var(--el-border-color);">
    <el-splitter-panel>
      <div class="panel-content">Top Panel</div>
    </el-splitter-panel>
    <el-splitter-panel>
      <div class="panel-content">Bottom Panel</div>
    </el-splitter-panel>
  </el-splitter>
</template>

<script lang="ts" setup>
import { Splitter as ElSplitter, SplitterPanel as ElSplitterPanel } from '@szhn/dh-design-pc'

</script>

<style scoped>
.panel-content {
  padding: 16px;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--el-text-color-regular);
}
</style>

可折叠

collapsible 属性为面板提供快速收缩按钮,配合 min 可防止折叠后再被拖出。

<template>
  <div class="demo-col">
    <el-switch v-model="enable" active-text="collapsible" />
    <el-splitter style="height: 200px; border: 1px solid var(--el-border-color);">
      <el-splitter-panel :collapsible="enable" :min="80">
        <div class="panel-content">1</div>
      </el-splitter-panel>
      <el-splitter-panel>
        <div class="panel-content">2</div>
      </el-splitter-panel>
      <el-splitter-panel :collapsible="enable" :min="80">
        <div class="panel-content">3</div>
      </el-splitter-panel>
    </el-splitter>
  </div>
</template>

<script lang="ts" setup>
import { ref } from 'vue'
import { Splitter as ElSplitter, SplitterPanel as ElSplitterPanel, Switch as ElSwitch } from '@szhn/dh-design-pc'


const enable = ref(true)
</script>

<style scoped>
.demo-col {
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.panel-content {
  padding: 16px;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--el-text-color-regular);
}
</style>

禁用拖动

任一面板设置 resizable=false,对应的拖拽条会被禁用。

<template>
  <div class="demo-col">
    <el-switch v-model="disable" active-text="disable" />
    <el-splitter style="height: 200px; border: 1px solid var(--el-border-color);">
      <el-splitter-panel :resizable="!disable">
        <div class="panel-content">1</div>
      </el-splitter-panel>
      <el-splitter-panel :resizable="!disable">
        <div class="panel-content">drag disable</div>
      </el-splitter-panel>
      <el-splitter-panel>
        <div class="panel-content">3</div>
      </el-splitter-panel>
    </el-splitter>
  </div>
</template>

<script lang="ts" setup>
import { ref } from 'vue'
import { Splitter as ElSplitter, SplitterPanel as ElSplitterPanel, Switch as ElSwitch } from '@szhn/dh-design-pc'


const disable = ref(false)
</script>

<style scoped>
.demo-col {
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.panel-content {
  padding: 16px;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--el-text-color-regular);
}
</style>

面板大小

使用 v-model:size 可以绑定面板大小,支持像素或百分比字符串。

<template>
  <div class="demo-col">
    <div>当前中间面板大小:{{ size }}</div>
    <el-splitter style="height: 200px; border: 1px solid var(--el-border-color);">
      <el-splitter-panel>
        <div class="panel-content">1</div>
      </el-splitter-panel>
      <el-splitter-panel v-model:size="size">
        <div class="panel-content">{{ size }}</div>
      </el-splitter-panel>
      <el-splitter-panel>
        <div class="panel-content">3</div>
      </el-splitter-panel>
    </el-splitter>
  </div>
</template>

<script lang="ts" setup>
import { ref } from 'vue'
import { Splitter as ElSplitter, SplitterPanel as ElSplitterPanel } from '@szhn/dh-design-pc'


const size = ref<string | number>('100px')
</script>

<style scoped>
.demo-col {
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.panel-content {
  padding: 16px;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--el-text-color-regular);
}
</style>

延迟

启用 lazy 后,拖动过程中面板尺寸不实时变化,松开时才更新。

<template>
  <el-splitter lazy style="height: 200px; border: 1px solid var(--el-border-color);">
    <el-splitter-panel>
      <div class="panel-content">1</div>
    </el-splitter-panel>
    <el-splitter-panel>
      <div class="panel-content">2</div>
    </el-splitter-panel>
    <el-splitter-panel>
      <div class="panel-content">3</div>
    </el-splitter-panel>
  </el-splitter>
</template>

<script lang="ts" setup>
import { Splitter as ElSplitter, SplitterPanel as ElSplitterPanel } from '@szhn/dh-design-pc'

</script>

<style scoped>
.panel-content {
  padding: 16px;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--el-text-color-regular);
}
</style>

API

Splitter Attributes

属性名说明类型默认值
layout布局方向horizontal / verticalhorizontal
lazy是否使用懒加载booleanfalse

Splitter Events

事件名说明回调参数
resize-start开始调整面板大小(index)
resize拖拽调整中(sizes, index)
resize-end调整结束(index)
collapse折叠面板(index, type)

SplitterPanel Attributes

属性名说明类型默认值
size / v-model:size面板大小(像素或百分比)string / number
min最小尺寸string / number
max最大尺寸string / number
resizable是否可调整booleantrue
collapsible是否可折叠booleanfalse

完整 API 参考 Element Plus Splitter