|
|
<template> <div :class="classObj" class="app-wrapper"> <div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside" /> <div :class="{'fixed-header':fixedHeader}"> <navbar /> <!-- <tags-view v-if="needTagsView" /> --> </div> <div :class="{hasTagsView:needTagsView}" class="main-container"> <div class="main-breadcrumb"> <hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" /> <breadcrumb id="breadcrumb-container" class="breadcrumb-container" /> </div> <app-main /> <right-panel v-if="showSettings"> <settings /> </right-panel> </div> <sidebar class="sidebar-container" /> <!-- 防止刷新后主题丢失 --> <Theme v-show="false" ref="theme" /> </div> </template>
<script> import RightPanel from '@/components/RightPanel' import Breadcrumb from '@/components/Breadcrumb' import Hamburger from '@/components/Hamburger' import { AppMain, Navbar, Settings, Sidebar } from './components' import ResizeMixin from './mixin/ResizeHandler' import { mapState } from 'vuex' import Theme from '@/components/ThemePicker' import Cookies from 'js-cookie' export default { name: 'Layout', components: { AppMain, Navbar, RightPanel, Settings, Sidebar, // TagsView,
Breadcrumb, Hamburger, Theme }, mixins: [ResizeMixin], computed: { ...mapState({ sidebar: state => state.app.sidebar, device: state => state.app.device, showSettings: state => state.settings.showSettings, needTagsView: state => state.settings.tagsView, fixedHeader: state => state.settings.fixedHeader }), classObj() { return { hideSidebar: !this.sidebar.opened, openSidebar: this.sidebar.opened, withoutAnimation: this.sidebar.withoutAnimation, mobile: this.device === 'mobile' } } }, mounted() { if (Cookies.get('theme')) { this.$refs.theme.theme = Cookies.get('theme') this.$store.dispatch('settings/changeSetting', { key: 'theme', value: Cookies.get('theme') }) } }, methods: { handleClickOutside() { this.$store.dispatch('app/closeSideBar', { withoutAnimation: false }) }, toggleSideBar() { this.$store.dispatch('app/toggleSideBar') } } } </script>
<style lang="scss" scoped> @import "~@/assets/styles/mixin.scss"; @import "~@/assets/styles/variables.scss";
.app-wrapper { @include clearfix; position: relative; height: 100%; width: 100%;
&.mobile.openSidebar { position: fixed; top: 0; } }
.drawer-bg { background: #000; opacity: 0.3; width: 100%; top: 0; height: 100%; position: absolute; z-index: 999; }
.fixed-header { position: fixed; top: 0; right: 0; z-index: 999; // width: calc(100% - #{$sideBarWidth});
width: 100%; transition: width 0.28s; padding: 0; background-color: $menuBg; box-shadow: 5px 2px 10px 1px rgba(15,164,222,0.16); }
.mobile .fixed-header { width: 100%; }
.main-breadcrumb{ position: fixed; top: 100px; left: calc(100% - $sideBarWidth); display: flex; justify-content:flex-start; width: 100%; background-color: $mainContainerBg; box-shadow: 0px 0px 6px 1px rgba(15,164,222,0.16); z-index: 100; .hamburger-container { line-height: 46px; height: 100%; cursor: pointer; transition: background .3s; -webkit-tap-highlight-color:transparent; &:hover { background: rgba(0, 0, 0, .025) } } } </style>
|