【ElementPlus】深入探索ElementPlus:前端界面的全能组件库


📚 引言

在现代 Web 开发中,创建既美观又功能强大的用户界面是一项挑战。Element Plus,作为 Vue 3 生态中的明星 UI 组件库,以其丰富的组件、优秀的性能和易用性赢得了广大开发者的青睐。

本文将全面覆盖 Element Plus 的 常用核心组件,通过 深度分析、最佳实践案例 以及 详细的代码示例,帮助你掌握如何在实际项目中高效利用 Element Plus,构建现代化、响应式的企业级应用。


🛠️ 核心组件详解与应用(含完整参数说明)

1. 🎯 el-button 按钮组件

按钮是用户界面中最基本的交互元素之一。Element Plus 的 el-button 提供了多种类型、尺寸和状态,满足各种场景需求。

✅ 参数说明(Props)

参数 类型 可选值 默认值 说明
size string large / default / small default 按钮尺寸
type string primary/ success / warning / danger / info / text — 按钮类型
plain boolean — false 是否为朴素按钮(背景透明,仅边框和文字)
round boolean — false 是否为圆角按钮
circle boolean — false 是否为圆形图标按钮
loading boolean — false 是否加载中状态
disabled boolean — false 是否禁用
icon string / Component — — 图标组件,可使用 @element-plus/icons-vue 中的图标
autofocus boolean — false 是否自动聚焦
native-type string button / submit / reset button 原生 type 属性

🧩 事件(Events)

事件名 说明 回调参数
click 点击按钮时触发 —

💡 使用说明与示例

<template>
  <div class="button-group">
    <!-- 基础按钮 -->
    <el-button>默认按钮</el-button>
    <el-button type="primary">主要按钮</el-button>
    <el-button type="success">成功按钮</el-button>
    <el-button type="info">信息按钮</el-button>
    <el-button type="warning">警告按钮</el-button>
    <el-button type="danger">危险按钮</el-button>

    <!-- 朴素按钮 -->
    <el-button plain>朴素按钮</el-button>
    <el-button type="primary" plain>朴素主要按钮</el-button>

    <!-- 圆角按钮 -->
    <el-button round>圆角按钮</el-button>
    <el-button type="primary" round>圆角主要按钮</el-button>

    <!-- 图标按钮 -->
    <el-button type="primary" icon="Edit" circle />
    <el-button type="success" icon="Check" circle />
    <el-button type="danger" icon="Delete" circle />

    <!-- 加载状态 -->
    <el-button type="primary" :loading="true">加载中</el-button>

    <!-- 禁用状态 -->
    <el-button type="primary" disabled>禁用按钮</el-button>
  </div>
</template>

<script setup>
import { Edit, Check, Delete } from '@element-plus/icons-vue'
</script>

2. 🖼️ el-icon 图标组件

el-icon 是 Element Plus 的图标容器,用于统一管理图标样式和行为。

✅ 参数说明(Props)

参数 类型 可选值 默认值 说明
size string / number — — 图标大小
color string — — 图标颜色
class string — — 自定义类名

⚠️ 注意:图标本身通过默认插槽传入,如 <el-icon><Edit /></el-icon>

💡 使用说明

<template>
  <el-icon :size="20" color="#409eff">
    <Edit />
  </el-icon>
  <el-icon class="custom-icon">
    <Setting />
  </el-icon>
</template>

<script setup>
import { Edit, Setting } from '@element-plus/icons-vue'
</script>

<style>
.custom-icon {
  color: #67c23a;
  font-size: 24px;
}
</style>

3. 💬 el-message 消息提示组件

用于轻量级的全局消息提示,不打断用户操作。

✅ 方法调用(非组件 Props)

import { ElMessage } from 'element-plus'

// 基本用法
ElMessage('这是一条消息')

// 指定类型
ElMessage.success('操作成功')
ElMessage.warning('警告内容')
ElMessage.error('错误信息')
ElMessage.info('提示信息')

// 自定义配置
ElMessage({
  message: '自定义消息',
  type: 'success',
  duration: 3000, // 显示时间,毫秒
  showClose: true, // 是否显示关闭按钮
  center: true, // 文字是否居中
  offset: 60, // 距离窗口顶部的偏移量
  onClose: () => console.log('消息关闭')
})

✅ 配置项说明

参数 类型 默认值 说明
message string / VNode — 消息文字
type string info 主题,可选 success / warning / error / info
icon Component — 自定义图标组件
dangerouslyUseHTMLString boolean false 是否将 message 作为 HTML 片段处理
duration number 3000 显示时间,毫秒
showClose boolean false 是否显示关闭按钮
center boolean false 文字是否居中
offset number 20 距离窗口顶部的偏移量
onClose function — 关闭时的回调函数

4. 🔘 el-radio 单选组件

用于在多个选项中选择一个。

✅ el-radio Props

参数 类型 可选值 默认值 说明
model-value / v-model string / number / boolean — — 绑定值
label string / number / boolean — — Radio 的 value
disabled boolean — false 是否禁用
border boolean — false 是否显示边框
size string large / default / small — 尺寸
name string — — 原生 name 属性

✅ el-radio-group Props(用于包裹多个 radio)

参数 类型 可选值 默认值 说明
model-value / v-model string / number / boolean — — 绑定值
size string large / default / small — 尺寸
disabled boolean — false 是否禁用
text-color string — #ffffff 按钮形式的 Radio 激活时的文本颜色
fill string — #409eff 按钮形式的 Radio 激活时的填充色和边框色

💡 使用说明

<template>
  <!-- 基础单选 -->
  <el-radio v-model="radio" label="1">选项A</el-radio>
  <el-radio v-model="radio" label="2">选项B</el-radio>

  <!-- 带边框 -->
  <el-radio-group v-model="radio2">
    <el-radio label="1" border>选项A</el-radio>
    <el-radio label="2" border disabled>选项B</el-radio>
  </el-radio-group>

  <!-- 按钮样式 -->
  <el-radio-group v-model="radio3" size="large">
    <el-radio-button label="上海">上海</el-radio-button>
    <el-radio-button label="北京">北京</el-radio-button>
    <el-radio-button label="广州">广州</el-radio-button>
  </el-radio-group>
</template>

<script setup>
import { ref } from 'vue'
const radio = ref('1')
const radio2 = ref('1')
const radio3 = ref('上海')
</script>

5. 🔽 el-select 选择器组件

下拉选择器,支持单选、多选、搜索、远程加载等。

✅ el-select Props

参数 类型 可选值 默认值 说明
model-value / v-model string / number / array — — 绑定值
multiple boolean — false 是否多选
disabled boolean — false 是否禁用
clearable boolean — false 是否可以清空选项
filterable boolean — false 是否可搜索
allow-create boolean — false 是否允许用户创建新条目
loading boolean — false 是否正在从远程获取数据
remote boolean — false 是否为远程搜索
remote-method function — — 远程搜索方法
placeholder string — 请选择 占位符
size string large / default / small — 尺寸
collapse-tags boolean — false 多选时是否将选中值按文字的形式展示
collapse-tags-tooltip boolean — false 多选时折叠的标签是否显示 tooltip

✅ el-option Props

参数 类型 可选值 默认值 说明
value string / number / boolean — — 选项的值
label string — — 选项的标签,若不设置则默认与 value 相同
disabled boolean — false 是否禁用该选项

💡 使用说明

<template>
  <!-- 基础选择 -->
  <el-select v-model="value" placeholder="请选择">
    <el-option
      v-for="item in options"
      :key="item.value"
      :label="item.label"
      :value="item.value"
    />
  </el-select>

  <!-- 多选 -->
  <el-select v-model="multipleValue" multiple placeholder="请选择">
    <el-option
      v-for="item in options"
      :key="item.value"
      :label="item.label"
      :value="item.value"
    />
  </el-select>

  <!-- 远程搜索 -->
  <el-select
    v-model="remoteValue"
    multiple
    filterable
    remote
    reserve-keyword
    placeholder="请输入关键词"
    :remote-method="remoteMethod"
    :loading="loading"
  >
    <el-option
      v-for="item in remoteOptions"
      :key="item.value"
      :label="item.label"
      :value="item.value"
    />
  </el-select>
</template>

<script setup>
import { ref } from 'vue'

const value = ref('')
const multipleValue = ref([])
const remoteValue = ref([])
const loading = ref(false)
const remoteOptions = ref([])

const options = [
  { value: 'option1', label: '黄金糕' },
  { value: 'option2', label: '双皮奶' },
  { value: 'option3', label: '蚵仔煎' },
]

const remoteMethod = (query) => {
  if (query !== '') {
    loading.value = true
    setTimeout(() => {
      loading.value = false
      remoteOptions.value = options.filter(item => item.label.toLowerCase().includes(query.toLowerCase()))
    }, 200)
  } else {
    remoteOptions.value = []
  }
}
</script>

6. 🔀 el-switch 开关组件

用于两种状态间的切换,如开启/关闭。

✅ Props

参数 类型 可选值 默认值 说明
model-value / v-model boolean / string / number — false 绑定值
disabled boolean — false 是否禁用
width string / number — 40 宽度
inline-prompt boolean — false 是否在开关内显示文字
active-icon Component — — 自定义激活时的图标组件
inactive-icon Component — — 自定义未激活时的图标组件
active-text string — — 激活时的文字
inactive-text string — — 未激活时的文字
active-value string / number / boolean — true 激活时的值
inactive-value string / number / boolean — false 未激活时的值
active-color string — #409eff 激活时的背景色
inactive-color string — #c0ccda 未激活时的背景色
name string — — 原生 name 属性

💡 使用说明

<template>
  <el-switch
    v-model="value1"
    active-text="开"
    inactive-text="关"
  />

  <el-switch
    v-model="value2"
    class="ml-2"
    inline-prompt
    active-icon="Check"
    inactive-icon="Close"
  />

  <el-switch
    v-model="value3"
    class="ml-2"
    style="--el-switch-on-color: #13ce66; --el-switch-off-color: #ff4949"
  />
</template>

<script setup>
import { ref } from 'vue'
import { Check, Close } from '@element-plus/icons-vue'

const value1 = ref(true)
const value2 = ref(false)
const value3 = ref(true)
</script>

7. 📝 el-form 表单组件

表单容器,用于管理表单项的布局、校验和提交。

✅ el-form Props

参数 类型 可选值 默认值 说明
model object — — 表单数据对象
rules object — — 表单验证规则
inline boolean — false 行内表单模式
label-position string top / left / right right 标签的位置
label-width string / number — — 标签的宽度
label-suffix string — — 表单域标签的后缀
hide-required-asterisk boolean — false 是否隐藏必填字段的标签旁边的红色星号
require-asterisk-position string left / right left 必填字段的星号位置
show-message boolean — true 是否显示校验错误信息
inline-message boolean — false 是否以行内形式展示校验信息
status-icon boolean — false 是否在输入框中显示校验结果图标
disabled boolean — false 是否禁用该表单内的所有组件
scroll-to-error boolean — false 提交表单时,如果校验失败,是否自动滚动到第一个错误表单项

✅ el-form-item Props

参数 类型 可选值 默认值 说明
label string — — 标签文本
label-width string / number — — 标签的宽度
prop string — — 对应的 model 字段名,用于校验
required boolean — false 是否必填
rules object / array — — 表单验证规则
error string — — 表单域的错误信息,设置后会覆盖校验规则的错误信息
show-message boolean — true 是否显示校验错误信息
inline-message boolean — false 是否以行内形式展示校验信息
size string large / default / small — 尺寸

⚠️ 注意:el-form-item 必须设置 prop 属性才能进行校验。

💡 使用说明

<template>
  <el-form
    ref="ruleFormRef"
    :model="form"
    :rules="rules"
    label-width="120px"
  >
    <el-form-item label="用户名" prop="username">
      <el-input v-model="form.username" />
    </el-form-item>
    <el-form-item label="邮箱" prop="email">
      <el-input v-model="form.email" />
    </el-form-item>
    <el-form-item label="年龄" prop="age">
      <el-input-number v-model="form.age" :min="1" :max="150" />
    </el-form-item>
    <el-form-item>
      <el-button type="primary" @click="submitForm(ruleFormRef)">提交</el-button>
      <el-button @click="resetForm(ruleFormRef)">重置</el-button>
    </el-form-item>
  </el-form>
</template>

<script setup>
import { ref } from 'vue'
import { ElMessage } from 'element-plus'

const ruleFormRef = ref()
const form = ref({
  username: '',
  email: '',
  age: 18,
})

const rules = ref({
  username: [
    { required: true, message: '请输入用户名', trigger: 'blur' },
    { min: 3, max: 15, message: '长度在 3 到 15 个字符', trigger: 'blur' }
  ],
  email: [
    { required: true, message: '请输入邮箱地址', trigger: 'blur' },
    { type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }
  ],
  age: [
    { required: true, message: '请输入年龄', trigger: 'blur' },
    { type: 'number', message: '年龄必须为数字值', trigger: 'blur' }
  ]
})

const submitForm = async (formEl) => {
  if (!formEl) return
  try {
    await formEl.validate()
    ElMessage.success('提交成功!')
  } catch (error) {
    console.log('校验失败', error)
  }
}

const resetForm = (formEl) => {
  if (!formEl) return
  formEl.resetFields()
}
</script>

8. 📊 el-table 表格组件

用于展示大量结构化数据。

✅ el-table Props

参数 类型 可选值 默认值 说明
data array — — 显示的数据
height string / number — — 表格高度
max-height string / number — — 表格最大高度
stripe boolean — false 是否为斑马纹 table
border boolean — false 是否带有纵向边框
fit boolean — true 列的宽度是否自撑开
show-header boolean — true 是否显示表头
highlight-current-row boolean — false 是否要高亮当前行
current-row-key string / number — — 当前行的 key,只写属性
row-class-name string / function — — 行的 className 的回调方法
row-style object / function — — 行的 style 的回调方法
cell-class-name string / function — — 单元格的 className 的回调方法
cell-style object / function — — 单元格的 style 的回调方法
header-row-class-name string / function — — 表头行的 className 的回调方法
header-row-style object / function — — 表头行的 style 的回调方法
header-cell-class-name string / function — — 表头单元格的 className 的回调方法
header-cell-style object / function — — 表头单元格的 style 的回调方法
row-key string / function — — 行数据的 Key,用来优化渲染
empty-text string — 暂无数据 空数据时显示的文本内容
default-expand-all boolean — false 是否默认展开所有行
expand-row-keys array — — 可以通过该属性设置展开的行,需要设置 row-key
default-sort object — — 默认的排序列的 prop 和顺序
tooltip-effect string dark / light dark tooltip 的 effect 属性
show-summary boolean — false 是否在表尾显示合计行
sum-text string — 合计 合计行第一列的文本
summary-method function — — 自定义的合计计算方法
span-method function — — 合并行或列的计算方法
select-on-indeterminate boolean — true 在多选表格中,当仅有部分行被选中时,点击表头的多选框是否选择所有项
indent number — 16 展示树形数据时,树节点的缩进
lazy boolean — false 是否懒加载子节点数据
load function — — 加载子节点数据的函数
tree-props object — { hasChildren: 'hasChildren', children: 'children' } 渲染嵌套数据的配置选项

✅ el-table-column Props

参数 类型 可选值 默认值 说明
type string selection / index / expand — 列类型
index number / function — — 如果 type 为 index,可以通过 index 属性设置行索引
column-key string — — column 的 key,如果需要使用 filter-change 事件,则需此属性
label string — — 显示的标题
prop string — — 对应列内容的字段名
width string / number — — 对应列的宽度
min-width string / number — — 对应列的最小宽度
fixed string / boolean true / left / right — 列是否固定
render-header function — — 列标题 Label 区域渲染使用的 Function
sortable boolean / string true / false / custom false 对应列是否可以排序
sort-method function — — 对数据进行排序的时候使用的方法
resizable boolean — true 对应列是否可以通过拖动改变宽度
formatter function — — 用来格式化内容
show-overflow-tooltip boolean — false 当内容过长被隐藏时是否显示 tooltip
align string left / center / right left 对齐方式
header-align string left / center / right — 表头对齐方式,若不设置,则继承 align 的值
class-name string — — 列的 className
label-class-name string — — 当前列标题的自定义类名
selectable function — — 仅对 type="selection" 的列有效,类型为 Function,Function 的返回值用来决定这一行的 checkbox 是否可以勾选
reserve-selection boolean — false 仅对 type="selection" 的列有效,类型为 Boolean,为 true 则会在数据更新之后保留之前选中的选项
filters array — — 数据筛选的选项,数组格式,数组中的元素需要有 text 和 value 属性
filter-placement string top / top-start / top-end / bottom / bottom-start / bottom-end / left / left-start / left-end / right / right-start / right-end — 过滤弹出框的定位
filter-multiple boolean — true 数据筛选的选项是否多选
filter-method function — — 数据筛选使用的方法,如果是多选的筛选项,对每一条数据会执行多次,任意一次返回 true 就会显示
filtered-value array — — 选中的数据筛选项,如果设置了这个值,列的筛选状态会受控于外部

⚠️ 注意:由于篇幅限制,el-table 的事件、方法和插槽未在此详述,但它们同样重要,如 @selection-change、@sort-change、@filter-change 等。

💡 使用说明

<template>
  <el-table
    :data="tableData"
    style="width: 100%"
    height="400"
    border
    stripe
    @selection-change="handleSelectionChange"
  >
    <el-table-column type="selection" width="55" />
    <el-table-column type="index" width="60" />
    <el-table-column prop="name" label="姓名" width="120" />
    <el-table-column prop="age" label="年龄" width="100" sortable />
    <el-table-column prop="address" label="地址" show-overflow-tooltip />
    <el-table-column label="操作" width="180">
      <template #default="{ row }">
        <el-button size="small" @click="handleEdit(row)">编辑</el-button>
        <el-button size="small" type="danger" @click="handleDelete(row)">删除</el-button>
      </template>
    </el-table-column>
  </el-table>
</template>

<script setup>
import { ref } from 'vue'

const tableData = ref([
  { name: '张三', age: 25, address: '上海市普陀区金沙江路 1518 弄' },
  { name: '李四', age: 30, address: '上海市普陀区金沙江路 1517 弄' },
  { name: '王五', age: 28, address: '上海市普陀区金沙江路 1519 弄' }
])

const multipleSelection = ref([])

const handleSelectionChange = (val) => {
  multipleSelection.value = val
}

const handleEdit = (row) => {
  console.log('编辑', row)
}

const handleDelete = (row) => {
  console.log('删除', row)
}
</script>

9. 🍽️ el-menu 菜单组件

用于构建导航菜单。

✅ el-menu Props

参数 类型 可选值 默认值 说明
mode string horizontal / vertical vertical 菜单模式
collapse boolean — false 是否水平折叠收起菜单
background-color string — #ffffff 菜单的背景色
text-color string — #303133 菜单的文字颜色
active-text-color string — #409eff 菜单激活时的文字颜色
default-active string — — 当前激活菜单的 index
default-openeds array — — 当前打开的 sub-menu 的 index 的数组
unique-opened boolean — false 是否只保持一个子菜单的展开
menu-trigger string hover / click hover 子菜单打开的触发方式
router boolean — false 是否使用 vue-router 的模式,启用该模式会在激活导航时以 index 作为 path 进行路由跳转
collapse-transition boolean — true 是否开启折叠动画

✅ el-menu-item Props

参数 类型 可选值 默认值 说明
index string — — 唯一标志
route object / string — — Vue Router 路径对象或字符串
disabled boolean — false 是否禁用

✅ el-sub-menu Props

参数 类型 可选值 默认值 说明
index string — — 唯一标志
popper-class string — — 弹出菜单的自定义类名
popper-offset number — 6 弹出菜单和父菜单的距离
teleported boolean — true 是否将弹出菜单放置于 body 内

💡 使用说明

<template>
  <el-menu
    :default-active="activeIndex"
    class="el-menu-demo"
    mode="horizontal"
    @select="handleSelect"
  >
    <el-menu-item index="1">处理中心</el-menu-item>
    <el-sub-menu index="2">
      <template #title>我的工作台</template>
      <el-menu-item index="2-1">选项1</el-menu-item>
      <el-menu-item index="2-2">选项2</el-menu-item>
      <el-menu-item index="2-3">选项3</el-menu-item>
    </el-sub-menu>
    <el-menu-item index="3" disabled>消息中心</el-menu-item>
    <el-menu-item index="4">订单管理</el-menu-item>
  </el-menu>
</template>

<script setup>
import { ref } from 'vue'

const activeIndex = ref('1')

const handleSelect = (key, keyPath) => {
  console.log(key, keyPath)
}
</script>

10. 🧱 el-layout 布局组件

用于构建页面整体布局。

✅ el-container Props

参数 类型 可选值 默认值 说明
direction string horizontal / vertical — 子元素的排列方向

✅ el-header Props

参数 类型 可选值 默认值 说明
height string — 60px 顶栏高度

✅ el-aside Props

参数 类型 可选值 默认值 说明
width string — 300px 侧边栏宽度

✅ el-main Props

参数 类型 可选值 默认值 说明
— — — — 无特殊参数

✅ el-footer Props

参数 类型 可选值 默认值 说明
height string — 60px 底栏高度

💡 使用说明

<template>
  <el-container style="height: 100vh;">
    <el-aside width="200px">
      <el-menu
        default-active="1"
        class="el-menu-vertical-demo"
        @open="handleOpen"
        @close="handleClose"
      >
        <el-menu-item index="1">
          <el-icon><Location /></el-icon>
          <span>导航一</span>
        </el-menu-item>
        <el-menu-item index="2">
          <el-icon><Menu /></el-icon>
          <span>导航二</span>
        </el-menu-item>
      </el-menu>
    </el-aside>
    <el-container>
      <el-header>Header</el-header>
      <el-main>Main Content</el-main>
      <el-footer>Footer</el-footer>
    </el-container>
  </el-container>
</template>

<script setup>
import { Location, Menu } from '@element-plus/icons-vue'
const handleOpen = (key, keyPath) => {
  console.log(key, keyPath)
}
const handleClose = (key, keyPath) => {
  console.log(key, keyPath)
}
</script>

11. 📦 el-container 组件

已在 el-layout 部分介绍。


用于实现图片或内容的轮播展示。

✅ el-carousel Props

参数 类型 可选值 默认值 说明
height string — — 轮播图的高度
initial-index number — 0 初始显示的索引
trigger string hover / click hover 指示器的触发方式
autoplay boolean — true 是否自动切换
interval number — 3000 自动切换的时间间隔,单位为毫秒
indicator-position string none / outside / inside — 指示器的位置
arrow string always / hover / never hover 切换箭头的显示时机
type string card / — — 走马灯的类型
loop boolean — true 是否循环显示
direction string horizontal / vertical horizontal 滚动方向

✅ el-carousel-item Props

参数 类型 可选值 默认值 说明
— — — — 无特殊参数

💡 使用说明

<template>
  <el-carousel height="200px">
    <el-carousel-item v-for="item in 4" :key="item">
      <h3 class="small justify-center">{{ item }}</h3>
    </el-carousel-item>
  </el-carousel>
</template>

<style>
.el-carousel__item h3 {
  color: #475669;
  opacity: 0.75;
  line-height: 200px;
  margin: 0;
  text-align: center;
}

.el-carousel__item:nth-child(2n) {
  background-color: #99a9bf;
}

.el-carousel__item:nth-child(2n + 1) {
  background-color: #d3dce6;
}
</style>

13. 📜 el-scrollbar 滚动条组件

el-scrollbar 是一个自定义滚动条组件,用于替代浏览器原生的滚动条,提供更美观、更可控的滚动体验。它特别适用于需要在固定高度或宽度的容器内展示大量内容的场景。

✅ Props

参数 类型 可选值 默认值 说明
height string / number — — 设置滚动条容器的高度
max-height string / number — — 设置滚动条容器的最大高度
native boolean — false 是否使用原生滚动条,如果为 true,则不会自定义滚动条样式,而是使用浏览器原生滚动条
wrap-style object / string — — 外层容器 wrap的自定义样式
wrap-class string / object / array — — 外层容器 wrap的自定义类名
view-class string / object / array — — 内容视图 view的自定义类名
view-style object / string — — 内容视图 view的自定义样式
noresize boolean — false 防止 resize事件触发重新计算
tag string — div 视图的元素标签名
always boolean — false 是否总是显示滚动条

✅ 事件 (Events)

事件名 说明 回调参数
scroll 滚动时触发 scroll:

✅ 方法 (Methods)

方法名 说明 参数
handleScroll 手动触发滚动事件 —
scrollTo 将内容滚动到指定的位置 options: 可以是数字(表示 scrollTop)或包含 top 和 left 的对象
getScrollTop 获取当前滚动的垂直位置 —
setScrollTop 设置垂直滚动位置 scrollTop: 滚动位置
getScrollLeft 获取当前滚动的水平位置 —
setScrollLeft 设置水平滚动位置 scrollLeft: 滚动位置

💡 使用说明与示例

el-scrollbar 组件非常适合用于创建自定义的滚动区域,比如侧边栏菜单、对话框内容区、代码预览窗格等。

<template>
  <div class="scrollbar-container">
    <!-- 基础垂直滚动条 -->
    <el-scrollbar height="200px">
      <p v-for="item in 20" :key="item" class="scrollbar-demo-item">{{ item }}</p>
    </el-scrollbar>

    <!-- 带有自定义样式的滚动条 -->
    <el-scrollbar 
      height="200px" 
      :wrap-style="{ 'background': 'rgb(235, 235, 235)' }"
      :always="true"
    >
      <p v-for="item in 20" :key="item" class="scrollbar-demo-item">{{ item }}</p>
    </el-scrollbar>

    <!-- 水平和垂直滚动条 -->
    <el-scrollbar height="200px" style="width: 300px;">
      <div style="width: 800px; white-space: nowrap;">
        <span v-for="item in 50" :key="item" class="scrollbar-demo-item" style="display: inline-block;">
          {{ item }}
        </span>
      </div>
    </el-scrollbar>

    <!-- 监听滚动事件 -->
    <el-scrollbar height="200px" @scroll="onScroll">
      <p v-for="item in 30" :key="item" class="scrollbar-demo-item">监听滚动 - {{ item }}</p>
    </el-scrollbar>
    <p>滚动位置: {{ scrollPosition }}</p>

    <!-- 使用方法控制滚动 -->
    <el-scrollbar ref="scrollbarRef" height="200px">
      <p v-for="item in 50" :key="item" class="scrollbar-demo-item">可编程控制 - {{ item }}</p>
    </el-scrollbar>
    <div class="control-buttons">
      <el-button @click="scrollToTop">滚动到顶部</el-button>
      <el-button @click="scrollToBottom">滚动到底部</el-button>
      <el-button @click="scrollToPosition">滚动到位置 1000</el-button>
    </div>
  </div>
</template>

<script setup>
import { ref } from 'vue'
import { ElScrollbar, ElButton } from 'element-plus'

const scrollPosition = ref({ scrollLeft: 0, scrollTop: 0 })
const scrollbarRef = ref()

const onScroll = (scroll) => {
  scrollPosition.value = scroll
}

const scrollToTop = () => {
  scrollbarRef.value?.setScrollTop(0)
}

const scrollToBottom = () => {
  // 获取内容总高度并滚动到底部
  const wrapElement = scrollbarRef.value?.wrap$ 
  if (wrapElement) {
    scrollbarRef.value?.setScrollTop(wrapElement.scrollHeight - wrapElement.clientHeight)
  }
}

const scrollToPosition = () => {
  scrollbarRef.value?.setScrollTop(1000)
}
</script>

<style scoped>
.scrollbar-container {
  display: flex;
  flex-direction: column;
  gap: 20px;
  padding: 20px;
}

.scrollbar-demo-item {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 50px;
  margin: 10px;
  text-align: center;
  border-radius: 4px;
  background: var(--el-color-primary-light-9);
  color: var(--el-color-primary);
}

.control-buttons {
  margin-top: 10px;
  display: flex;
  gap: 10px;
}
</style>

🎯 应用场景

  1. 固定高度内容区域:当需要在一个固定大小的容器内展示可能超出其范围的内容时,如侧边栏、弹窗内容、列表预览等。
  2. 美化滚动体验:原生滚动条在不同操作系统上样式不一,且可能占用过多空间。el-scrollbar 提供了更精致、更一致的视觉效果。
  3. 精确控制滚动:通过其提供的方法,可以精确控制滚动位置,实现平滑滚动、锚点跳转等高级功能。
  4. 性能优化:在某些情况下,使用虚拟滚动结合 el-scrollbar 可以优化大量数据的渲染性能。

⚠️ 注意事项

  • 性能:虽然 el-scrollbar 提供了更好的视觉体验,但它是一个 JavaScript 实现的组件,对于非常长的列表,可能会比原生滚动条消耗更多性能。在极端情况下,考虑使用 native="true" 或虚拟滚动技术。
  • 触摸设备:确保在移动设备上的触摸滚动体验是流畅的。
  • 样式覆盖:可以通过 wrap-class、view-class 等属性或深度选择器来自定义滚动条的外观。

14. 💬 el-tooltip 文字提示组件

el-tooltip 组件用于当目标元素的文本内容过长被省略时,鼠标悬停时显示完整内容,或者用于对某个元素进行简短说明。

✅ Props

参数 类型 可选值 默认值 说明
model-value / v-model boolean — — 状态是否可见
content string — — 显示的内容,也可以通过 slot#content 传入 DOM
placement string top / top-start / top-end / bottom / bottom-start / bottom-end / left / left-start / left-end / right / right-start / right-end bottom 出现位置
value-on-clear boolean — — 清除时的值
disabled boolean — false 是否禁用
offset number — 0 出现位置的偏移量
transition string — el-fade-in-linear 定义渐变动画
visible-arrow boolean — true 是否显示箭头
popper-options object — { boundariesElement: 'body', gpuAcceleration: false } popper.js 参数
open-delay number — 0 出现之前的延迟(毫秒),仅在 trigger 为 hover 时有效
close-delay number — 200 消失之前的延迟(毫秒),仅在 trigger 为 hover 时有效
tabindex number / string — 0 tooltip 的 tabindex
show-after number — 0 显示延迟,单位毫秒
hide-after number — 0 关闭延迟,单位毫秒
auto-close number — 0 点击后自动关闭延时,单位毫秒
manual boolean — false 是否手动控制状态,true 则不会自动显示隐藏
effect string dark / light dark 默认提供的主题
enterable boolean — true 鼠标是否可以进入 tooltip
hide-on-click boolean — false 是否在点击后隐藏
popper-class string — — 为 popper 添加类名,可用于自定义样式
popper-style object — — 为 popper 添加内联样式
trigger string hover / focus / click / manual hover 触发方式
virtual-ref object — — 虚拟元素的 ref,用于与其引用的元素进行交互
virtual-triggering boolean — true 是否触发虚拟元素事件
teleported boolean — true tooltip 是否会被插入到 body 元素上
persistent boolean — false tooltip 是否会对 v-model 进行响应

✅ 事件 (Events)

事件名 说明 回调参数
show tooltip 显示时触发 —
hide tooltip 隐藏时触发 —

✅ Slots

插槽名 说明
— 内容,也可以使用 content 属性
content 内容,当需要传入 DOM 时使用

💡 使用说明与示例

el-tooltip 是提升用户体验的重要组件,常用于按钮、表格单元格、标签等元素的说明。

<template>
  <div class="tooltip-container">
    <!-- 基础用法 -->
    <el-tooltip content="这是一段提示文字" placement="top">
      <el-button>顶部显示</el-button>
    </el-tooltip>

    <el-tooltip content="这是一段提示文字" placement="bottom">
      <el-button>底部显示</el-button>
    </el-tooltip>

    <el-tooltip content="这是一段提示文字" placement="left">
      <el-button>左侧显示</el-button>
    </el-tooltip>

    <el-tooltip content="这是一段提示文字" placement="right">
      <el-button>右侧显示</el-button>
    </el-tooltip>

    <!-- 主题与效果 -->
    <el-tooltip content="深色主题" effect="dark">
      <el-button>深色</el-button>
    </el-tooltip>

    <el-tooltip content="浅色主题" effect="light">
      <el-button>浅色</el-button>
    </el-tooltip>

    <!-- 延迟显示与关闭 -->
    <el-tooltip content="延迟显示" :open-delay="500" :close-delay="300">
      <el-button>延迟显示</el-button>
    </el-tooltip>

    <!-- 点击触发 -->
    <el-tooltip content="点击显示提示" trigger="click">
      <el-button>点击触发</el-button>
    </el-tooltip>

    <!-- 手动控制 -->
    <el-tooltip v-model="visible" content="手动控制的提示" :manual="true" placement="top">
      <template #content>
        <span>这是 <b>加粗</b> 的提示内容</span>
      </template>
      <el-button @click="visible = !visible">手动控制</el-button>
    </el-tooltip>

    <!-- 复杂内容 -->
    <el-tooltip placement="top">
      <template #content>
        <div>多行内容</div>
        <div><el-tag size="small">标签</el-tag></div>
      </template>
      <el-button>复杂内容</el-button>
    </el-tooltip>

    <!-- 禁用状态 -->
    <el-tooltip content="禁用的提示" disabled>
      <el-button disabled>禁用按钮</el-button>
    </el-tooltip>
  </div>
</template>

<script setup>
import { ref } from 'vue'
import { ElTooltip, ElButton, ElTag } from 'element-plus'

const visible = ref(false)
</script>

<style scoped>
.tooltip-container {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  padding: 20px;
}
</style>

🎯 应用场景

  1. 按钮说明:为功能图标或简短按钮文字提供详细说明。
  2. 表格内容溢出:当表格单元格内容过长被截断时,鼠标悬停显示完整内容。
  3. 表单验证提示:在输入框旁边提供格式或要求的提示。
  4. 导航菜单:在侧边栏图标菜单中,鼠标悬停显示菜单名称。
  5. 状态说明:对某些状态标签或徽章提供更详细的解释。

⚠️ 注意事项

  • 内容长度:避免在 tooltip 中放置过多内容,通常应保持简短。
  • 可访问性:确保 tooltip 内容对屏幕阅读器等辅助技术是可访问的。
  • 触发方式:根据使用场景选择合适的触发方式(hover, click, focus)。
  • 移动端:在触摸设备上,hover 触发可能不理想,考虑使用 click 触发。

15. 🔽 el-collapse 折叠面板组件

el-collapse 组件用于实现内容的折叠与展开,可以有效节省页面空间,让用户按需查看信息。

✅ Props

参数 类型 可选值 默认值 说明
model-value / v-model array / string — — 当前激活的面板的 name,如果是手风琴模式,则为字符串
accordion boolean — false 是否启用手风琴模式,即每次只允许展开一个面板

✅ 事件 (Events)

事件名 说明 回调参数
update:model-value 激活面板时触发 (activeNames: array / string)
change 激活面板时触发(与 update:model-value 类似) (activeNames: array / string)

✅ 插槽 (Slots)

插槽名 说明 子组件
— 默认插槽,用于放置 el-collapse-item 组件 el-collapse-item

✅ el-collapse-item Props

参数 类型 可选值 默认值 说明
name string / number — — 唯一标志符,v-model 的值
title string — — 面板标题
disabled boolean — false 是否禁用

💡 使用说明与示例

el-collapse 是组织分组信息的理想选择,常用于 FAQ、配置面板、详情页等。

<template>
  <div class="collapse-container">
    <!-- 基础折叠面板 -->
    <el-collapse v-model="activeNames" @change="handleChange">
      <el-collapse-item name="1">
        <template #title>
          一致性 Consistency<i class="header-icon el-icon-info"></i>
        </template>
        <div>与现实生活一致:与现实生活的流程、逻辑保持一致,遵循用户习惯的语言和概念;</div>
        <div>在界面中一致:所有的元素和结构需保持一致,比如:设计样式、图标和文本、元素的位置等。</div>
      </el-collapse-item>
      <el-collapse-item name="2">
        <template #title>
          反馈 Feedback
        </template>
        <div>控制反馈:通过界面样式和交互动效让用户可以清晰的感知自己的操作;</div>
        <div>页面反馈:页面操作后,告知用户操作成功。</div>
      </el-collapse-item>
      <el-collapse-item name="3" disabled>
        <template #title>
          效率 Efficiency
        </template>
        <div>简化流程:设计简洁直观的操作流程;</div>
        <div>清晰明确:语言表达清晰且表意明确,让用户快速理解进而作出决策;</div>
        <div>帮助用户识别:界面简单直白,让用户快速识别而非回忆,减少用户记忆负担。</div>
      </el-collapse-item>
      <el-collapse-item name="4">
        <template #title>
          可控 Controllability
        </template>
        <div>用户决策:根据场景可给予用户操作建议或安全提示,但不能代替用户进行决策;</div>
        <div>权限:尊重用户的选择,包括取消操作的权利。</div>
      </el-collapse-item>
    </el-collapse>

    <!-- 手风琴模式 -->
    <h3>手风琴模式</h3>
    <el-collapse v-model="activeName" accordion>
      <el-collapse-item name="1">
        <template #title>
          一致性 Consistency<i class="header-icon el-icon-info"></i>
        </template>
        <div>与现实生活一致:与现实生活的流程、逻辑保持一致,遵循用户习惯的语言和概念;</div>
        <div>在界面中一致:所有的元素和结构需保持一致,比如:设计样式、图标和文本、元素的位置等。</div>
      </el-collapse-item>
      <el-collapse-item name="2">
        <template #title>
          反馈 Feedback
        </template>
        <div>控制反馈:通过界面样式和交互动效让用户可以清晰的感知自己的操作;</div>
        <div>页面反馈:页面操作后,告知用户操作成功。</div>
      </el-collapse-item>
      <el-collapse-item name="3">
        <template #title>
          效率 Efficiency
        </template>
        <div>简化流程:设计简洁直观的操作流程;</div>
        <div>清晰明确:语言表达清晰且表意明确,让用户快速理解进而作出决策;</div>
        <div>帮助用户识别:界面简单直白,让用户快速识别而非回忆,减少用户记忆负担。</div>
      </el-collapse-item>
      <el-collapse-item name="4">
        <template #title>
          可控 Controllability
        </template>
        <div>用户决策:根据场景可给予用户操作建议或安全提示,但不能代替用户进行决策;</div>
        <div>权限:尊重用户的选择,包括取消操作的权利。</div>
      </el-collapse-item>
    </el-collapse>

    <!-- 动态控制 -->
    <div class="control-section">
      <el-button @click="toggleAll">切换所有面板</el-button>
      <el-button @click="expandFirst">展开第一个</el-button>
      <el-button @click="collapseAll">收起所有</el-button>
    </div>
  </div>
</template>

<script setup>
import { ref } from 'vue'
import { ElCollapse, ElCollapseItem, ElButton } from 'element-plus'

const activeNames = ref(['1'])
const activeName = ref('1')

const handleChange = (val) => {
  console.log('Collapse changed:', val)
}

const toggleAll = () => {
  if (activeNames.value.length === 0) {
    activeNames.value = ['1', '2', '4'] // 排除禁用的项
  } else {
    activeNames.value = []
  }
}

const expandFirst = () => {
  activeNames.value = ['1']
}

const collapseAll = () => {
  activeNames.value = []
}
</script>

<style scoped>
.collapse-container {
  padding: 20px;
}

.collapse-container h3 {
  margin: 20px 0 10px 0;
  font-weight: normal;
  color: #666;
}

.header-icon {
  margin-left: 5px;
  color: #999;
}

.control-section {
  margin-top: 20px;
  display: flex;
  gap: 10px;
}
</style>

🎯 应用场景

  1. FAQ 页面:常见问题解答,用户点击问题展开查看答案。
  2. 配置面板:将复杂的配置项分组折叠,用户按需展开设置。
  3. 详情页:在商品详情、用户详情等页面中,将次要信息折叠。
  4. 表单分组:在长表单中,将相关字段分组并可折叠。
  5. 文档/帮助中心:组织层级化的帮助文档。

⚠️ 注意事项

  • 内容组织:合理划分折叠项,确保每个面板内的内容主题明确。
  • 默认展开:根据用户最可能查看的内容,合理设置默认展开的面板。
  • 手风琴模式:当信息具有互斥性或需要用户逐项查看时,使用手风琴模式。
  • 性能:对于包含大量动态内容的折叠面板,考虑懒加载或条件渲染以优化性能。

posted @ 2025-08-16 16:46  青昔&  阅读(993)  评论(0)    收藏  举报