| | |
| | | <style scoped> |
| | | /* 外部缩放容器 - 占据整个视口 */ |
| | | .scale-container { |
| | | position: relative; |
| | | width: 100%; |
| | | /* 页面在常规布局下(有顶栏)默认减去 84px,避免内容被裁切 */ |
| | | height: calc(100vh - 84px); |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | background-color: #000; |
| | | overflow: hidden; |
| | | position: relative; |
| | | width: 100%; |
| | | /* 页面在常规布局下(有顶栏)默认减去 84px,避免内容被裁切 */ |
| | | height: calc(100vh - 84px); |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | background-color: #000; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | /* 动态网格背景 */ |
| | | .scale-container::before { |
| | | content: ''; |
| | | position: absolute; |
| | | inset: 0; |
| | | background-image: |
| | | linear-gradient(rgba(0, 150, 255, 0.03) 1px, transparent 1px), |
| | | linear-gradient(90deg, rgba(0, 150, 255, 0.03) 1px, transparent 1px); |
| | | background-size: 50px 50px; |
| | | animation: gridMove 20s linear infinite; |
| | | pointer-events: none; |
| | | z-index: 0; |
| | | } |
| | | |
| | | @keyframes gridMove { |
| | | 0% { transform: translate(0, 0); } |
| | | 100% { transform: translate(50px, 50px); } |
| | | } |
| | | |
| | | /* 扫描线效果 */ |
| | | .scale-container::after { |
| | | content: ''; |
| | | position: absolute; |
| | | top: 0; |
| | | left: 0; |
| | | right: 0; |
| | | height: 2px; |
| | | background: linear-gradient(90deg, transparent, rgba(0, 212, 255, 0.8), transparent); |
| | | animation: scanLine 4s ease-in-out infinite; |
| | | pointer-events: none; |
| | | z-index: 1; |
| | | } |
| | | |
| | | @keyframes scanLine { |
| | | 0%, 100% { top: 0; opacity: 0; } |
| | | 10% { opacity: 1; } |
| | | 90% { opacity: 1; } |
| | | 100% { top: 100%; opacity: 0; } |
| | | } |
| | | |
| | | /* 内部内容区域 - 固定设计尺寸 */ |
| | | .data-dashboard { |
| | | position: relative; |
| | | width: 1920px; |
| | | height: 1080px; |
| | | background-image: url("@/assets/BI/backImage@2x.png"); |
| | | background-size: cover; |
| | | background-position: center; |
| | | background-repeat: no-repeat; |
| | | transform-origin: center center; |
| | | position: relative; |
| | | width: 1920px; |
| | | height: 1080px; |
| | | background-image: url("@/assets/BI/backImage@2x.png"); |
| | | background-size: cover; |
| | | background-position: center; |
| | | background-repeat: no-repeat; |
| | | transform-origin: center center; |
| | | z-index: 2; |
| | | } |
| | | |
| | | /* 全屏状态的样式 - 作用于scale-container */ |
| | | .scale-container:fullscreen { |
| | | width: 100vw; |
| | | height: 100vh; |
| | | margin: 0; |
| | | padding: 0; |
| | | background-color: #000; |
| | | z-index: 9999; |
| | | width: 100vw; |
| | | height: 100vh; |
| | | margin: 0; |
| | | padding: 0; |
| | | background-color: #000; |
| | | z-index: 9999; |
| | | } |
| | | |
| | | /* Webkit浏览器前缀 */ |
| | | .scale-container:-webkit-full-screen { |
| | | width: 100vw; |
| | | height: 100vh; |
| | | margin: 0; |
| | | padding: 0; |
| | | background-color: #000; |
| | | z-index: 9999; |
| | | width: 100vw; |
| | | height: 100vh; |
| | | margin: 0; |
| | | padding: 0; |
| | | background-color: #000; |
| | | z-index: 9999; |
| | | } |
| | | |
| | | /* MS浏览器前缀 */ |
| | | .scale-container:-ms-fullscreen { |
| | | width: 100vw; |
| | | height: 100vh; |
| | | margin: 0; |
| | | padding: 0; |
| | | background-color: #000; |
| | | z-index: 9999; |
| | | width: 100vw; |
| | | height: 100vh; |
| | | margin: 0; |
| | | padding: 0; |
| | | background-color: #000; |
| | | z-index: 9999; |
| | | } |
| | | |
| | | |
| | | .dashboard-header { |
| | | position: relative; |
| | | z-index: 1; |
| | | height: 86px; |
| | | background-image: url("@/assets/BI/biaoti.png"); |
| | | background-size: cover; |
| | | background-repeat: no-repeat; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | position: relative; |
| | | z-index: 1; |
| | | height: 86px; |
| | | background-image: url("@/assets/BI/biaoti.png"); |
| | | background-size: cover; |
| | | background-repeat: no-repeat; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | } |
| | | |
| | | /* 标题装饰光效 */ |
| | | .dashboard-header::before { |
| | | content: ''; |
| | | position: absolute; |
| | | top: 50%; |
| | | left: 50%; |
| | | transform: translate(-50%, -50%); |
| | | width: 400px; |
| | | height: 2px; |
| | | background: linear-gradient(90deg, transparent, rgba(0, 212, 255, 0.6), transparent); |
| | | animation: titleGlow 3s ease-in-out infinite; |
| | | } |
| | | |
| | | @keyframes titleGlow { |
| | | 0%, 100% { width: 400px; opacity: 0.6; } |
| | | 50% { width: 600px; opacity: 1; } |
| | | } |
| | | |
| | | .factory-name { |
| | | font-weight: 600; |
| | | font-size: 52px; |
| | | color: #FFFFFF; |
| | | top: 16px; |
| | | position: absolute; |
| | | font-weight: 600; |
| | | font-size: 52px; |
| | | color: #FFFFFF; |
| | | top: 16px; |
| | | position: absolute; |
| | | text-shadow: 0 0 20px rgba(0, 212, 255, 0.5), 0 0 40px rgba(0, 150, 255, 0.3); |
| | | animation: titleFloat 4s ease-in-out infinite; |
| | | letter-spacing: 8px; |
| | | } |
| | | |
| | | @keyframes titleFloat { |
| | | 0%, 100% { transform: translateY(0); } |
| | | 50% { transform: translateY(-3px); } |
| | | } |
| | | |
| | | .fullscreen-btn { |
| | | position: absolute; |
| | | top: 10px; |
| | | left: 20px; |
| | | width: 40px; |
| | | height: 40px; |
| | | background: rgba(0, 20, 60, 0.8); |
| | | border: 1px solid rgba(0, 212, 255, 0.3); |
| | | border-radius: 6px; |
| | | color: #00d4ff; |
| | | cursor: pointer; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | transition: all 0.3s; |
| | | z-index: 10000; |
| | | position: absolute; |
| | | top: 10px; |
| | | left: 20px; |
| | | width: 40px; |
| | | height: 40px; |
| | | background: rgba(0, 20, 60, 0.8); |
| | | border: 1px solid rgba(0, 212, 255, 0.3); |
| | | border-radius: 6px; |
| | | color: #00d4ff; |
| | | cursor: pointer; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | transition: all 0.3s; |
| | | z-index: 10000; |
| | | } |
| | | |
| | | .fullscreen-btn:hover { |
| | | background: rgba(0, 30, 90, 0.9); |
| | | border-color: rgba(0, 212, 255, 0.5); |
| | | background: rgba(0, 30, 90, 0.9); |
| | | border-color: rgba(0, 212, 255, 0.5); |
| | | box-shadow: 0 0 15px rgba(0, 212, 255, 0.4); |
| | | } |
| | | |
| | | .dashboard-content { |
| | | position: relative; |
| | | z-index: 1; |
| | | display: flex; |
| | | gap: 30px; |
| | | padding: 0 30px; |
| | | height: calc(100% - 86px); |
| | | overflow: hidden; |
| | | position: relative; |
| | | z-index: 1; |
| | | display: flex; |
| | | gap: 30px; |
| | | padding: 0 30px; |
| | | height: calc(100% - 86px); |
| | | overflow: hidden; |
| | | } |
| | | |
| | | /* 确保各面板能够正确显示 */ |
| | | .left-panel, .center-panel, .right-panel { |
| | | overflow: hidden; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | .left-panel, |
| | | .right-panel { |
| | | flex: 1; |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 24px; |
| | | width: 520px; |
| | | /* 面板入场动画 */ |
| | | .left-panel { |
| | | flex: 1; |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 24px; |
| | | width: 520px; |
| | | animation: slideInLeft 0.8s ease-out; |
| | | } |
| | | |
| | | .center-panel { |
| | | flex: 1.5; |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 20px; |
| | | flex: 1.5; |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 20px; |
| | | animation: slideInUp 0.8s ease-out 0.2s both; |
| | | } |
| | | |
| | | .right-panel { |
| | | flex: 1; |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 24px; |
| | | width: 520px; |
| | | animation: slideInRight 0.8s ease-out; |
| | | } |
| | | |
| | | @keyframes slideInLeft { |
| | | from { |
| | | opacity: 0; |
| | | transform: translateX(-50px); |
| | | } |
| | | to { |
| | | opacity: 1; |
| | | transform: translateX(0); |
| | | } |
| | | } |
| | | |
| | | @keyframes slideInRight { |
| | | from { |
| | | opacity: 0; |
| | | transform: translateX(50px); |
| | | } |
| | | to { |
| | | opacity: 1; |
| | | transform: translateX(0); |
| | | } |
| | | } |
| | | |
| | | @keyframes slideInUp { |
| | | from { |
| | | opacity: 0; |
| | | transform: translateY(30px); |
| | | } |
| | | to { |
| | | opacity: 1; |
| | | transform: translateY(0); |
| | | } |
| | | } |
| | | |
| | | /* 面板通用发光边框效果 - 通过子组件的panel-item-customers类生效 */ |
| | | :deep(.panel-item-customers) { |
| | | position: relative; |
| | | transition: all 0.3s ease; |
| | | } |
| | | |
| | | :deep(.panel-item-customers::before) { |
| | | content: ''; |
| | | position: absolute; |
| | | inset: -1px; |
| | | border-radius: 0; |
| | | background: linear-gradient(90deg, transparent, rgba(0, 212, 255, 0.3), transparent); |
| | | opacity: 0; |
| | | transition: opacity 0.3s; |
| | | pointer-events: none; |
| | | z-index: -1; |
| | | } |
| | | |
| | | :deep(.panel-item-customers:hover::before) { |
| | | opacity: 1; |
| | | animation: borderGlow 2s linear infinite; |
| | | } |
| | | |
| | | @keyframes borderGlow { |
| | | 0% { background-position: -200% 0; } |
| | | 100% { background-position: 200% 0; } |
| | | } |
| | | |
| | | /* 统计卡片闪烁效果 */ |
| | | :deep(.stat-card) { |
| | | transition: all 0.3s ease; |
| | | } |
| | | |
| | | :deep(.stat-card:hover) { |
| | | transform: translateY(-2px); |
| | | box-shadow: 0 5px 20px rgba(0, 150, 255, 0.3); |
| | | } |
| | | |
| | | :deep(.stat-card:hover .card-value) { |
| | | animation: valuePulse 0.5s ease; |
| | | } |
| | | |
| | | @keyframes valuePulse { |
| | | 0%, 100% { transform: scale(1); } |
| | | 50% { transform: scale(1.05); } |
| | | } |
| | | |
| | | /* 数据流动效果背景 */ |
| | | .dashboard-content::before { |
| | | content: ''; |
| | | position: absolute; |
| | | top: 50%; |
| | | left: 0; |
| | | right: 0; |
| | | height: 1px; |
| | | background: linear-gradient(90deg, |
| | | transparent 0%, |
| | | rgba(0, 212, 255, 0.1) 20%, |
| | | rgba(0, 212, 255, 0.3) 50%, |
| | | rgba(0, 212, 255, 0.1) 80%, |
| | | transparent 100%); |
| | | animation: dataFlow 8s linear infinite; |
| | | pointer-events: none; |
| | | } |
| | | |
| | | @keyframes dataFlow { |
| | | 0% { transform: translateX(-100%); } |
| | | 100% { transform: translateX(100%); } |
| | | } |
| | | </style> |