2025-12-04 10:04:21 +08:00

133 lines
3.2 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!-- layouts/default.vue -->
<template>
<div class="layout">
<FlashBanner />
<!-- 迷你侧栏固定 56px粘左 -->
<aside class="sidebar">
<SidebarMini />
</aside>
<!-- 主列TopNav + 页面内容 -->
<div class="main">
<TopNav class="TopNav-clss"/>
<div class="page">
<slot />
</div>
</div>
</div>
</template>
<script setup lang="ts">
import SidebarMini from '../components/SidebarMini.vue'
import TopNav from '../components/TopNav.vue'
import FlashBanner from '../components/FlashBanner.vue'
</script>
<style scoped>
/* ===== 基础布局 ===== */
.layout{
display: flex;
min-height: 100vh;
background: #fff;
color: #111827;
}
/* 左侧栏 */
.sidebar{
position: sticky;
top: 0;
height: 66vh;
width: 80px; /* 24px left + 80px width + 24px gap */
flex: 0;
/* border-right: 1px solid #eef0f3; */ /* Removed border */
background: transparent; /* Made transparent */
/* backdrop-filter: blur(6px); */
/* -webkit-backdrop-filter: blur(6px); */
z-index: 20;
}
/* 右侧主列TopNav + 页面内容 垂直排列 */
.main{
/* 与 TopNav 内部保持一致的导航高度变量 */
--nav-h: 64px;
flex: 1 1 auto;
min-width: 0; /* 防止内容把布局挤炸 */
display: flex;
flex-direction: column;
position: relative;
}
/* 页面内容区 */
.page{
flex: 1 1 auto;
min-width: 0;
}
/* ===== 提供给页面用的通用钩子(不强制页面必须用) ===== */
.page :deep(.content-wrap){
max-width: 1200px;
width: 100%;
margin-inline: auto;
padding: 32px 24px;
}
/* 英雄区与透明导航重叠:向上顶 nav 高度,并把内边距补回来 */
.page :deep(.hero-section){
margin-top: calc(-1 * var(--nav-h)); /* 顶到导航背后 */
padding: calc(56px + var(--nav-h)) 24px 56px; /* 顶部补回导航高度 */
border-radius: 0 0 24px 24px;
background:
radial-gradient(1200px 600px at 60% 10%, rgba(106,110,255,.25), transparent 60%),
linear-gradient(180deg,#eef2ff 0%, #fff 40%);
}
.TopNav-clss{
position: absolute;
width: 99.5%;
}
/* 去掉页面首个标题/容器默认外边距导致的缝隙(不要覆盖 .hero-section 的负 margin */
.page :deep(h1:first-child),
.page :deep(.content-wrap){
margin-top: 0;
}
/* ===== 体验优化(可留可去) ===== */
/* 锚点滚动时不被导航遮住 */
:global(:root){
scroll-padding-top: 64px; /* 与 --nav-h 保持一致 */
}
/* iOS 刘海安全区 */
.page :deep(.content-wrap){ padding-top: max(32px, env(safe-area-inset-top)); }
/* ===== 小屏优化 (Mobile Bottom Nav) ===== */
@media (max-width: 640px){
.layout {
flex-direction: column;
}
.sidebar {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
height: 64px; /* Bottom Nav Height */
flex: 0 0 auto;
border-right: none;
border-top: 1px solid rgba(0,0,0,0.05);
background: rgba(255,255,255,0.9);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
}
.main {
padding-bottom: 64px; /* Space for bottom nav */
}
.page :deep(.content-wrap),
.page :deep(.hero-section){
padding-left: 16px;
padding-right: 16px;
}
}
</style>