234 lines
5.7 KiB
Vue
234 lines
5.7 KiB
Vue
<template>
|
|
<div class="categories-window-starter" @click="visible = true">
|
|
<img src="../../public/images/menu-icon.png" alt="">
|
|
</div>
|
|
<el-drawer
|
|
class="categories-window"
|
|
size="200"
|
|
direction="ltr"
|
|
v-model="visible"
|
|
>
|
|
<div class="window__body">
|
|
<el-menu
|
|
:popper-offset="0"
|
|
popper-class="categories-window-popper"
|
|
:default-active="menuConfig && menuConfig.uid || null"
|
|
:default-openeds="menuConfig && menuConfig.parent && [menuConfig.parent.uid] || []"
|
|
:show-timeout="0"
|
|
:hide-timeout="0"
|
|
>
|
|
<CategoryChildren
|
|
v-for="category in categories"
|
|
:key="category.uid"
|
|
:index="category.uid"
|
|
:category="category"
|
|
/>
|
|
</el-menu>
|
|
</div>
|
|
</el-drawer>
|
|
</template>
|
|
|
|
<script>
|
|
import CategoryChildren from '@/components/layout/CategoryChildren'
|
|
|
|
export default {
|
|
name: 'CategoriesStarterButton',
|
|
components: { CategoryChildren },
|
|
props: {
|
|
// 栏目树
|
|
categories: {
|
|
required: true
|
|
}
|
|
},
|
|
data () {
|
|
return {
|
|
visible: false
|
|
}
|
|
},
|
|
computed: {
|
|
// 选中的菜单index
|
|
menuConfig () {
|
|
let path = this.$route.path.substring(this.$route.path.lastIndexOf('/') + 1)
|
|
// 首页
|
|
if (this.$route.path === '/') {
|
|
path = 'sy'
|
|
}
|
|
const menuConfig = this.__getMenuConfig(path, 'uid', this.categories)
|
|
if (menuConfig == null) {
|
|
return null
|
|
}
|
|
return menuConfig
|
|
}
|
|
},
|
|
methods: {
|
|
/**
|
|
* 获取菜单配置
|
|
*
|
|
* @param value 唯一标识值
|
|
* @param key 唯一标识key
|
|
* @param menus 查找菜单范围
|
|
* @returns {null|*|null}
|
|
* @private
|
|
*/
|
|
__getMenuConfig (value, key, menus) {
|
|
for (const menu of menus) {
|
|
if (menu[key] === value) {
|
|
return menu
|
|
}
|
|
if (menu.children != null && menu.children.length > 0) {
|
|
const menuConfig = this.__getMenuConfig(value, key, menu.children)
|
|
if (menuConfig != null) {
|
|
return menuConfig
|
|
}
|
|
}
|
|
}
|
|
return null
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss">
|
|
.categories-window {
|
|
--window-body-bg-color: #fff;
|
|
// 菜单样式
|
|
.el-menu {
|
|
--el-menu-bg-color: #fff;
|
|
--el-menu-text-color: var(--font-color);
|
|
--el-menu-hover-bg-color: transparent;
|
|
--el-menu-item-font-size: var(--font-size-base);
|
|
--el-border-color-light: #fff;
|
|
--menu-active-background-color: #e9eaf3;
|
|
--menu-active-text-color: var(--el-menu-text-color);
|
|
|
|
border-right: 0 !important;
|
|
user-select: none;
|
|
background: var(--el-menu-bg-color) !important;
|
|
a {
|
|
color: var(--el-menu-text-color)!important;
|
|
}
|
|
.el-menu-item {
|
|
color: var(--el-menu-text-color) !important;
|
|
background: var(--el-menu-bg-color);
|
|
transition: none;
|
|
// 菜单padding
|
|
a:link {
|
|
width: 100%;
|
|
padding-left: calc(var(--el-menu-base-level-padding) + var(--el-menu-level)* var(--el-menu-level-padding));
|
|
padding: 0 var(--el-menu-base-level-padding);
|
|
box-sizing: border-box;
|
|
}
|
|
.category-icon::before {
|
|
color: var(--el-menu-text-color) !important;
|
|
}
|
|
// 选中状态
|
|
&.is-active {
|
|
background: var(--menu-active-background-color) !important;
|
|
color: var(--menu-active-text-color) !important;
|
|
position: relative;
|
|
}
|
|
// 悬浮
|
|
&:hover {
|
|
background-color: var(--el-menu-hover-bg-color);
|
|
}
|
|
&:focus {
|
|
background: var(--el-menu-hover-bg-color);
|
|
}
|
|
}
|
|
// 子菜单
|
|
.el-sub-menu {
|
|
// 子菜单padding
|
|
a:link {
|
|
padding: 0 var(--el-menu-base-level-padding);
|
|
padding-left: calc(var(--el-menu-base-level-padding) + var(--el-menu-level)* var(--el-menu-level-padding));
|
|
}
|
|
.el-sub-menu__title{
|
|
transition: none;
|
|
color: var(--el-menu-text-color) !important;
|
|
background-color: var(--el-menu-bg-color);
|
|
a:link {
|
|
width: 100%;
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 5px;
|
|
}
|
|
}
|
|
// 选中状态
|
|
&.is-active {
|
|
// 将当前选中目录调整为深色
|
|
.el-sub-menu__title {
|
|
background-color: var(--el-menu-bg-color) !important;
|
|
}
|
|
// 将下一级子菜单的目录调整为深色
|
|
.el-sub-menu {
|
|
.el-sub-menu__title {
|
|
background-color: var(--el-menu-bg-color) !important;
|
|
}
|
|
}
|
|
.el-menu .el-menu-item{
|
|
background-color: var(--el-menu-bg-color);
|
|
// 悬浮
|
|
&:hover {
|
|
background-color: var(--el-menu-hover-bg-color);
|
|
}
|
|
}
|
|
}
|
|
// 菜单上下箭头
|
|
.el-submenu__title i {
|
|
color: #f7f7f7;
|
|
}
|
|
}
|
|
// 移除padding 转移到link 中防止点击padding不跳转
|
|
.el-menu-item {
|
|
padding: 0!important;
|
|
}
|
|
// 为菜单链接时不改变padding
|
|
.el-sub-menu__title {
|
|
a:link:not(.el-sub-menu__title) {
|
|
padding: 0!important;
|
|
}
|
|
}
|
|
// 菜单图标
|
|
.icon {
|
|
position: relative;
|
|
top: -1px;
|
|
color: inherit !important;
|
|
margin-right: 10px;
|
|
}
|
|
}
|
|
.el-drawer__body {
|
|
padding: 0!important;
|
|
}
|
|
.el-drawer__header {
|
|
display: none;
|
|
}
|
|
a:link {
|
|
color: var(--el-menu-text-color)!important;
|
|
}
|
|
}
|
|
</style>
|
|
|
|
<style scoped lang="scss">
|
|
.categories-window {
|
|
.window__body {
|
|
height: 100%;
|
|
background-color: var(--window-body-bg-color);
|
|
}
|
|
}
|
|
// 窗口启动器
|
|
.categories-window-starter {
|
|
background-color: #FFFFFF;
|
|
height: 32px;
|
|
width: 55px;
|
|
background: var(--color-white);
|
|
border-radius: 5px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
img {
|
|
height: 20px;
|
|
width: 30px;
|
|
}
|
|
}
|
|
</style>
|