将静态 Vue 页面(index.vue)改造为动态页面(Custom.vue);稿源仅限 index.vue、其引用的 CSS 与资源路径,禁止参考仓库内其他文件。Invoke when user wants to transform a static Vue page into a dynamic data-driven page with Element UI components.
lanhu-code-2-el-vue
功能概述
lanhu-code-2-el-vue是一项面向实际任务的技能,主要用于本 Skill 用于将 静态 HTML 页面改造为 Vue 2 + Element UI 的数据驱动动态页面 ,执行时会直接生成 Custom.vue 文件;When to Use This Skill;
核心要点
- 在以下场景触发本 Skill:;
- 用户要求「静态改动态」「把 index.vue 改成 Custom.vue」「按改造规范改造页面」;
- 将某视图文件。
使用与执行
它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。
结果检查与注意事项
执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
lanhu-code-2-el-vue
介绍
本 Skill 用于将静态 HTML 页面改造为 Vue 2 + Element UI 的数据驱动动态页面,执行时会直接生成 Custom.vue 文件。
When to Use This Skill
在以下场景触发本 Skill:
- 用户要求「静态改动态」「把 index.vue 改成 Custom.vue」「按改造规范改造页面」
- 将某视图文件夹下的静态页面改为 Vue 2 + Element UI 动态页面
- 需要循环渲染、Element UI 替换、统一 class 命名、像素级还原设计稿
不适用: 全新页面从零开发、非 Vue 2/Element UI 技术栈、不涉及「静态→动态」改造。
执行指令(核心)
当本 Skill 被触发时,必须按照以下步骤直接执行代码改造,生成 Custom.vue 文件,而不是仅提供指导文档。
唯一信息源(生成 Custom.vue 时必须遵守)
生成/改写 Custom.vue 时,只允许使用以下材料作为页面结构与样式的依据:
src/views/${folderName}/index.vue的源码(模板、脚本、内联样式)。- 由 index.vue 直接或间接引用的样式文件(例如
、@import、import等,按路径相对index.vue解析;若存在链式@import,仅沿该链读取,不得扩大范围)。 - 在上述 Vue/CSS 中出现的图片等资源路径(保留或转换为
Custom.vue所需写法即可;无需读取图片二进制内容作「设计参考」)。
禁止:
- 不得为拼页面而读取、对照或照搬本仓库其他文件的内容,包括但不限于:同目录或其他视图下的
Custom.vue、index.vue(非当前${folderName})、公共组件源码、create.md、路由配置、package.json等。 - 不得以「已有某页的 Custom.vue 写法」为模板生成当前页;每一页只认当前文件夹的
index.vue+ 其引用 CSS + 资源路径。
路由配置的例外(仅交付阶段): 在 Custom.vue 已写入磁盘之后,允许打开项目路由文件(如 src/router/index.js)仅用于登记或校验 index.vue / Custom.vue 的访问路径,使页面可通过 URL 打开。禁止把路由里其它页面的 path/name/meta 当作当前页的 UI 稿源或布局依据。详见 data/router-sync.md 第 5 节。
说明: 本 Skill 正文与 data/ 下的规范文档属于操作规则(如何命名、如何用 Element UI 等),不是「页面稿源」。页面稿源仍仅限上述 1~3 项。
步骤 1: 获取目标文件夹名称
从用户输入中提取 ${folderName}(如:kz、shushi 等)。
步骤 2: 验证源文件存在性(必须执行)
// 必须存在:
必须存在: src/views/${folderName}/index.vue
// 样式文件:以 index.vue 实际引用为准(常见为 ./assets/index.css,若引用多个则均需存在)
// 读取 index.vue 后解析其 style src / @import / import 路径并逐一验证存在
// 目标文件(将被创建或覆盖):
目标文件: src/views/${folderName}/Custom.vue
⚠️ 重要: 若 index.vue 不存在,或其所引用的样式文件缺失,必须告知用户并停止执行。验证通过后,仅读取 index.vue 与这些被引用的样式文件(及链式 @import),不打开其他工程文件。
步骤 3: 读取源文件(仅限唯一信息源)
- 使用 Read 工具读取
src/views/${folderName}/index.vue。 - 根据
index.vue中的引用,仅读取其指向的 CSS(及该 CSS 内@import的下一层样式,若需要完整样式表)。 - 不要读取
package.json、路由文件、其他视图的Custom.vue等作为模板/稿源/样式依据(见上文「唯一信息源」;路由仅在步骤 8 用于登记,见data/router-sync.md)。
步骤 4: 分析源文件结构
分析内容:
- 识别页面布局 - 确定是单栏、双栏还是多栏布局
- 识别重复结构 - 找出需要循环渲染的部分(使用 v-for)
- 识别交互元素 - 找出按钮、输入框、多选、单选等可替换为 Element UI 的元素(开关保留原生 DOM,不替换为 el-switch)
- 识别样式特征 - 记录关键样式值(颜色、尺寸、间距)
- 识别伪控件(必做) - 源页面常用 div+文案+图标模拟表单控件,须按「6.3.4 伪控件识别与替换」规则识别并替换为 el-select、el-checkbox、el-input;取色须按 点击后展开的下拉面板的形态(图1 / 图2) 选用
el-color-picker-extend或el-color-picker(不以触发区单独判断;见 6.3 映射表、6.3.11、data/el-color-picker-extend.md§「颜色选择:触发与下拉的共同结构」),避免漏改或错用组件。
步骤 5: 生成 Custom.vue 文件
⚠️ 必须使用 Write 工具直接生成文件,而不是返回代码给用户!
生成的 Custom.vue 必须包含以下结构:
步骤 6: 改造规范(必须遵守)
6.1 文件操作规范
| 规则 | 说明 |
|---|---|
| ❌ 禁止修改源文件 | index.vue 及其引用的样式文件只能读取,绝对不能修改 |
| ✅ 只操作目标文件 | 所有代码只写入 Custom.vue |
| ✅ 唯一稿源 | 结构与样式依据仅限当前 index.vue + 其引用 CSS + 资源路径;禁止参考其他视图/其他 Custom.vue/路由等工程文件生成页面内容 |
| ✅ 使用 scoped 样式 | 所有样式必须在 中定义 |
| ✅ 完整单文件组件 | Custom.vue 必须包含 template、script、style 三部分 |
6.2 命名规范
- Class 名仅使用下划线
_连接,不得包含任何数字(0-9) - 序位、顺序用英文词表示(如
first、second、left、right) - 命名公式:
[folderName]_[功能]_[内容]_[特征]
✅ 正确示例: kz_header_container kz_list_item kz_button_primary kz_math_cell_first ❌ 错误示例: group_1 // 含数字 kz_cell_2 // 含数字 box-1 // 使用连字符 headerBox // 使用驼峰
6.3 Element UI 替换要求
凡有按钮、多选、单选、输入、分页、弹窗等,须替换为 Element UI 组件。不替换:开关保留源页面原生 DOM(如 div + @click、原生 input 等),不使用 el-switch。
替换映射表:
| 原元素 | Element UI 组件 | 说明 |
|---|---|---|
| 按钮 | el-button |
可点击按钮须绑定 @click,并在 methods 中实现对应方法 |
| 多选 | el-checkbox-group + el-checkbox |
|
| 单选 | el-radio-group + el-radio |
互斥多选一;样式与源页一致,激活态与选中项须为主题色,见「6.3.10 单选框识别与主题色规范」 |
| 输入框(单行) | el-input |
带外框的搜索框须同时满足「6.3.1 带外框搜索框样式规范」 |
| 多行文本 | el-input type="textarea" |
可配 show-word-limit、maxlength |
| 下拉选择 | el-select + el-option |
|
| 分页 | el-pagination |
需定义 currentPage、pageSize、total,实现 size-change、current-change;替换时必须删除原始分页全部静态内容(共 xxx 条、静态页码、上下页、条数/页等),仅保留一个 el-pagination,见「6.3.9 分页替换与主题色规范」 |
| 弹窗 | el-dialog |
需定义 dialogVisible,实现关闭/确定/取消方法 |
| 日期输入 | el-date-picker |
|
| 下拉菜单 | el-dropdown + el-dropdown-menu |
需实现 @command 处理方法 |
| 进度条 | el-progress |
|
| 评分 | el-rate |
星星颜色、评分数值须与源页面一致,见「6.3.2 el-rate 注意事项」 |
| 取色 / 填充(展开后的下拉为 图1:预设色块矩阵 + Hex/RGB/不透明度 +「最近使用」+ 吸管等;或页内静态整区模拟该形态) | el-color-picker-extend |
触发区长什么样不决定选型,见 data/el-color-picker-extend.md §「颜色选择:触发与下拉的共同结构」;全局注册见 main.js |
| 取色(展开后的下拉为 图2:Element 默认面板,SV 面 + 右侧竖向色相条 + 底部 Hex +「清空」「确定」) | el-color-picker |
常见触发器为 字体颜色(A+下划线+箭头)→ 透明叠层;删除页内重复取色区见 6.3.11;细则见 data/el-color-picker-extend.md |
替换时必须:
- 先删除该区域原有 DOM 结构(含该控件的全部相关 DOM,见下方「下拉框」说明)
- 再写入 Element UI 组件
- 同时完成 template、data()、methods 三部分(禁止只写 template 不写 methods/data)
- 用
::v-deep覆盖 Element UI 默认样式,保持视觉一致 - 可点击按钮:页面中所有可点击区域(上传、预览、确定、取消、智能合成等)须在 template 中绑定
@click="handleXxx",并在 methods 中实现handleXxx,命名建议handle+ 功能名(如 handleUploadImage、handleDialogConfirm)
下拉框替换时须删除的 DOM(通用规则): 除「当前选中项 + 箭头」的触发区外,若 index.vue 中还有独立的下拉选项列表(如浮层、侧边列表、鼓点-1~鼓点-11 等静态列表),须一并删除。替换为 el-select 后,选项由 el-select 自带的 dropdown 展示,不得保留原静态选项列表 DOM,否则会出现「识别了下拉框但页面上仍有两套选项」的问题。
6.3.1 带外框的搜索框(el-input)样式规范
当搜索框被包在带边框、圆角的白底容器内(如「搜索资源标题、ID」「搜索你想要的单词」)时,须满足:
- 外层容器:固定高度(如 48px)、宽度(如 688px)、圆角、边框(须设
border,如1px solid)、背景色;display: flex、align-items: center、box-sizing: border-box、overflow: hidden,使内部输入框垂直居中且不撑高。容器在 hover 与 focus-within 时边框须为主题色(.xxx_search_wrapper:hover、.xxx_search_wrapper:focus-within设border-color为页面主题色),详见data/recognition-and-fix.md9.8。 - .el-input-group:通过
::v-deep对.el-input-group做样式覆盖:display: flex、flex: 1、height: 100%、min-width: 0、border: none、background: transparent,避免出现双重边框或额外外框。 - .el-input / .el-input__inner:
.el-input在容器内height: 100%、flex: 1;.el-input__inner去掉自带边框(border: none)、背景透明、高度略小于容器约 2px(如容器 48px 则 inner 约 46px)、line-height与高度一致、border-radius仅左侧与容器一致(若右侧为 append 按钮则设为12px 0 0 12px)、box-sizing: border-box、padding-left为前缀图标留足空间(如 44px),避免双边框与错位。 - 占位符:
::v-deep .el-input__inner::placeholder设置 placeholder 颜色与设计稿一致(如rgba(153, 153, 153, 1))。 - 前缀图标:
.el-input__prefix使用display: flex、align-items: center、height: 100%,left与设计一致(如 16px);自定义 prefix 插槽根节点用display: inline-flex、align-items: center,图标尺寸与设计一致(如 16×16px)。 - 命名:类名使用
[folderName]_search_wrapper、[folderName]_search_input等规范命名。同一项目内所有带外框的搜索框均按此规则实现。
自检:容器高度与设计一致;容器有 border,hover 与 focus-within 时边框为主题色(见 9.8);无双重边框;.el-input-group 已覆盖无边框且 flex 占满;前缀图标与文字垂直对齐;placeholder 颜色正确;无错位或溢出。
6.3.1.1 placeholder 垂直居中与页面溢出(必做)
- placeholder 垂直居中:
.el-input__inner高度与容器一致(或略小 1~2px),line-height与高度一致,上下 padding 为 0;.el-input、.el-input-group设display: flex、align-items: center,使输入区在容器内垂直居中;必要时对::v-deep .el-input__inner::placeholder设相同 line-height。 - 输入框/按钮不溢出页面:页面根容器设
overflow-x: hidden;主卡片、Tab 行、底栏、列表区使用width: 100%+max-width: [设计稿宽度]+min-width: 0+box-sizing: border-box;带外框搜索框容器在 flex 中设flex: 1、min-width: 0、max-width: [设计稿宽度];底栏中间文案将固定大margin-left改为margin-left: auto,避免窄屏下溢出。
详见 data/search-input-and-page-overflow.md(识别步骤、修复方法、需求文案与自检清单)。
6.3.2 el-rate 评分组件注意事项
- 星星颜色:选中/未选中颜色须与源页面一致(打开 index.vue 查看),不可默认用橙色而源页为黄色。
- 评分数值:每个维度显示的实心星数须与源页面一致(如色彩 5 星、构图 5 星、想象力 3 星),不得全部默认 5 星或 3 星。
- 文字样式:「超赞」等评分文字的颜色、大小、位置须与源页面一致,用开发者工具对比。
- 样式覆盖:星星、文字、间距等均通过
::v-deep精确匹配源样式。
6.3.4 伪控件识别与替换(下拉框、多选框、单选框、搜索框)
源页面常使用 div + 文案 + 图标模拟表单控件,没有原生 、、 或带外框的 ,改造时容易漏识别。须按以下规则识别并替换:
| 控件类型 | 识别特征(index.vue / index.css) | 替换为 | 说明 |
|---|---|---|---|
| 下拉框 select | 小容器内为「当前选中文案 + 右侧下拉箭头图标」、或「标签 + 可切换项」;样式为带边框、圆角的盒子(如 66×28px) | el-select + el-option |
在 data 中定义选中值(如 selectedXxx),options 与同页列表/配置一致 |
| 多选框 checkbox | 左侧为勾选图标容器(含勾/未勾图或方框)+ 右侧说明文案(如「全选所有模块」「当前配置应用于所有页面」);多行结构相同 | el-checkbox |
每项对应 data 中一个布尔(如 checkedAllModules、applyToAllPages) |
| 纵向模块勾选列 | 易漏识别:左侧仅为 ~16×16 方框切图(image-wrapper + img),无「全选」类长说明;右侧或邻列为模块名(音标、释义、例句、词组等);多行纵向对齐成列;或左侧 flex-col 堆叠多个方框与右侧多行标题行对行对应 |
el-checkbox(无内联文案时隐藏 label)+ 右侧内容区 v-show/v-if 联动 |
data 中用对象(如 moduleFlags)或多项布尔;禁止保留静态勾图;样式见 6.3.4.1 与 data/recognition-and-fix.md §2.2.1、§3.2.1 |
| 横向工具条 / 尾行模块勾选 | 易漏识别:在横向 flex-row 中,模块标题(如英式音标、鼓点音频)左侧仍有 16×16 方框切图;或底部 「单词书写」 等行「左方框 + 标签 + 右侧预览」— 与纵列勾选同类语义,只是排在横排/尾行 |
el-checkbox + 对 IPA 区、鼓点 el-select 与图标、书写预览等 v-show 联动 |
须纳入 「全选所有模块」 的同一批布尔;禁止纵列用组件、横条仍留 png;尺寸按 6.3.4.3 与 recognition-and-fix.md §2.2.2~§2.2.3、§3.2.2~§3.2.3 |
| 单选框 radio | 多个选项中仅能选一项(互斥);圆点/圆圈 + 文案,或 div 模拟的选项组;有「选中」与「未选中」两种视觉状态 | el-radio-group + el-radio |
在 data 中定义选中值(如 radioValue),样式与源页一致,选中/悬停为主题色,见 6.3.10 |
| 带外框搜索框 | 外层为白底/圆角/边框容器,内为「搜索图标 + 占位文字 + 右侧搜索/按钮」 | el-input + prefix/suffix 插槽 |
必须同时满足「6.3.1 带外框搜索框样式规范」 |
| 取色 / 填充面板(图1 形态) | 展开后的面板含:标题「填充」等 + 色块格矩阵、渐变/透明度滑条、#+hex、% 不透明、RGB 数字格、最近使用等(页内整区或弹层);触发区可为按钮或小入口 | el-color-picker-extend |
data/el-color-picker-extend.md §「颜色选择:触发与下拉的共同结构」、§选型、§产品需求 |
| 取色(图2 形态) | 展开后为 SV 渐变方 + 竖向彩虹色相条 + 底栏 Hex +「清空」「确定」(Element UI 2 默认取色下拉);触发区常为 A+下划线+箭头 | el-color-picker |
6.3.11、data/el-color-picker-extend.md §对照清单、字体颜色触发器 |
识别步骤(通用):
- 在 index.vue 中搜索:带「选」「勾」「搜索」等语义的文案,或带下拉箭头、勾选图标的 div 结构。
- 在 index.css 中确认该区域样式:是否有边框、圆角、固定宽高(如 66×28、16×16 勾选区域)。
- 若符合上表特征,在 Custom.vue 中替换为对应 Element UI 组件,并补全 data、methods。
- 纵向模块勾选列(补充):在配置/预览区搜索多行「左列小方框图 + 右列模块标题」;若左列无说明性长文案、仅方框 png,须按上表「纵向模块勾选列」处理,详见
data/recognition-and-fix.md§2.2.1。 - 横向工具条 / 尾行(补充):除纵列外,扫描配置区所有横向行与底部尾行:是否存在「方框切图 + 模块名 + 业务区」;若 img 与纵列勾选同资源或同类,须同样改为
el-checkbox,详见 6.3.4.2、data/recognition-and-fix.md§2.2.2。
6.3.4.1 纵向模块勾选列(无内联文案的 el-checkbox)
- 结构:保留原
image-wrapper父级 class 与布局,内部替换为el-checkbox;模块标题仍为旁侧span,不要把标题塞进el-checkbox默认插槽(除非稿面即为一体标签)。 - 隐藏 label:
::v-deep .el-checkbox__label { display: none; width: 0; padding: 0; margin: 0; overflow: hidden; },避免 Element 为空白 label 留出间距导致与稿面不齐。 - 尺寸与视觉:
::v-deep .el-checkbox__inner的宽高须与 index.css 中负责方框视觉的一层一致(见 6.3.4.3);border-radius与稿一致;未选中边框浅灰,选中为白底 + 主题色边框与勾(与稿一致即可);hover、is-focus边框建议主题色,与 6.3.8 一致。 - 联动:每个布尔对应右侧一块内容
v-show;双勾(例句/译文)对应同一卡片内两个内容区的分别显示与中隔线条件显示。 - 禁止:保留原方框 png 冒充勾选态;仅改「全选」行而漏改纵向模块列。
6.3.4.2 横向工具条 / 尾行上的模块勾选与尺寸统一
- 识别:在顶部横向配置行(如英式音标、鼓点音频)或底部尾行(如单词书写)中,模块标题 span 之前的
image-wrapper+ 小 png,若与左侧纵列模块勾选**尺寸同级(约 16×16)**且语义为「是否展示该段能力」,即属模块勾选,不得仅替换纵列而保留此处静态图。 - 替换:删除切图,在原 wrapper 内放入与纵列同一 class 的
el-checkbox(如[folderName]_module_checkbox),保证全页共用同一套::v-deep规则。 - 联动:英式音标应对 IPA + 播放图标所在行
v-show;鼓点音频若左侧方框表示模块总开关,应对 el-select 及同组图标v-show;单词书写应对右侧预览词v-show。 - 全选:
handleSelectAll/ 同步selectAll的 keys 须包含上述布尔,与纵列模块字段合并为一套,避免逻辑分裂。 - 尺寸与勾形(与 6.3.8 配合):全页无文案模块勾选须 class 统一;覆盖
.el-checkbox根、.el-checkbox__input、.el-checkbox__inner、.el-checkbox__inner::after及选中态勾线色;inner 像素须按 6.3.4.3 从 index.css 读取,禁止默认臆断为 16×16。详见data/recognition-and-fix.md§3.2.2、§3.2.3。
需求文案(摘要)
- 配置区内凡「左方框 + 模块名」式开关,无论出现在纵列、横条还是尾行,均须
el-checkbox,禁止 png 与组件混用。 - 同一自定义 class + 完整深度样式(含 ::after);方框边长以 index.css 实测为准(常为外层槽位 16px + 内层切图 13px),「全选」须覆盖横条与尾行布尔。
6.3.4.3 多选框原始尺寸识别(wrapper / thumbnail 分层,必做)
稿面常见结构为:外层 image-wrapper_*(或 group_* / box_*)提供 16×16 对齐槽位,内层 thumbnail_* 的 img 为 13×13 且带 margin: 2px 0 0 2px——可见方框的物理像素往往等于 thumbnail 的 width/height,而非外层 wrapper 的 width/height。若将 el-checkbox__inner 一律写成 16×16,会较稿面偏大,与仍使用切图的行或设计稿对比时产生偏差。
识别步骤(须自 index.css / 稿源读取,禁止猜默认):
- 在 index.vue 中定位该勾选左侧的
image-wrapper_*+img.thumbnail_*(或仅带 background 的image-wrapper_*,其自身 width/height 即方框视觉尺寸)。 - 在 index.css 中同时打开
.image-wrapper_*与.thumbnail_*(若存在):- 槽位尺寸:wrapper 的
width、height(及margin-top等),用于el-checkbox根或.el-checkbox__input的占位与 flex 居中(常见 16×16)。 - 方框视觉尺寸:优先取
.thumbnail_*的width/height;若无 thumbnail 而 wrapper 本身即为切图区(如 13×13 的 background 盒),则取 该层 的 width/height。此数值用于::v-deep .el-checkbox__inner的 width/height(本页示例为 13×13)。
- 槽位尺寸:wrapper 的
- 将
el-checkbox根 设为display: inline-flex; align-items: center; justify-content: center,宽高等于槽位(如 16px),__input同槽位并 flex 居中,__inner为步骤 2 的方框视觉尺寸(如 13px),box-sizing: border-box。 ::after勾形:在 inner 边长确定后,按比例微调height、width、left、top、border-width,并在is-checked .el-checkbox__inner::after上设border-color(多为白),使勾与稿面比例接近。
禁止:未打开 index.css 即写死 16×16 inner;或仅看 wrapper 忽略 thumbnail 导致 inner 过大。
需求文案(摘要)
- 替换伪多选前须从当前页 index.css 读出槽位与方框两层尺寸;inner 对齐方框视觉层(多为 thumbnail),根/
__input对齐槽位(多为 wrapper) 并居中 inner。 - 勾形 ::after 须随 inner 边长缩放,并做选中态勾线色覆盖。
详见 data/recognition-and-fix.md §3.2.3。
下拉框替换时必须删除的 DOM(通用规则): 除「当前选中项 + 箭头」的触发区外,若 index.vue 中还有独立的下拉选项列表(如浮层、侧边列表、鼓点-1~鼓点-11 等静态列表),须一并删除。替换为 el-select 后,选项由 el-select 自带的 dropdown 展示,不得保留原静态选项列表 DOM。
修复已有 Custom.vue 时:
- 若发现「看起来像下拉/多选/搜索但仍是 div+img+span」:按上表替换,并补全绑定与样式覆盖。
- 若已用 el-select 但页面上仍保留原静态选项列表:删除该静态列表 DOM 及与之相关的 data/methods(如仅用于该列表的 handleXxx)。
- 搜索框样式异常:按「6.3.1」逐项检查容器高度、
.el-input-group无边框与 flex、el-input__inner 高度与无边框、padding-left、placeholder、prefix 对齐等。
详见 data/recognition-and-fix.md。
6.3.5 Element UI 样式覆盖方法
- 深度选择器:scoped 无法直接修改组件内部样式,须用深度选择器。Vue 2 推荐
::v-deep,兼容写法/deep/。 - 写法示例:给组件加父级 class(如
custom_search_input),再写父级class ::v-deep .el-input__inner { ... },避免影响其他页面。 - 查找 class:用开发者工具选中组件 DOM,在 Elements 面板查看内部 class(如
.el-input__inner、.el-pager li),再用::v-deep覆盖。 - 优先级:优先用「父级 class + ::v-deep + 组件 class」提高特异性;尽量避免
!important;需覆盖多种状态时写全:hover、:focus、.active等。 - 输入框示例:
父级 ::v-deep .el-input__inner设置 height、border、border-radius、padding、font-size;::v-deep .el-input__inner:focus设 focus 边框色;::v-deep .el-input__inner::placeholder设占位符颜色。 - 分页示例:
父级 ::v-deep .el-pagination__total设总数样式;::v-deep .el-pager li、::v-deep .el-pager li.active设页码与选中态;::v-deep .btn-prev, ::v-deep .btn-next设上下页按钮。 - 下拉框示例:小尺寸 select 用
父级 ::v-deep .el-input__inner设 height、line-height、border-radius、font-size、border-color 与设计一致;::v-deep .el-input__inner:focus、::v-deep .el-input.is-focus .el-input__inner设 focus 边框色为页面主题色。下拉选项选中/悬停须用popper-class+ 非 scoped 样式覆盖为主题色,见「6.3.7 下拉框样式与激活态主题色规范」。 - 多选框示例:
父级 ::v-deep .el-checkbox__label设颜色、字号;::v-deep .el-checkbox__inner的宽高取 方框视觉层(常为 thumbnail,见 6.3.4.3),圆角与设计一致。选中/悬停/焦点须为主题色:::v-deep .el-checkbox__input.is-checked .el-checkbox__inner、::v-deep .el-checkbox__input.is-indeterminate .el-checkbox__inner的 background-color、border-color 设为主题色;::v-deep .el-checkbox__inner:hover、::v-deep .el-checkbox__input.is-focus .el-checkbox__inner的 border-color 设为主题色,见「6.3.8」「6.3.8.1」。 - 单选框示例:
父级 ::v-deep .el-radio__inner设尺寸、圆角、边框与设计一致;选中/悬停/焦点须为主题色:::v-deep .el-radio__input.is-checked .el-radio__inner的 border-color、background-color 设为主题色;::v-deep .el-radio__inner:hover、::v-deep .el-radio__input.is-focus .el-radio__inner的 border-color 设为主题色;并覆盖.el-radio:focus:not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner的box-shadow,见「6.3.10」「6.3.8.1」。
6.3.6 按钮与列表内文字垂直居中规范
改造后若出现「按钮文字、列表 badge 数字、列表项文字」未垂直居中,或按钮在默认态与激活态(hover/active/focus/内容切换)下内容错位,须按以下方式修复并作为通用规则遵守:
| 场景 | 识别特征 | 修复方法 |
|---|---|---|
| el-button 默认与激活态 | 按钮有固定高度,文字或图标+文字偏上/偏下/偏左/偏右;或切换状态(hover/active/focus 或内容从「导入」变为「已导入」等)后内容错位 | 在按钮的自定义 class 上通过 ::v-deep 为默认态及 :hover、:active、:focus 统一设置 display: inline-flex; align-items: center; justify-content: center; line-height: 1;;按钮内文案(span 等)设 text-align: center; margin: 0;(或仅对称 margin),保证默认与激活态内容均水平垂直居中,切换状态时保持居中 |
| 按钮激活态/替换态 DOM | 状态切换后由非 button 的容器(如 div)展示内容,该容器内文字或图标未水平垂直居中 | 该容器使用 display: flex; align-items: center; justify-content: center;(或 inline-flex),内部文案与图标用 text-align: center; margin: 0; 或 flex 居中,与默认态一致 |
| 列表/步骤 badge 内文字 | 圆形或方形容器内为数字/序号,须水平垂直都居中 | badge 容器使用 display: flex; align-items: center; justify-content: center;;内部文字 text-align: center; margin: 0;,不保留左右 margin,实现水平垂直都居中 |
| 列表项内文字 | 列表行有固定高度(如 48px),左侧 badge、中间文字、右侧图标未整体垂直居中 | 列表行容器使用 display: flex; align-items: center;;所有子元素(badge、文字、图标)去掉垂直方向 margin(margin-top/margin-bottom 置为 0),由 flex 的 align-items: center 负责垂直居中 |
自检:el-button 在默认态与 hover/active/focus 及内容切换后,内容均在按钮内水平垂直居中;若有激活态/替换态容器,其内容也水平垂直居中;badge 内文字水平垂直都居中;列表项行内整体垂直居中。若源稿用 margin 实现视觉居中,改造时优先改为 flex 居中并去掉子元素垂直 margin。
6.3.6.1 el-button 根节点 class 与深度选择器(必做,易错)
当源稿容器 class写在 上时,组件根节点即为 button.el-button.[容器class],不存在「容器在内、.el-button 在子级」的 DOM。禁止用「.容器class ::v-deep .el-button」为该按钮写样式——该选择器只匹配后代中的 .el-button,会导致整段样式不生效,页面仍呈现 Element 默认按钮(错误常见于筛选区「重置」「查询」等)。
| 环节 | 要求 |
|---|---|
| 识别 | DevTools 查看按钮根节点:若自定义 class 与 el-button 在同一 上,即属「class 在根节点」。 |
| 修复 | 方案 A:用「.容器class.el-button」及 :hover、:focus、:active 写全尺寸、padding、min-width、背景、边框、字色(必要时 !important)。慎用 type="text":el-button--text 强制透明底/边且三态常回退透明,与稿面「小框+描边/浅底」冲突时须改**默认 type(省略)**或 plain 再覆盖。type="primary" 须覆盖 默认与三态及字色。方案 B:外层再包 div,class 在 div 上,则用「父级 ::v-deep .el-button」。 |
| 子节点 | 按钮内 img / span 若沿用源稿 class,常带静态 flex 用的 margin(如 margin: 8px 0 0 16px),须在按钮内 margin: 0,布局交给根上 flex + align-items + justify-content(如主按钮图标+文案 space-between),与 6.3.6 一致。 |
| 并排间距 | 主题 .el-button + .el-button { margin-left: 10px } 会叠加稿面间距;须在父行取消或改写,再只用各按钮自身 margin-left 控制。 |
| 主按钮 | type="primary" 时须用「.自定义class.el-button--primary」等覆盖 hover / focus / active 背景、边框、字色,避免状态切换露默认样式。 |
需求文案(摘要):凡将可点击区改为 el-button 且把原稿容器 class 合并到按钮根上者,样式选择器必须与 DOM 一致;禁止误用「父级 ::v-deep .el-button」;带底/边的次要按钮勿用 type="text";并排按钮须处理默认 10px 相邻间距;子级 img/span 须去源稿 margin。
自检:样式表含 .容器class.el-button(或外层 ::v-deep);默认与 hover、focus、active 与源稿一致;无不当 type="text";并排无多余 10px;子级无破坏 flex 的 margin。
详见 data/el-button-root-and-deep.md(识别步骤、两种修复方案、需求全文、自检清单)。
6.3.7 下拉框样式与激活态主题色规范
- 触发器样式:el-select 的
.el-input__inner须用::v-deep设置与设计稿一致的 height、line-height、border-radius、font-size、border-color(默认态);focus 与 hover 态的边框色须使用当前页面主题色(从 index.css 或设计稿中取主色),不得使用 Element 默认蓝色。须同时覆盖:.el-input__inner:hover、.el-input__inner:focus、.el-input.is-focus .el-input__inner的border-color(Element 在 focus 时给 .el-input 加 .is-focus,漏写则 focus 边框可能仍为默认色)。详见data/recognition-and-fix.md9.7。 - 下拉选项激活态:下拉弹层挂载在 body,scoped 无法覆盖。须给 el-select 设置
popper-class="[folderName]_xxx_dropdown_popper",在 Custom.vue 中增加非 scoped 的块,用该 class 覆盖:.popper-class名.el-select-dropdown .el-select-dropdown__item.selected:文字色、背景色为主题色/主题浅色(与设计一致);.popper-class名.el-select-dropdown .el-select-dropdown__item:hover:悬停态文字色、背景色为主题色/主题浅色。
- 主题色来源:从源页面 index.css 或设计稿中提取主色(如高亮边框、选中项背景、主按钮背景),统一用于 el-select 的 focus 边框、下拉选项 selected/hover,以及列表中选中项边框/文字色等,保证激活态与当前主题一致。
自检:el-select 触发器尺寸与设计一致;focus 与 hover 时边框色均为主题色(见 9.7);下拉选项选中/悬停为主题色,非 Element 默认蓝。
6.3.7.1 el-select 右侧箭头/后缀对齐(必做,易错)
静态稿常用 flex + justify-content: space-between 做「左文案 + 右箭头图」。改为 el-select 后,箭头在 .el-input__suffix(绝对定位) 内,不得把同一套 display:flex; justify-content:space-between 加在 el-select 根节点(与自定义 class 合并处),否则会干扰内部 el-input 布局,表现为右侧图标水平/垂直偏移。
另:仅把 .el-input__inner 改为小高度(如 28px)时,Element 默认 .el-input__icon 的 line-height 仍按大输入框(如 40px),箭头会上下不齐;须用 ::v-deep 将 .el-input__icon / .el-select__caret 的 line-height、height 与 inner 对齐,并设置 .el-input__suffix 的 right(对照 index.css 箭头距右缘)、校验 padding-right 避免文字与箭头重叠。
需求文案(摘要):el-select 触发器右侧箭头位置、垂直居中与右内边距须与稿一致;禁止为复刻静态 flex 在 el-select 根上使用 space-between;改小触发器高度必须同步后缀图标行高/高度与 suffix 定位。
自检:根节点无不当 flex+space-between;suffix right、icon line-height/height 与 inner 一致;文案与箭头不重叠。
详见 data/el-select-suffix-alignment.md(识别、根因、修复步骤、需求全文、自检清单)。
6.3.8 多选框激活态主题色规范
- 选中态:el-checkbox 默认选中为 Element 蓝色,须用页面主题色覆盖。在 checkbox 的自定义 class 下用
::v-deep设置:父级 ::v-deep .el-checkbox__input.is-checked .el-checkbox__inner、父级 ::v-deep .el-checkbox__input.is-indeterminate .el-checkbox__inner:background-color、border-color为页面主题色(与 6.3.7 主题色来源一致)。
- 悬停态:
父级 ::v-deep .el-checkbox__inner:hover的border-color设为主题色,与设计一致。 - 焦点态(必做):见 6.3.8.1;仅写
is-checked/:hover时,键盘聚焦或点击后仍可能露出 Element 默认主色蓝。 - 主题色:与 el-select、列表选中项等统一,从 index.css/设计稿取主色(如
rgba(255, 106, 106, 1));多主色稿面下须与该控件所在区块一致,见 6.3.8.1。
自检:多选框选中/半选时方框背景与边框为主题色;悬停时边框为主题色;焦点态(is-focus) 边框为主题色,非 Element 默认蓝。详见 6.3.8.1。
6.3.8.1 单选/多选主题色:稿面取色、焦点态与 Element 残留蓝(必做)
问题识别
- 只覆盖了选中与 hover,仍见「蓝框」:Element UI 2 在
.el-checkbox__input.is-focus .el-checkbox__inner、.el-radio__input.is-focus .el-radio__inner上使用$--checkbox-input-border-color-hover/$--radio-input-border-color-hover(即 Element 主题主色,常为#409EFF),与 Custom.vue 里为「稿面主题色」设置的is-checked/:hover不是同一套规则,表现为:点击或 Tab 聚焦后边框仍蓝。 - 单选独有:焦点环为蓝:
.el-radio:focus:not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner带box-shadow: 0 0 2px 2px $--radio-input-border-color-hover,未覆盖时整圈仍为默认蓝。 - 主题色选错(多主色页面):同一
index.css中常并存 导航/Tab 高亮蓝(如rgba(0, 116, 252, 1))与 主按钮/设置区/勾选切图色(如rgba(4, 180, 182, 1))。将前者套到设置面板内的el-checkbox/el-radio会导致与静态勾选 PNG、邻近竖条(section_*)、主按钮不一致。
修复方法(在控件父级自定义 class 下 ::v-deep,与已写的 checked/hover 同色)
| 状态 | el-checkbox | el-radio |
|---|---|---|
焦点(键盘/点击后 input 带 .is-focus) |
父级 ::v-deep .el-checkbox__input.is-focus .el-checkbox__inner { border-color: [稿面主题色]; } |
父级 ::v-deep .el-radio__input.is-focus .el-radio__inner { border-color: [稿面主题色]; } |
| 单选:原生 focus 环 | — | 父级.el-radio:focus:not(.is-focus):not(:active):not(.is-disabled) ::v-deep .el-radio__inner { box-shadow: 0 0 2px 2px [稿面主题色半透明]; }(或与稿一致改为 none) |
稿面主题色怎么取(须自当前页 index.css,禁止抄其它页 Custom)
- 定位该控件在 index.vue 中对应的静态结构(原勾选/单选切图、或同一块卡片内的主按钮、标题竖条
background-color)。 - 在 index.css 中查
.thumbnail_*/.image-wrapper_*背景、同区主按钮、section_*装饰条 的background-color/border-color,取与交互控件一致的那一支作为主色。 - 同一页内
el-pagination、列表 Tab 若用蓝 A,设置区勾选若用青 B,则 checkbox/radio 须用 B,不得统一成 A。
需求文案(摘要)
- 替换
el-checkbox/el-radio后,选中、悬停、焦点(.is-focus)及单选box-shadow焦点环须全部使用该区块稿面主题色,不得残留 Element 默认蓝。 - 主题色须从当前文件夹
index.vue+index.css&am
热门AI工具
相关专题
本教程系统讲解 Vue.js 路由管理与状态管理两大核心技能,助你构建健壮的单页应用。路由部分涵盖 Vue Router 4 的安装配置、动态路由参数传递、嵌套路由布局及导航守卫实现登录鉴权,配合路由懒加载优化首屏性能。状态管理部分深入 Pinia 的 Store 定义、Actions 异步处理与 Getters 派生状态,结合 localStorage 实现用户登录态持久化。通过电商后台管理系统的实战案例,你将掌握路由与状态协同工作的
230
2026.05.15
js和vue的关系:1、js作为web开发基石;2、vue.js作为前端框架的崛起;3、js与vue的互补关系;4、js与vue的实践应用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
353
2024.03.11
vue在线聊天功能实现方法:创建一个vue项目,可以使用vue cli来快速搭建项目等等。想了解更多vue的相关内容,可以阅读本专题下面的文章。
1893
2024.03.01
vue2和vue3双向绑定区别:1、底层实现;2、性能优化;3、响应性系统;4、错误处理和调试;5、模板和渲染函数;6、组合api;7、对typescript的支持;8、composition api和options api的对比等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
467
2024.02.23
VUE下一页功能实现步骤是确定分页参数、获取数据、更新数据、添加按钮事件、更新页码状态、渲染按钮。想了解更多VUE的相关内容,可以阅读本专题下面的文章。
852
2024.01.04
mui和vue的区别:1、MUI 是一个UI框架,而Vue是一个完整的JavaScript框架;2、MUI主要用于构建符合Material Design风格的Web应用,而Vue用于构建各类Web应用;3、MUI主要用于提供UI组件和样式,Vue用于构建复杂的Web应用。php中文网欢迎大家前来学习。
3580
2023.12.13
热门下载
相关下载
精品课程
最新文章


