diff --git a/src/assets/emptyMap.png b/src/assets/emptyMap.png new file mode 100644 index 0000000..e720d9b Binary files /dev/null and b/src/assets/emptyMap.png differ diff --git a/src/assets/font/YouSheBiaoTiYuan.otf b/src/assets/font/YouSheBiaoTiYuan.otf new file mode 100644 index 0000000..31e2b4e Binary files /dev/null and b/src/assets/font/YouSheBiaoTiYuan.otf differ diff --git a/src/assets/font/YouSheBiaoTiYuan.ttf b/src/assets/font/YouSheBiaoTiYuan.ttf new file mode 100644 index 0000000..f753eb5 Binary files /dev/null and b/src/assets/font/YouSheBiaoTiYuan.ttf differ diff --git a/src/assets/font/YousheBiaoTiHei.css b/src/assets/font/YousheBiaoTiHei.css new file mode 100644 index 0000000..7b9979e --- /dev/null +++ b/src/assets/font/YousheBiaoTiHei.css @@ -0,0 +1,8 @@ + @font-face { + /*给字体命名*/ + font-family: 'YouSheBiaoTiHei'; + /*引入字体文件*/ + src: url('./YouSheBiaoTiHei.ttf'); + font-weight: normal; + font-style: normal; + } \ No newline at end of file diff --git a/src/assets/font/YousheBiaoTiHei.ttf b/src/assets/font/YousheBiaoTiHei.ttf new file mode 100644 index 0000000..3729151 Binary files /dev/null and b/src/assets/font/YousheBiaoTiHei.ttf differ diff --git a/src/assets/font/YousheBiaoTiYuan.css b/src/assets/font/YousheBiaoTiYuan.css new file mode 100644 index 0000000..2788244 --- /dev/null +++ b/src/assets/font/YousheBiaoTiYuan.css @@ -0,0 +1,8 @@ + @font-face { + /*给字体命名*/ + font-family: 'YouSheBiaoTiYuan'; + /*引入字体文件*/ + src: url('./YouSheBiaoTiYuan.ttf'); + font-weight: normal; + font-style: normal; + } \ No newline at end of file diff --git a/src/assets/robot-marker-8x.png b/src/assets/robot-marker-8x.png new file mode 100644 index 0000000..868dc41 Binary files /dev/null and b/src/assets/robot-marker-8x.png differ diff --git a/src/assets/底部-1.png b/src/assets/底部-1.png new file mode 100644 index 0000000..f0cbf0b Binary files /dev/null and b/src/assets/底部-1.png differ diff --git a/src/assets/底部-2.png b/src/assets/底部-2.png new file mode 100644 index 0000000..5759d0e Binary files /dev/null and b/src/assets/底部-2.png differ diff --git a/src/assets/底部-3.png b/src/assets/底部-3.png new file mode 100644 index 0000000..9a106c6 Binary files /dev/null and b/src/assets/底部-3.png differ diff --git a/src/assets/底部-4.png b/src/assets/底部-4.png new file mode 100644 index 0000000..6d70cb3 Binary files /dev/null and b/src/assets/底部-4.png differ diff --git a/src/assets/底部-5.png b/src/assets/底部-5.png new file mode 100644 index 0000000..ee09f34 Binary files /dev/null and b/src/assets/底部-5.png differ diff --git a/src/assets/底部.png b/src/assets/底部.png new file mode 100644 index 0000000..3e0bc1d Binary files /dev/null and b/src/assets/底部.png differ diff --git a/src/assets/管廊巡检机器人综合管理平台.png b/src/assets/管廊巡检机器人综合管理平台.png new file mode 100644 index 0000000..ade9ab3 Binary files /dev/null and b/src/assets/管廊巡检机器人综合管理平台.png differ diff --git a/src/style.less b/src/style.less index 85ea68a..409aca3 100644 --- a/src/style.less +++ b/src/style.less @@ -1,3 +1,20 @@ +// 大屏设计稿字体:优设标题黑 / 优设标题圆 +@font-face { + font-family: "YouSheBiaoTiHei"; + src: url("./assets/font/YousheBiaoTiHei.ttf") format("truetype"); + font-weight: 400; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "YouSheBiaoTiYuan"; + src: url("./assets/font/YouSheBiaoTiYuan.ttf") format("truetype"); + font-weight: 400; + font-style: normal; + font-display: swap; +} + :root { font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; line-height: 1.5; diff --git a/src/views/dashboard1/assets/循环背景.png b/src/views/dashboard1/assets/循环背景.png new file mode 100644 index 0000000..8e0f83f Binary files /dev/null and b/src/views/dashboard1/assets/循环背景.png differ diff --git a/src/views/dashboard1/index.less b/src/views/dashboard1/index.less index eeac75a..c4c4f68 100644 --- a/src/views/dashboard1/index.less +++ b/src/views/dashboard1/index.less @@ -28,20 +28,26 @@ auto, auto; + // 顶部标题:使用导出的标题整图(1167x81,按设计稿高度 45px 等比展示) &:before { - content: "管廊巡检机器人综合管理平台"; - color: #fff; - letter-spacing: 12px; - font-size: 36px; - line-height: 70px; - width: 100%; - font-weight: bold; + content: ""; position: absolute; - text-align: center; + top: 20px; + left: 50%; + transform: translateX(-50%); + width: 560px; + height: 39px; + z-index: 10; + background-image: url("../../assets/管廊巡检机器人综合管理平台.png"); + background-repeat: no-repeat; + background-position: center; + background-size: 100% 100%; + pointer-events: none; } } .background { + display: block; position: relative; z-index: -1; width: 100%; @@ -60,9 +66,10 @@ height: 100%; } + // 页面内容区边距与大屏(监管中心)保持一致:上 87 / 左右 24 / 下 60(避开底部导航) .page-shell { height: 100%; - padding: 7.8% 34px 7%; + padding: 87px 24px 60px; box-sizing: border-box; } @@ -105,26 +112,23 @@ box-sizing: border-box; } - .management-page { - padding-top: 8.5%; - padding-left: 42px; - padding-right: 42px; - } - - .alarm-page, - .plan-page, - .report-page { - padding-left: 42px; - padding-right: 42px; + // 各页面统一沿用 .page-shell 的边距,不再单独覆盖 + + // 视频中心 / 统计分析页:内容区左右再留 14px,与大屏内容区保持一致 + .video-center-layout, + .report-main-grid { + margin: 0 14px; } + // 面板背景与大屏内容区统一:半透明渐变 + 背景模糊 .page-card { min-height: 0; padding: 22px 24px; - background: - linear-gradient(180deg, rgba(8, 29, 60, 0.78) 0%, rgba(5, 18, 39, 0.62) 100%); - border: 1px solid rgba(86, 198, 255, 0.16); - box-shadow: inset 0 0 24px rgba(46, 144, 224, 0.08); + background: linear-gradient(0deg, + rgba(0, 83, 132, 0.3) 0%, + rgba(0, 83, 132, 0) 97.3%); + border: 1px solid rgba(86, 205, 255, 0.12); + box-shadow: 0 0 18px 0 rgba(0, 10, 24, 0.32); backdrop-filter: blur(4px); } @@ -141,13 +145,12 @@ display: flex; flex-direction: column; padding: 24px 28px 22px; - background: - linear-gradient(180deg, rgba(10, 38, 74, 0.88) 0%, rgba(5, 18, 39, 0.8) 100%); - border: 1px solid rgba(93, 208, 255, 0.2); - box-shadow: - inset 0 0 32px rgba(42, 142, 221, 0.08), - 0 0 0 1px rgba(17, 75, 122, 0.35), - 0 18px 42px rgba(3, 12, 24, 0.3); + background: linear-gradient(0deg, + rgba(0, 83, 132, 0.3) 0%, + rgba(0, 83, 132, 0) 97.3%); + border: 1px solid rgba(86, 205, 255, 0.12); + box-shadow: 0 0 18px 0 rgba(0, 10, 24, 0.32); + backdrop-filter: blur(4px); overflow: hidden; } @@ -636,11 +639,7 @@ grid-template-columns: 1.2fr 0.8fr; } - .video-center-shell { - padding-top: 7.4%; - padding-left: 42px; - padding-right: 42px; - } + // 视频中心同样沿用统一的页面边距 .video-center-layout { height: 100%; @@ -1164,10 +1163,7 @@ white-space: nowrap; } - .report-dashboard-page { - padding-left: 42px; - padding-right: 42px; - } + // 统计分析页同样沿用统一的页面边距 .report-dashboard { height: 100%; @@ -1511,50 +1507,51 @@ font-weight: 700; } - .btn-group { - position: absolute; - top: 5%; - display: flex; - justify-content: center; - left: 50%; - gap: 100%; - transform: translateX(-50%); - - .left { - display: flex; - justify-content: space-between; - gap: 30px; - } - - .right { - display: flex; - justify-content: space-between; - gap: 30px; - } - } - + // 监管中心布局:顶部通栏地图 + 底部四列等高面板(对应设计稿坐标) .center { height: 100%; - display: flex; + box-sizing: border-box; + // 底部留白,避免面板被底部导航遮挡 + padding: 87px 24px 60px; + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + // 第一行地图区 356,第二行面板区占满剩余高度,四张卡片自动等高 + grid-template-rows: 356px minmax(0, 1fr); + column-gap: 16px; + row-gap: 11px; .middle { - width: 50%; - height: 100%; + grid-column: 1 / -1; + grid-row: 1; + width: 100%; + // 地图面板:标题样式与其他面板保持一致(复用 card- 前缀样式) .nav-map-panel { - margin: calc(8.5% + 40px) auto 0; - width: 92%; - height: 74%; + margin: 0; + width: 100%; + height: 100%; display: flex; flex-direction: column; - padding: 18px 22px 16px; - background: linear-gradient( - 180deg, - rgba(7, 23, 48, 0.76) 0%, - rgba(4, 16, 34, 0.58) 100% - ); - border: 1px solid rgba(95, 204, 255, 0.18); - box-shadow: inset 0 0 24px rgba(45, 144, 224, 0.08); + } + + // 地图卡标题背景与设备列表等卡片完全一致: + // 标题底图按单卡宽度(456px,即底部各卡实际宽度)铺贴,避免通栏拉伸变形 + .card-map { + background-size: + 456px auto, + 456px auto, + 100%, + 456px auto; + background-position: + top left, + top left, + 20px 40px, + top left; + } + + .card-map .title { + flex: none; + margin-bottom: 10px; } .nav-map-header { @@ -1582,15 +1579,116 @@ position: relative; flex: 1; overflow: hidden; - background: - radial-gradient(circle at 50% 58%, rgba(46, 163, 224, 0.12), transparent 34%), - linear-gradient(180deg, rgba(6, 18, 31, 0.96) 0%, rgba(3, 10, 22, 0.98) 100%); + // 内容区左右(及底部)留出与其它卡片一致的内缩距离 + margin: 0 14px 12px; + // 内容区背景:半透明渐变 + 背景模糊(对应设计稿 fill) + background: linear-gradient(0deg, + rgba(0, 83, 132, 0.3) 0%, + rgba(0, 83, 132, 0) 97.3%); + backdrop-filter: blur(4px); border: 1px solid rgba(82, 191, 255, 0.16); + transition: inset 0.2s ease; box-shadow: inset 0 0 38px rgba(24, 92, 140, 0.18), inset 0 -46px 72px rgba(0, 0, 0, 0.34); } + // 预览遮罩:压暗背景并轻微模糊 + .map-preview-mask { + position: fixed; + inset: 0; + z-index: 80; + background: rgba(2, 8, 18, 0.72); + backdrop-filter: blur(3px); + animation: mapPreviewMaskIn 0.2s ease-out; + } + + @keyframes mapPreviewMaskIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } + } + + // 地图放大预览:全屏展示地图 + .nav-map-stage.preview-mode { + position: fixed; + inset: 0; + z-index: 90; + box-sizing: border-box; + margin: 0; + padding-top: 0; + background: rgba(3, 12, 24, 0.99); + border: none; + box-shadow: none; + animation: mapPreviewIn 0.22s ease-out; + } + + @keyframes mapPreviewIn { + from { + opacity: 0; + transform: scale(0.985); + } + + to { + opacity: 1; + transform: scale(1); + } + } + + .map-preview-btn { + position: absolute; + z-index: 6; + right: 14px; + top: 10px; + width: 30px; + height: 28px; + padding: 0; + display: flex; + align-items: center; + justify-content: center; + border: 1px solid rgba(86, 205, 255, 0.22); + background: rgba(9, 43, 82, 0.78); + color: rgba(222, 249, 255, 0.92); + cursor: pointer; + backdrop-filter: blur(1px); + transition: border-color 0.2s ease, color 0.2s ease, box-shadow 0.2s ease; + + &:hover { + border-color: rgba(122, 228, 255, 0.5); + color: #eefcff; + box-shadow: 0 0 12px rgba(77, 190, 255, 0.22); + } + } + + .map-preview-icon { + width: 16px; + height: 16px; + } + + .map-preview-close { + position: absolute; + z-index: 7; + right: 14px; + top: 10px; + width: 30px; + height: 26px; + border: 1px solid rgba(86, 205, 255, 0.24); + background: rgba(9, 43, 82, 0.8); + color: rgba(226, 250, 255, 0.92); + font-size: 14px; + line-height: 1; + cursor: pointer; + + &:hover { + border-color: rgba(255, 126, 126, 0.5); + color: #ffd6d6; + } + } + .nav-map-stage::before { content: ""; position: absolute; @@ -1625,7 +1723,7 @@ } .real-map-svg { - padding: 34px 56px 62px; + // padding: 34px 56px 62px; box-sizing: border-box; cursor: grab; user-select: none; @@ -1726,13 +1824,16 @@ stroke: #76efff; stroke-width: 1.6; stroke-dasharray: 5 4; + // 去掉路线外层的半透明发光底 + filter: none; // vector-effect: non-scaling-stroke; } .checkpoint circle { - fill: rgba(5, 18, 42, 0.96); - stroke: #8becff; - stroke-width: 1.5; + // 空心圆点:仅保留青色描边(原深色填充会让圆心发黑) + fill: transparent; + stroke: #00f0ff; + stroke-width: 2px; filter: drop-shadow(0 0 12px rgba(97, 220, 255, 0.24)); } @@ -1765,6 +1866,52 @@ transition: transform 3s ease; } + // 机器人图标:不拦截地图拖拽事件 + .robot-icon { + pointer-events: none; + } + + // 机器人光圈:由内向外扩散(三圈时长/延迟/亮度各不相同,避免机械感) + .robot-ring { + fill: none; + stroke: #8fe3ff; + stroke-width: 1; + opacity: 0; + // 以圆自身中心为缩放基准 + transform-box: fill-box; + transform-origin: center; + pointer-events: none; + animation: robotRingSpread 2.6s cubic-bezier(0.25, 0.62, 0.36, 1) infinite; + } + + .robot-ring.ring-2 { + stroke-width: 0.9; + animation-duration: 2.9s; + animation-delay: 0.8s; + } + + .robot-ring.ring-3 { + stroke-width: 0.8; + animation-duration: 3.3s; + animation-delay: 1.7s; + } + + @keyframes robotRingSpread { + 0% { + transform: scale(0.4); + opacity: 0.5; + } + + 55% { + opacity: 0.22; + } + + 100% { + transform: scale(1.5); + opacity: 0; + } + } + .real-map-svg .checkpoint text { font-size: 7px; } @@ -1808,16 +1955,20 @@ .map-scale-controls { position: absolute; z-index: 4; - right: 14px; - top: 34px; + // 右移让位给右上角的预览/关闭按钮 + right: 52px; + top: 10px; display: flex; align-items: center; gap: 6px; padding: 5px 7px; - background: rgba(4, 18, 38, 0.68); - border: 1px solid rgba(86, 205, 255, 0.14); - box-shadow: 0 0 16px rgba(0, 10, 24, 0.28); - backdrop-filter: blur(2px); + // 设计稿标签样式:半透明渐变底 + 细边框 + 外发光 + 轻微模糊 + background: linear-gradient(90deg, + rgba(0, 50, 135, 0.3) 0%, + rgba(0, 53, 118, 0.2) 100%); + border: 1px solid rgba(86, 205, 255, 0.12); + box-shadow: 0 0 18px 0 rgba(0, 10, 24, 0.32); + backdrop-filter: blur(1px); } .map-scale-controls button { @@ -1852,10 +2003,13 @@ .nav-map-overlay.bottom-right { max-width: calc(100% - 28px); padding: 6px 10px; - background: linear-gradient(90deg, rgba(3, 13, 30, 0.76), rgba(7, 28, 54, 0.5)); + // 设计稿标签样式:半透明渐变底 + 细边框 + 外发光 + 轻微模糊 + background: linear-gradient(90deg, + rgba(0, 50, 135, 0.3) 0%, + rgba(0, 53, 118, 0.2) 100%); border: 1px solid rgba(86, 205, 255, 0.12); - backdrop-filter: blur(2px); - box-shadow: 0 0 18px rgba(0, 10, 24, 0.32); + box-shadow: 0 0 18px 0 rgba(0, 10, 24, 0.32); + backdrop-filter: blur(1px); } .nav-map-footer { @@ -1888,44 +2042,57 @@ [class^="card-"] { width: 100%; position: relative; + // 背景层顺序(前者在上):01.webp → 01.png → 卡片底纹 → 标题1_静态背景 + // 标题1_静态背景.png 放最底层,避免压住其它底图与标题文字 background-image: url("./assets/01.webp"), url("./assets/01.png"), - url("./assets/标题1_静态背景.png"), url("./assets/卡片背景.png"); + url("./assets/卡片背景.png"), url("./assets/标题1_静态背景.png"); background-repeat: no-repeat; background-position: top, top, - top, - 20px 40px; - background-size: 100%; + 20px 40px, + top; + background-size: 100%, 100%, 100%, 100%; .title { - font-weight: bold; - background-image: -webkit-linear-gradient(top, - rgb(157, 195, 234), - #fff, - rgb(96, 162, 225)); - user-select: none; + // 设计稿卡片标题样式(渐变文字) + font-family: YouSheBiaoTiHei, "PingFang SC", "Microsoft YaHei", sans-serif; + font-size: 26px; + font-style: normal; + font-weight: 400; + line-height: 26px; + // 用 background-image 声明,避免 background 简写把裁剪方式重置成色块 + background-image: linear-gradient(180deg, #fff 27.19%, #63c1ff 100%); + background-repeat: no-repeat; + background-size: 100% 100%; + background-clip: text; -webkit-background-clip: text; -webkit-text-fill-color: transparent; - line-height: 30px; - margin-left: 80px; - color: #fff; - font-size: 18px; + // 兜底:渐变裁剪未生效时文字仍是可见的浅色,不会被底图遮没 + color: #eaf6ff; + position: relative; + z-index: 1; + text-align: left; + user-select: none; + margin-left: 60px; } } .device-card { .device-panel { - margin: 4px 24px 0; - padding: 12px 14px 16px; - height: calc(100% - 56px); + // 标题与内容之间留出明显间距,同时保持底部不溢出 + margin: 16px 24px 0; + // 内容区四周内边距 15px + padding: 15px; + box-sizing: border-box; + height: calc(100% - 64px); display: flex; flex-direction: column; gap: 12px; - background: linear-gradient( - 180deg, - rgba(7, 27, 61, 0.76) 0%, - rgba(3, 18, 41, 0.56) 100% - ); + // 内容区背景:半透明渐变 + 背景模糊(对应设计稿 fill) + background: linear-gradient(0deg, + rgba(0, 83, 132, 0.3) 0%, + rgba(0, 83, 132, 0) 97.3%); + backdrop-filter: blur(4px); border: 1px solid rgba(80, 197, 255, 0.18); box-shadow: inset 0 0 20px rgba(65, 179, 255, 0.08); } @@ -2175,7 +2342,7 @@ gap: 12px; .title { - margin-left: 80px; + margin-left: 60px; flex: 0 0 auto; } } @@ -2183,12 +2350,20 @@ .alert-card { .alert-panel { margin: 8px 24px 0; + // 内容区四周内边距 10px + padding: 10px; + box-sizing: border-box; height: calc(100% - 56px); min-height: 0; display: flex; flex-direction: column; gap: 10px; overflow: hidden; + // 内容区背景:半透明渐变 + 背景模糊(对应设计稿 fill) + background: linear-gradient(0deg, + rgba(0, 83, 132, 0.3) 0%, + rgba(0, 83, 132, 0) 97.3%); + backdrop-filter: blur(4px); } .alert-tabs { @@ -2356,14 +2531,19 @@ .video-card { > .card-header .title { - margin-left: 80px; + margin-left: 60px; } .video-panel { - margin: 12px 4px 0 20px; - height: calc(100% - 56px); + margin: 12px 20px; display: flex; flex-direction: column; + gap: 10px; + // 内容区背景:半透明渐变 + 背景模糊(对应设计稿 fill) + background: linear-gradient(0deg, + rgba(0, 83, 132, 0.3) 0%, + rgba(0, 83, 132, 0) 97.3%); + backdrop-filter: blur(4px); } .camera-switch { @@ -2371,6 +2551,8 @@ justify-content: flex-end; gap: 8px; align-items: center; + color: rgba(192, 235, 250, 0.78); + font-size: 12px; } .header-switch { @@ -2401,6 +2583,7 @@ } } + // 两个摄像头画面均按 16:9 展示 .video-screen { position: relative; width: 100%; @@ -2482,16 +2665,32 @@ .control-card { > .card-header .title { - margin-left: 80px; + margin-left: 60px; } .control-panel { height: calc(100% - 56px); - margin: 10px 4px 0 20px; + margin: 8px 14px 10px; + // 内容区四周内边距(左右 14px) + padding: 0px 14px; + box-sizing: border-box; display: flex; flex-direction: column; - gap: 10px; - overflow: hidden; + gap: 8px; + overflow-y: auto; + // 内容区背景:半透明渐变 + 背景模糊(对应设计稿 fill) + background: linear-gradient(0deg, + rgba(0, 83, 132, 0.3) 0%, + rgba(0, 83, 132, 0) 97.3%); + backdrop-filter: blur(4px); + // 不显示滚动条(内容超出时仍可滚轮滚动) + scrollbar-width: none; + -ms-overflow-style: none; + + &::-webkit-scrollbar { + width: 0; + display: none; + } } .control-status { @@ -2735,7 +2934,7 @@ .control-top-row > .vehicle-section, .control-top-row > .gimbal-section { - padding: 10px 10px 8px; + padding: 6px 8px 4px; background: linear-gradient( 180deg, rgba(8, 31, 62, 0.78) 0%, @@ -2795,10 +2994,10 @@ .vehicle-pad { width: 208px; height: 208px; - margin: -10px auto -36px; + margin: -6px auto -32px; position: relative; left: -22px; - transform: scale(0.78); + transform: scale(0.7); transform-origin: center top; display: grid; grid-template-columns: 1fr 72px 1fr; @@ -3007,7 +3206,7 @@ } .section-title { - margin-bottom: 8px; + margin-bottom: 6px; color: #d9e7f1; font-size: 11px; font-weight: 700; @@ -3033,9 +3232,9 @@ } .gimbal-wheel { - margin: -10px auto -36px; + margin: -6px auto -32px; left: -22px; - transform: scale(0.78); + transform: scale(0.7); } .gimbal-preset-panel { @@ -3098,7 +3297,7 @@ .lift-control-panel { display: flex; flex-direction: column; - gap: 8px; + gap: 6px; padding-top: 0; } @@ -3115,7 +3314,7 @@ } .lift-input-shell { - height: 36px; + height: 32px; padding: 0 12px; display: flex; align-items: center; @@ -3150,7 +3349,7 @@ .lift-action-row { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); - gap: 10px; + gap: 8px; } .lift-submit-wide { @@ -3158,7 +3357,7 @@ } .lift-submit-btn { - height: 34px; + height: 32px; border: 1px solid rgba(91, 208, 255, 0.26); background: linear-gradient( 90deg, @@ -3193,7 +3392,7 @@ display: flex; flex-direction: column; gap: 4px; - padding: 8px 10px; + padding: 6px 8px; background: linear-gradient( 180deg, rgba(10, 36, 72, 0.78) 0%, @@ -3216,36 +3415,38 @@ } + // 底部两列容器:各占 Grid 一列,内部再分两列,卡片高度随行高自动对齐 .left { - padding-left: 30px; + grid-row: 2; + grid-column: 1; } .right { - padding-right: 30px; - display: flex; - flex-direction: column; - gap: 12px; - padding-top: 11%; - padding-bottom: 4%; - box-sizing: border-box; + grid-row: 2; + grid-column: 2; - .card-1 { - top: 0; - flex: none; - margin-top: -100px; + .card-1, + .card-2 { + margin-top: 0; } .card-2 { - top: 0; - flex: 1; min-height: 0; } } .left, .right { - width: 25%; - height: 100%; + min-width: 0; + min-height: 0; + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 16px; + + > div { + min-width: 0; + min-height: 0; + } } @keyframes screenScan { @@ -3310,27 +3511,49 @@ } } + // 左右列卡片高度均由 Grid 行高拉伸对齐,不再单独固定 .left { - display: flex; - flex-direction: column; - gap: 20px; - padding-top: 11%; - padding-bottom: 8%; - box-sizing: border-box; - - .card-1 { - top: 0; - height: 400px; - flex: none; - margin-top: -100px; - } - + .card-1, .card-2 { - top: 0; - height: 500px; - flex: none; + height: auto; } } } } + +// 底部导航:dashboard 直接子级(与 .main 平级),整图背景 + 透明热区按钮 +.bottom-nav { + position: absolute; + left: 50%; + bottom: 5px; + transform: translateX(-50%); + width: 1357px; + height: 70px; + z-index: 20; + background-repeat: no-repeat; + background-size: 100% 100%; + + // 纯透明热区:仅提供点击区域,不叠加任何半透明占位样式 + // top/height 按导航图中菜单的实际高度(像素 y 25-104 / 图高 140)换算 + .nav-hit { + position: absolute; + top: 13px; + height: 40px; + border: 0; + padding: 0; + background: transparent; + color: transparent; + cursor: pointer; + + // 屏幕阅读器可见的菜单文字(视觉上由背景图提供) + .nav-hit-label { + position: absolute; + width: 1px; + height: 1px; + overflow: hidden; + clip: rect(0 0 0 0); + white-space: nowrap; + } + } +} diff --git a/src/views/dashboard1/index.vue b/src/views/dashboard1/index.vue index 4069127..f19b5c4 100644 --- a/src/views/dashboard1/index.vue +++ b/src/views/dashboard1/index.vue @@ -1,33 +1,53 @@