文件位置:src/settings.js
export default { // ... /** * 侧边栏主题 深色主题theme-dark,浅色主题theme-light,蓝色主题theme-blue,炫彩主题theme-shine */ sideTheme: 'theme-blue', // ... }
文件位置:src/assets/images/blue.svg
复制同级的 light.svg 修改名称即可,将两个颜色替换为:#409eff
文件位置:src/layout/components/Settings/index.vue
template模板中添加控件如下
新增一个主题风格选项,主要注意的是handleTheme里面的传参(后面会用到)和img的src图片,例如实例中的blue.svg
文件位置:src/assets/styles/variables.module.scss
// 默认菜单主题风格 $base-menu-blue-color: rgba(0, 0, 0, 0.7); $base-menu-blue-background: #ffffff; $base-logo-blue-title-color: #ffffff; $base-menu-shine-color: #ffffff; $base-menu-shine-background: rgba(0, 0, 0, 0); $base-logo-shine-title-color: #ffffff; // ... // 顶部菜单主题风格 $base-navbar-color: #999093; $base-navbar-icon-color: #5a5e66; $base-navbar-background: #ffffff; $base-navbar-blue-color: #ffffff; $base-navbar-blue-background: #409eff; $base-navbar-shine-color: #ffffff; $base-navbar-shine-background: rgba(0, 0, 0, 0); // ... :export { menuBlueColor: $base-menu-blue-color; menuBlueBackground: $base-menu-blue-background; logoBlueTitleColor: $base-logo-blue-title-color; menuShineColor: $base-menu-shine-color; menuShineBackground: $base-menu-shine-background; logoShineTitleColor: $base-logo-shine-title-color; navbarColor: $base-navbar-color; navbarIconColor: $base-navbar-icon-color; navbarBlueColor: $base-navbar-blue-color; navbarShineColor: $base-navbar-shine-color; navbarBackground: $base-navbar-background; navbarBlueBackground: $base-navbar-blue-background; navbarShineBackground: $base-navbar-shine-background; // ... }
同级文件:sidebar.scss
左侧menu菜单的背景色和悬停样式
//新增样式,大概在112行 & .theme-blue .nest-menu .el-sub-menu > .el-sub-menu__title, & .theme-blue .el-sub-menu .el-menu-item { background-color: $base-menu-blue-background !important; &:hover { color: $base-navbar-blue-color; background-color: $base-navbar-blue-background !important; } }
JS核心内容如下,若没有需手动添加。
import variables from '@/assets/styles/variables.module.scss' import useSettingsStore from '@/store/modules/settings' const settingsStore = useSettingsStore(); const sideTheme = computed(() => settingsStore.sideTheme);
文件位置:src/layout/components/Sidebar/Logo.vue
主要修改几个动态的style
![]()
{{ title }}
![]()
{{ title }}
文件位置:src/layout/components/Sidebar/index.vue
样式文件专门对该组件进行了修改:src/assets/styles/sidebar.scss,若对侧边栏进行修改实现不了时,可查看是否是这里的问题,里面用了好多!important定义样式。
文件位置:src/layout/components/Navbar.vue
添加了一个动态style,
头像右边的el-icon组件,添加了color属性
该文件下没有使用过主题名称匹配,需手动引入
该组件还引用了一些子组件,都需要对主题名称进行匹配
针对组件中使用到的svg-icon图标组件,修改如下:
组件都在src/components目录下,以文档地址图标为例,其他类似。
最后,是对面包屑导航的处理
对span标签 a标签,添加动态style
{{ item.meta.title }} {{ item.meta.title }}
炫彩主题与自定义主题方法类似。只是将他们的背景色去掉。
这里提供一种添加炫彩主题的思路
找一张图片,放入位置:src/assets/images/theme-bg.jpg
文件位置:src/layout/components/Settings/index.vue
为了样式美观,给img标签添加了style属性,svg图标填充颜色设为白色:fill='#ffffff'
炫彩主题需要背景色透明,不能实现固定header
固定 Header
核心代码:
页面加载时向body元素中插入一个img元素,切换主题时控制img元素的显示/隐藏。
handleTheme()是主题切换时触发的函数。
import exampleImg from 'https://blog.csdn.net/qq_51532249/article/details/@/assets/images/theme-bg.jpg' // ... // 在body下插入一个img元素,作为炫彩主题的背景 const body = document.querySelector('body'); const img = document.createElement('img'); img.setAttribute('src', exampleImg); img.style.minWidth = '100%'; img.style.minHeight = '100%'; img.style.position = 'fixed'; img.style.left = '0'; img.style.top = '0'; img.style.zIndex = '-1'; // 获取当前主题名称,若当不是炫彩主题,将其隐藏 if (settingsStore.sideTheme !== 'theme-shine') { img.style.display = 'none'; } body.appendChild(img); function handleTheme(val) { // 选中炫彩主题,并且背景图为隐藏状态 if (val == 'theme-shine' && img.style.display == 'none') { img.style.display = 'inline-block'; // 炫彩主题需要背景色透明,不能实现固定header fixedHeader.value = false; } else { img.style.display = 'none'; } settingsStore.changeSetting({ key: 'sideTheme', value: val }) sideTheme.value = val; } // ...
剩下的修改的地方与上面类似。
下面是炫彩主题特有的:
文件位置:src/layout/components/AppMain.vue
添加动态style属性
样式修改如下:主要是让.app-main控件看着更舒服
组件位置:src/components/TopNav/index.vue
添加两个动态:background-color属性
(这里改的比较粗糙,用到的时候再详细修改)
更多菜单
文件位置:src/layout/components/TagsView/index.vue
添加动态style属性。
补充非显示页面的标签样式
// ... import variables from '@/assets/styles/variables.module.scss' const settingsStore = useSettingsStore(); const sideTheme = computed(() => settingsStore.sideTheme); // ... function activeStyle(tag) { if (!isActive(tag)) return { 'color': sideTheme.value === 'theme-shine' ? variables.navbarShineColor : '', 'background-color': sideTheme.value === 'theme-shine' ? variables.navbarShineBackground : '' }; return { "background-color": theme.value, "border-color": theme.value }; }
好了,圆满结束。
上一篇:jQuery-选择器