layout修改

master
toesbieya 6 years ago
parent 31732fdf1f
commit f2e869d650
  1. 13
      vue/src/layout/component/Aside/component/Mask.vue
  2. 60
      vue/src/layout/component/Aside/index.vue
  3. 16
      vue/src/layout/component/Aside/style.scss
  4. 76
      vue/src/layout/index.vue
  5. 25
      vue/src/layout/mixin/resize.js

@ -0,0 +1,13 @@
<script type="text/jsx">
export default {
data: () => ({show: false}),
render() {
return (
<transition name="el-fade-in-linear">
{this.show && <div class="aside-hidden-mask" on-click={this.onClick}/>}
</transition>
)
}
}
</script>

@ -1,8 +1,10 @@
<script type="text/jsx"> <script type="text/jsx">
import Vue from 'vue'
import actionOnSelectMenuMixin from "@/layout/mixin/actionOnSelectMenu" import actionOnSelectMenuMixin from "@/layout/mixin/actionOnSelectMenu"
import {getters as mainGetters} from "@/layout/store/main" import {getters as mainGetters} from "@/layout/store/main"
import {getters as settingGetters, mutations as settingMutations} from "@/layout/store/setting" import {getters as settingGetters, mutations as settingMutations} from "@/layout/store/setting"
import Logo from './component/Logo' import Logo from './component/Logo'
import Mask from "./component/Mask"
import SidebarItem from './component/SidebarItem' import SidebarItem from './component/SidebarItem'
export default { export default {
@ -47,12 +49,17 @@ export default {
|| this.sidebarCollapse && this.device === 'mobile' || this.sidebarCollapse && this.device === 'mobile'
}, },
sidebarClass() { //
showHiddenMask() {
return !this.sidebarCollapse && this.device === 'mobile'
},
asideClass() {
return { return {
'sidebar-container': true, 'aside': true,
'mobile': this.device === 'mobile', 'mobile': this.device === 'mobile',
'collapse-sidebar': this.collapse, 'collapse': this.collapse,
'hide-sidebar': this.hideSidebar 'hide': this.hideSidebar
} }
} }
}, },
@ -78,6 +85,15 @@ export default {
} }
}, },
//
device: {
immediate: true,
handler(v) {
v === 'mobile' && this.collapseSidebar()
}
},
//
activeRootMenu: { activeRootMenu: {
immediate: true, immediate: true,
handler(v) { handler(v) {
@ -94,13 +110,14 @@ export default {
}, },
// //
hideSidebar: { hideSidebar(v) {
immediate: true,
handler(v) {
if (!this.sidebarAutoHidden) return if (!this.sidebarAutoHidden) return
const method = `${v ? 'add' : 'remove'}EventListener` const method = `${v ? 'add' : 'remove'}EventListener`
document[method]('mousemove', this.moveEvent) document[method]('mousemove', this.moveEvent)
} },
showHiddenMask(v) {
this.maskInstance.show = v
} }
}, },
@ -128,11 +145,34 @@ export default {
this.device === 'mobile' && settingMutations.sidebarCollapse(true) this.device === 'mobile' && settingMutations.sidebarCollapse(true)
jump && this.actionOnSelectMenu(index) jump && this.actionOnSelectMenu(index)
},
collapseSidebar(e) {
if (e) {
e.preventDefault()
e.stopPropagation()
}
settingMutations.sidebarCollapse(true)
} }
}, },
beforeDestroy() { mounted() {
if (this.sidebarAutoHidden) {
document.addEventListener('mousemove', this.moveEvent)
}
//
const MaskConstructor = Vue.extend(Mask)
this.maskInstance = new MaskConstructor().$mount()
this.maskInstance.onClick = this.collapseSidebar
document.body.appendChild(this.maskInstance.$el)
this.$once('hook:beforeDestroy', () => {
document.removeEventListener('mousemove', this.moveEvent) document.removeEventListener('mousemove', this.moveEvent)
document.body.removeChild(this.maskInstance.$el)
this.maskInstance.$destroy()
})
}, },
render() { render() {
@ -161,7 +201,7 @@ export default {
return ( return (
<aside <aside
class={this.sidebarClass} class={this.asideClass}
on-mouseenter={() => this.mouseOutside = false} on-mouseenter={() => this.mouseOutside = false}
on-mouseleave={() => this.mouseOutside = true} on-mouseleave={() => this.mouseOutside = true}
> >

@ -2,7 +2,7 @@
$iconSize: 16px; $iconSize: 16px;
.sidebar-container { .aside {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
width: $side-bar-width; width: $side-bar-width;
@ -20,7 +20,7 @@ $iconSize: 16px;
} }
//折叠设置 //折叠设置
&.collapse-sidebar { &.collapse {
width: $iconSize + 20px * 2; width: $iconSize + 20px * 2;
.sidebar-item-content { .sidebar-item-content {
@ -29,7 +29,7 @@ $iconSize: 16px;
} }
//自动隐藏 //自动隐藏
&.hide-sidebar { &.hide {
width: 0; width: 0;
pointer-events: none; pointer-events: none;
transform: translateX(-$side-bar-width); transform: translateX(-$side-bar-width);
@ -134,6 +134,16 @@ $iconSize: 16px;
} }
} }
.aside-hidden-mask {
background: rgba(0, 0, 0, .5);
backdrop-filter: blur(10px);
height: 100vh;
width: 100vw;
top: 0;
position: fixed;
z-index: 9;
}

@ -1,60 +1,64 @@
<template> <script type="text/jsx">
<section class="app-wrapper">
<v-aside/>
<section :class="containerClass">
<v-header/>
<v-main/>
</section>
<!--移动端侧边栏展开时的遮罩-->
<transition name="el-fade-in-linear">
<div v-if="showSidebarMask" class="drawer-bg" @click.stop.prevent="collapseSidebar"/>
</transition>
</section>
</template>
<script>
import offlineMixin from './mixin/offline' import offlineMixin from './mixin/offline'
import resizeMixin from './mixin/resize'
import VAside from './component/Aside' import VAside from './component/Aside'
import VHeader from './component/Header' import VHeader from './component/Header'
import VMain from './component/Main' import VMain from './component/Main'
import {getters as mainGetters} from "@/layout/store/main" import {getters as mainGetters, mutations as mainMutations} from "@/layout/store/main"
import {getters as settingGetters, mutations as settingMutations} from "@/layout/store/setting" import {getters as settingGetters} from "@/layout/store/setting"
import {isMobile} from "@/util/browser"
import {debounce} from "@/util"
export default { export default {
name: 'Layout', name: 'Layout',
mixins: [offlineMixin, resizeMixin], mixins: [offlineMixin],
components: {VAside, VHeader, VMain}, components: {VAside, VHeader, VMain},
computed: { computed: {
device: () => mainGetters.device,
hasNav: () => mainGetters.hasNav, hasNav: () => mainGetters.hasNav,
useTagsView: () => settingGetters.useTagsView, useTagsView: () => settingGetters.useTagsView,
sidebarCollapse: () => settingGetters.sidebarCollapse,
containerClass() { containerClass() {
return { return {
'main-container': true, 'main-container': true,
'has-nav': this.hasNav, 'has-nav': this.hasNav,
'has-tags-view': this.useTagsView 'has-tags-view': this.useTagsView
} }
},
showSidebarMask() {
return !this.sidebarCollapse && this.device === 'mobile'
} }
}, },
methods: { methods: {
collapseSidebar() { $_resizeHandler() {
settingMutations.sidebarCollapse(true) if (!document.hidden) {
const mobile = isMobile()
mainMutations.device(mobile ? 'mobile' : 'pc')
} }
} }
},
mounted() {
this.$_resizeHandler = debounce(this.$_resizeHandler)
this.$_resizeHandler()
window.addEventListener('resize', this.$_resizeHandler)
this.$once('hook:beforeDestroy', () => {
window.removeEventListener('resize', this.$_resizeHandler)
})
},
render() {
return (
<section class="app-wrapper">
<v-aside/>
<section class={this.containerClass}>
<v-header/>
<v-main/>
</section>
</section>
)
}
} }
</script> </script>
@ -65,16 +69,6 @@ export default {
height: 100%; height: 100%;
width: 100%; width: 100%;
.drawer-bg {
background: rgba(0, 0, 0, .5);
backdrop-filter: blur(10px);
width: 100%;
top: 0;
height: 100%;
position: fixed;
z-index: 9;
}
.main-container { .main-container {
display: flex; display: flex;
flex: 1; flex: 1;

@ -1,25 +0,0 @@
import {mutations as mainMutations} from "@/layout/store/main"
import {debounce} from '@/util'
import {isMobile} from "@/util/browser"
export default {
methods: {
$_resizeHandler() {
if (!document.hidden) {
const mobile = isMobile()
mainMutations.device(mobile ? 'mobile' : 'pc')
mobile && this.collapseSidebar()
}
}
},
mounted() {
this.$_resizeHandler = debounce(this.$_resizeHandler)
this.$_resizeHandler()
window.addEventListener('resize', this.$_resizeHandler)
this.$once('hook:beforeDestroy', () => {
window.removeEventListener('resize', this.$_resizeHandler)
})
}
}
Loading…
Cancel
Save