LeftTopMode.vue 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <script lang="ts" setup>
  2. import { computed } from "vue"
  3. import { storeToRefs } from "pinia"
  4. import { useAppStore } from "@/store/modules/app"
  5. import { useSettingsStore } from "@/store/modules/settings"
  6. import { AppMain, NavigationBar, Sidebar, TagsView, Logo } from "./components"
  7. const appStore = useAppStore()
  8. const settingsStore = useSettingsStore()
  9. const { showTagsView, showLogo } = storeToRefs(settingsStore)
  10. /** 定义计算属性 layoutClasses,用于控制布局的类名 */
  11. const layoutClasses = computed(() => {
  12. return {
  13. hideSidebar: !appStore.sidebar.opened
  14. }
  15. })
  16. </script>
  17. <template>
  18. <div :class="layoutClasses" class="app-wrapper">
  19. <!-- 头部导航栏和标签栏 -->
  20. <div class="fixed-header layout-header">
  21. <Logo v-if="showLogo" :collapse="false" class="logo" />
  22. <div class="content">
  23. <NavigationBar />
  24. <TagsView v-show="showTagsView" />
  25. </div>
  26. </div>
  27. <!-- 主容器 -->
  28. <div :class="{ hasTagsView: showTagsView }" class="main-container">
  29. <!-- 左侧边栏 -->
  30. <Sidebar class="sidebar-container" />
  31. <!-- 页面主体内容 -->
  32. <AppMain class="app-main" />
  33. </div>
  34. </div>
  35. </template>
  36. <style lang="scss" scoped>
  37. @import "@/styles/mixins.scss";
  38. $transition-time: 0.35s;
  39. .app-wrapper {
  40. @extend %clearfix;
  41. width: 100%;
  42. }
  43. .fixed-header {
  44. position: fixed;
  45. top: 0;
  46. z-index: 1002;
  47. width: 100%;
  48. display: flex;
  49. .logo {
  50. width: var(--v3-sidebar-width);
  51. }
  52. .content {
  53. flex: 1;
  54. position: relative;
  55. }
  56. }
  57. .layout-header {
  58. background-color: var(--v3-header-bg-color);
  59. box-shadow: var(--el-box-shadow-lighter);
  60. }
  61. .main-container {
  62. min-height: 100%;
  63. }
  64. .sidebar-container {
  65. transition: width $transition-time;
  66. width: var(--v3-sidebar-width) !important;
  67. height: 100%;
  68. position: fixed;
  69. left: 0;
  70. z-index: 1001;
  71. overflow: hidden;
  72. padding-top: var(--v3-navigationbar-height);
  73. }
  74. .app-main {
  75. transition: padding-left $transition-time;
  76. padding-top: var(--v3-navigationbar-height);
  77. padding-left: var(--v3-sidebar-width);
  78. height: 100vh;
  79. overflow: auto;
  80. }
  81. .hideSidebar {
  82. .sidebar-container {
  83. width: var(--v3-sidebar-hide-width) !important;
  84. }
  85. .app-main {
  86. padding-left: var(--v3-sidebar-hide-width);
  87. }
  88. }
  89. .hasTagsView {
  90. .sidebar-container {
  91. padding-top: var(--v3-header-height);
  92. }
  93. .app-main {
  94. padding-top: var(--v3-header-height);
  95. }
  96. }
  97. </style>