前端UI组件移动开发【免费下载链接】cube-ui:large_orange_diamond: A fantastic mobile ui lib implement by Vue项目地址https://gitcode.com/gh_mirrors/cu/cube-ui点击查看免费下载本文基于 cube-ui 官方文档 Theme 主题定制 展开系统讲解从创建theme.styl主题文件、理解全部主题变量到接入 webpack 构建的完整流程。读完本文你将掌握在 Vue 项目中用纯变量覆盖的方式自定义 cube-ui 任意组件配色且无需修改组件源码或覆写样式。主题定制的工作原理变量覆盖而非样式覆写cube-ui 从cube-ui^1.0.2版本开始支持主题定制其核心思路是组件样式全部由 Stylus 变量驱动因此只需在构建期覆盖这些变量就能整体改变组件外观而不需要在业务代码中写大量!important或::v-deep覆写样式。这一方案有一个重要前提主题定制依赖后编译Post-compile机制。所谓后编译是指 NPM 包发布前不做编译而是随应用一起编译——cube-ui 的package.json中module: src/index.js、postCompile: true正是这一机制的具体体现。也就是说主题文件之所以能生效是因为 Stylus 源码而非编译后的 CSS参与了应用自身的编译流程。后编译的完整背景、规则与 webpack 配置见 Post-compile 后编译文档。第一步在src/下创建主题文件theme.styl在你的应用src/目录下创建theme.styl文件内容如下这些变量值即 cube-ui 的默认值注释中标注了对应组件// 需要使用 cube-ui 的变量只需引入它 require ~cube-ui/src/common/stylus/var/color.styl // action-sheet $action-sheet-color : $color-grey $action-sheet-active-color : $color-orange $action-sheet-bgc : $color-white $action-sheet-active-bgc : $color-light-grey-opacity $action-sheet-title-color : $color-dark-grey $action-sheet-space-bgc : $color-mask-bg /// picker style $action-sheet-picker-cancel-color : $color-light-grey $action-sheet-picker-cancel-active-color : $color-light-grey-s // bubble // button $btn-color : $color-white $btn-bgc : $color-regular-blue $btn-active-bgc : $color-blue /// primary $btn-primary-color : $color-white $btn-primary-bgc : $color-orange $btn-primary-active-bgc : $color-dark-orange /// light $btn-light-color : $color-grey $btn-light-bgc : $color-light-grey-sss $btn-light-active-bgc : $color-active-grey /// outline $btn-outline-color : $color-grey $btn-outline-bgc : transparent $btn-outline-bdc : $color-grey $btn-outline-active-bgc : $color-grey-opacity $btn-outline-active-bdc : $color-grey /// outline-primary $btn-outline-primary-color : $color-orange $btn-outline-primary-bgc : transparent $btn-outline-primary-bdc : $color-orange $btn-outline-primary-active-bgc : $color-orange-opacity $btn-outline-primary-active-bdc : $color-dark-orange /// disabled $btn-disabled-color : $color-white $btn-disabled-bgc : $color-light-grey-s $btn-disabled-bdc : $color-light-grey-s // toolbar $toolbar-bgc : $color-light-grey-sss $toolbar-active-bgc : $color-active-grey // checkbox $checkbox-color : $color-grey $checkbox-icon-color : $color-light-grey-s /// checked $checkbox-checked-icon-color : $color-orange $checkbox-checked-icon-bgc : $color-white /// disabled $checkbox-disabled-icon-color : $color-light-grey-ss $checkbox-disabled-icon-bgc : $color-light-grey-ss // checkbox hollow $checkbox-hollow-checked-icon-color : $color-orange $checkbox-hollow-disabled-icon-color : $color-light-grey-ss // checkbox-group $checkbox-group-bgc : $color-white $checkbox-group-horizontal-bdc : $color-light-grey-s // radio $radio-group-bgc : $color-white $radio-group-horizontal-bdc : $color-light-grey-s $radio-color : $color-grey $radio-icon-color : $color-light-grey-s /// selected $radio-selected-icon-color : $color-white $radio-selected-icon-bgc : $color-orange /// disabled $radio-disabled-icon-bgc : $color-light-grey-ss // radio hollow $radio-hollow-selected-icon-color : $color-orange $radio-hollow-disabled-icon-color : $color-light-grey-ss //checker $checker-item-color : $color-grey $checker-item-bdc : $color-light-grey-sss $checker-item-bgc : $color-white $checker-item-active-color : $color-orange $checker-item-active-bdc : $color-orange $checker-item-active-bgc : $color-light-orange-opacity $checker-item-disabled-color : $color-light-grey-s $checker-item-disabled-bdc : $color-light-grey-s $checker-item-disabled-bgc : $color-light-grey-ss // dialog $dialog-color : $color-grey $dialog-bgc : $color-white $dialog-icon-color : $color-regular-blue $dialog-icon-bgc : $color-background $dialog-title-color : $color-dark-grey $dialog-close-color : $color-light-grey $dialog-btn-color : $color-light-grey $dialog-btn-bgc : $color-white $dialog-btn-active-bgc : $color-light-grey-opacity $dialog-btn-highlight-color : $color-orange $dialog-btn-highlight-active-bgc : $color-light-orange-opacity $dialog-btn-disabled-color : $color-light-grey $dialog-btn-disabled-active-bgc : transparent $dialog-btns-split-color : $color-row-line // index-list $index-list-bgc : $color-white $index-list-title-color : $color-dark-grey $index-list-anchor-color : $color-light-grey $index-list-anchor-bgc : #f7f7f7 $index-list-item-color : $color-dark-grey $index-list-item-active-bgc : $color-light-grey-opacity $index-list-nav-color : $color-grey $index-list-nav-active-color : $color-orange // loading // picker $picker-bgc : $color-white $picker-title-color : $color-dark-grey $picker-subtitle-color : $color-light-grey $picker-confirm-btn-color : $color-orange $picker-confirm-btn-active-color : $color-light-orange $picker-cancel-btn-color : $color-light-grey $picker-cancel-btn-active-color : $color-light-grey-s $picker-item-color : $color-dark-grey // popup $popup-mask-bgc : rgb(37, 38, 45) $popup-mask-opacity : .4 //scroll // slide $slide-dot-bgc : $color-light-grey-s $slide-dot-active-bgc : $color-orange // time-picker // tip $tip-color : $color-white $tip-bgc : $color-dark-grey-opacity // toast $toast-color : $color-light-grey-s $toast-bgc : rgba(37, 38, 45, 0.9) // upload $upload-btn-color : $color-grey $upload-btn-bgc : $color-white $upload-btn-active-bgc : $color-light-grey-opacity $upload-btn-box-shadow : 0 0 6px 2px $color-grey-opacity $upload-btn-border-color : #e5e5e5 $upload-file-bgc : $color-white $upload-file-remove-color : rgba(0, 0, 0, .8) $upload-file-remove-bgc : $color-white $upload-file-state-bgc : $color-mask-bg $upload-file-success-color : $color-orange $upload-file-error-color : #f43530 $upload-file-status-bgc : $color-white $upload-file-progress-color : $color-white // switch $switch-on-bgc : $color-orange $switch-off-bgc : $color-white $switch-off-border-color : #e4e4e4 // input $input-color : $color-grey $input-bgc : $color-white $input-border-color : $color-row-line $input-focus-border-color : $color-orange $input-placeholder-color : $color-light-grey-s $input-clear-icon-color : $color-light-grey //textarea $textarea-color : $color-grey $textarea-bgc : $color-white $textarea-border-color : $color-row-line $textarea-focus-border-color : $color-orange $textarea-outline-color : $color-orange $textarea-placeholder-color : $color-light-grey-s $textarea-indicator-color : $color-light-grey-s // validator $validator-msg-def-color : #e64340 // select $select-color : $color-grey $select-bgc : $color-white $select-disabled-color : #b8b8b8 $select-disabled-bgc : $color-light-grey-opacity $select-border-color : $color-light-grey-s $select-border-active-color : $color-orange $select-icon-color : $color-light-grey $select-placeholder-color : $color-light-grey-s // swipe $swipe-btn-color : $color-white // form $form-color : $color-grey $form-bgc : $color-white $form-invalid-color : #e64340 $form-group-legend-color : $color-light-grey $form-group-legend-bgc : $color-background $form-label-required-color : #e64340 // drawer $drawer-color : $color-dark-grey $drawer-title-bdc : $color-light-grey-ss $drawer-title-bgc : $color-white $drawer-panel-bgc : $color-white $drawer-item-active-bgc : $color-light-grey-opacity // scroll-nav $scroll-nav-bgc : $color-white $scroll-nav-color : $color-grey $scroll-nav-active-color : $color-orange // image-preview $image-preview-counter-color : $color-white // tab-bar tab-panel $tab-color : $color-grey $tab-active-color : $color-dark-orange $tab-slider-bgc : $color-dark-orange注意两个语法细节变量定义使用的是 Stylus 的:赋值操作符而非普通赋值。这意味着你的自定义值会优先于组件源码中对同一变量的赋值这正是“覆盖默认值”这一机制的关键文件首行的require ~cube-ui/src/common/stylus/var/color.styl用于引入 cube-ui 的基础色板变量~前缀让 webpack 从node_modules解析路径这样你就可以直接引用$color-orange、$color-grey等现成变量而不是硬编码十六进制值。第二步理解基础色板让变量“有据可依”主题文件里大量出现$color-*系列变量它们定义在 cube-ui 源码的 color.styl 中。完整色板如下变量默认值用途$color-orange#fc9153品牌主色用于按钮主色、选中态、焦点边框等$color-dark-orange#e8864c深橙色用于主按钮激活态、Tab 激活态$color-light-orange#fdc2a5浅橙色用于确认按钮激活态文字$color-orange-opacityrgba(252, 145, 83, .08)橙色透明底用于 outline-primary 激活背景$color-light-orange-opacityrgba(252, 145, 83, .04)更浅的橙色透明底用于 checker/dialog 激活背景$color-regular-blue#4a4c5b常规蓝灰用于按钮默认背景、dialog 图标色$color-blue#444654深蓝灰用于按钮默认激活背景$color-background#f3f4f5页面背景用于 dialog 图标背景、form 组图例背景$color-white#fff白色$color-dark-grey#333深灰用于标题、正文强调色$color-grey#666中灰用于正文、常规图标$color-light-grey#999浅灰用于次要文字$color-light-grey-s#ccc更浅的灰用于边框、禁用色$color-light-grey-ss#eee再浅一档用于禁用背景$color-light-grey-sss#fcfcfc最浅灰用于按钮 light 背景、toolbar 背景$color-active-grey#e8e8e8按压态灰用于按钮 light 激活背景$color-dark-grey-opacityrgba(74, 76, 91, 0.8)深灰透明用于 tip 背景$color-grey-opacityrgba(0, 0, 0, .08)灰色透明用于 outline 激活背景、upload 按钮阴影$color-light-grey-opacityrgba(0, 0, 0, .04)轻灰透明用于列表项按压背景$color-row-line#ebebeb行分割线用于 input/textarea 边框、dialog 按钮分割线$color-col-line#f5f5f5列分割线$color-mask-bgrgba(37, 38, 45, .4)蒙层背景除了颜色cube-ui 还提供了字号、圆角、阴影三组基础变量位于 size.styl$fontsize-large-xxxx到$fontsize-small-s共 9 档字号以及$radius-size-medium 5px和 box-shadow.styl$box-shadow-content 0 1px 3px rgba(0, 0, 0, .1)。如果你的业务样式希望与 cube-ui 视觉体系保持一致也可以直接在业务 Stylus 文件中require ~cube-ui/src/common/stylus/var/size.styl复用这些尺寸变量。从源码结构看cube-ui 的样式入口 src/common/stylus/index.styl 依次引入variable.styl、mixin.styl、reset.styl、base.styl与图标样式组件级样式如$btn-*、$dialog-*等在各自组件中消费上述主题变量因此主题文件只需在编译期提前注入变量所有组件样式便会同步换肤。第三步修改 webpack 的 stylus-loader 配置让主题文件注入全局主题文件创建好后还需要让 stylus-loader 在编译每个.styl/.vue样式块时自动引入它。如果你的项目由 vue-cli 创建把build/utils.js中的exports.cssLoaders函数修改为如下形式exports.cssLoaders function (options) { options options || {} const cssLoader { loader: css-loader, options: { minimize: process.env.NODE_ENV production, sourceMap: options.sourceMap } } var postcssLoader { loader: postcss-loader, options: { sourceMap: options.sourceMap } } // generate loader string to be used with extract text plugin function generateLoaders (loader, loaderOptions) { const loaders options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader] if (loader) { loaders.push({ loader: loader -loader, options: Object.assign({}, loaderOptions, { sourceMap: options.sourceMap }) }) } // Extract CSS when that option is specified // (which is the case during production build) if (options.extract) { return ExtractTextPlugin.extract({ use: loaders, fallback: vue-style-loader }) } else { return [vue-style-loader].concat(loaders) } } const stylusOptions { resolve url: true, // !! add import option, include the theme file import: [path.resolve(__dirname, ../src/theme)] } // https://vue-loader.vuejs.org/en/configurations/extract-css.html return { css: generateLoaders(), postcss: generateLoaders(), less: generateLoaders(less), sass: generateLoaders(sass, { indentedSyntax: true }), scss: generateLoaders(sass), stylus: generateLoaders(stylus, stylusOptions), styl: generateLoaders(stylus, stylusOptions) } }关键点说明核心改动是新增了stylusOptions对象其中import: [path.resolve(__dirname, ../src/theme)]会让 stylus-loader 在编译时自动引入你的主题文件。注意这里写的是../src/theme而非../src/theme.styl——stylus-loader 会自动补全.styl扩展名resolve url: true保证 Stylus 中的url()能按源码相对路径解析例如图片资源是 cube-ui 自身构建也启用的选项stylus与styl两种扩展名都要传入stylusOptions否则以.styl为扩展名书写的样式不会注入主题其余 loadercss-loader、postcss-loader、ExtractTextPlugin配置保持不变仅影响样式预处理阶段。如果你的项目使用自定义 webpack 配置而非 vue-cli本质相同只需为stylus-loader追加上述import选项即可。另外也可以把主题文件拆分为多个变量文件如theme/color.styl、theme/size.styl并在import数组中分别引入。结果全量换肤无需覆写样式完成以上两步后重新运行开发或构建命令cube-ui 所有组件的样式都会以你注入的主题变量为基准重新编译生成。你不需要通过、/deep/或!important去覆写任何组件样式因为变量覆盖发生在编译期组件源码中引用变量的位置会自动得到新值。这种方案带来的直接收益可控范围灵活可以只改某一个组件的一组变量例如只调整$btn-primary-bgc让主按钮换色也可以整体替换基础色板如把$color-orange换成品牌色零运行时开销主题在编译期确定产物是静态 CSS不引入任何运行时主题切换逻辑与 Post-compile 天然兼容由于依赖 后编译 机制应用编译时直接编译 cube-ui 的 Stylus 源码主题变量能穿透到组件内部这是预编译产物的cube.min.css无法做到的。使用前提与限制最后提醒几点避免踩坑版本要求主题定制从cube-ui^1.0.2开始支持本文当前仓库cube-ui1.12.56见 package.json完全适用必须配合后编译package.json中module: src/index.js与postCompile: true是主题生效的基础若通过别名将 cube-ui 指向lib/编译产物主题变量将无法注入需要 webpackimport注入依赖 stylus-loader 配置非 webpack 构建如直接引入lib/cube.min.css场景无法使用该方案变量名严格匹配主题文件中变量名必须与组件源码中引用的变量名完全一致如$btn-primary-bgc拼写错误会被 Stylus 静默忽略导致该组件保留默认色。建议以本文列出的变量清单为准逐一核对。延伸阅读Post-compile 后编译机制详解主题定制生效的前提讲解了main/module双入口约定与webpack-post-compile-plugin的接入方式Quick-start 快速上手了解 cube-ui 的整体接入方式样式体系源码cube-ui 样式入口以及 var 目录 下的全部基础变量定义。赞分享前端UI组件移动开发【免费下载链接】cube-ui:large_orange_diamond: A fantastic mobile ui lib implement by Vue项目地址https://gitcode.com/gh_mirrors/cu/cube-ui点击查看免费下载相关推荐amis 主题定制指南掌握 CSS 变量体系实现页面换肤amis 主题定制指南掌握 CSS 变量体系实现页面换肤 amis 前端低代码框架通过 JSON 配置生成页面其 UI 层 amis ui 包将主题样式前端低代码UI组件Naive UI 主题定制完全指南从暗色主题到主题变量覆盖Naive UI 主题定制完全指南从暗色主题到主题变量覆盖 Naive UI 的全部主题能力都围绕 n config provider 展开默认所有组件为亮前端UI组件Vant Weapp ConfigProvider 全局配置组件通过 CSS 变量定制主题的完整指南Vant Weapp ConfigProvider 全局配置组件通过 CSS 变量定制主题的完整指南 导读 ConfigProvider 是 Vant Wea前端小程序UI组件移动开发上一篇Windows安卓应用安装器技术深度解析APK Installer架构设计与实现原理下一篇Ant Design Tooltip 多彩文字提示colorful实战指南预设色板、自定义颜色与源码实现解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
毕业论文降AI处理中的格式保留技巧与工具选择 1. 毕业论文降AI格式保留的核心痛点每年毕业季,最让学生头疼的不是论文写作本身,而是最后的降AI环节。很多同学发现,辛辛苦苦写好的论文,经过降AI处理后,格式全乱了套。标题层级消失、表格错位、公式变成乱码、参考文献… · 2026/9/25 6:12:41
Keil5同时安装STM32与C51冲突原因及共存方案 1. 为什么Keil5同时装STM32和C51会“打架”?——从许可证机制看根本矛盾我第一次在实验室电脑上装完Keil MDK-ARM v5.38,兴冲冲点开C51安装包准备给老学长的8051课程项目配环境时,弹窗直接把我钉在原地:“Keil C51已检测到现有ARM… · 2026/9/25 6:12:41
皮革废水处理全流程拆解:预处理、生化工艺与排放标准 简介:工业废水处理中,制革行业产生的皮革废水因成分复杂、污染物浓度高,一直是环保工程领域的难点。理解废水特性是工艺设计的基础,其中铬鞣废水中的重金属铬与脱毛浸灰废水中的硫化物是决定处理路线的关键因子。从源头分流预处理… · 2026/9/25 6:12:35
【Coze】在Coze平台使用源码创建工作流 Coze 提供了图形化的工作流搭建平台,适用于低代码构建自动化任务流程。通过资源管理、节点配置与流程连接,可实现多种业务逻辑的在线部署。
本文介绍如何在 Coze 中创建工作流资源、导入流程 JSON 配置,并完成起止节点的连接与字段设置,直至试运行与发布上线的全过程。 文… · 2026/9/25 6:52:07
如何保存网页上的视频资源:猫抓资源嗅探完全指南 如何保存网页上的视频资源:猫抓资源嗅探完全指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch
你在网页里点开一段视频,想… · 2026/9/25 6:52:01
ng-zorro-antd 受控 Checkbox 实战:用 Angular Signal 实现组件联动 UI组件前端 【免费下载链接】ng-zorro-antd Angular UI Component Library based on Ant Design 项目地址: https://gitcode.com/gh_mirrors/ng/ng-zorro-antd 点击查看 免费下载 本文围绕 ng-zorro-antd(Angular UI 组件库)中「受控的 Chec… · 2026/9/25 6:52:01
React-Vis 样式控制完全指南:四种策略与源码级原理 数据可视化图表库前端 【免费下载链接】react-vis Data Visualization Components 项目地址: https://gitcode.com/gh_mirrors/re/react-vis 点击查看 免费下载 本指南围绕 docs/style.md 展开,系统讲解 React-Vis(当前仓库 gh_mirrors/re/r… · 2026/9/25 6:52:01
嵌入式工控机采购避坑指南:宽温、看门狗、电源防护与接口隔离 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 6:52:01
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37