From 235a109b3b461c7acbd1d7bb4f7e920075de2b9e Mon Sep 17 00:00:00 2001 From: 马宇豪 <978517621@qq.com> Date: 星期四, 24 四月 2025 15:40:51 +0800 Subject: [PATCH] 修改大屏 --- src/views/hazardousChemicals/bigScreen/components/midBottom.vue | 142 ++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 139 insertions(+), 3 deletions(-) diff --git a/src/views/hazardousChemicals/bigScreen/components/midBottom.vue b/src/views/hazardousChemicals/bigScreen/components/midBottom.vue index eca8b81..7f9b1f3 100644 --- a/src/views/hazardousChemicals/bigScreen/components/midBottom.vue +++ b/src/views/hazardousChemicals/bigScreen/components/midBottom.vue @@ -1,19 +1,99 @@ <template> <div class="charts-container"> <div id="preWarning"></div> + <div class="table-wrapper"> + <table class="scrollable-table"> + <thead> + <tr> + <th>预警信息</th> + <th>预警时间</th> + </tr> + </thead> + </table> + <div class="scroll-viewport" ref="viewport"> + <div class="scroll-content" :style="contentStyle"> + <table class="scrollable-table"> + <tbody> + <tr v-for="(item,index) in warningData" :key="item.id"> + <td>{{ item.warningInfo }}</td> + <td>{{ item.warningTime }}</td> + </tr> + <tr v-for="(item,index) in loopData" :key="`loop-${item.id}`"> + <td>{{ item.warningInfo }}</td> + <td>{{ item.warningTime }}</td> + </tr> + </tbody> + </table> + </div> + </div> + </div> </div> </template> <script setup> import * as echarts from 'echarts'; -import {onMounted} from "vue"; +import {computed, onBeforeUnmount, onMounted, ref} from "vue"; import {getCompanyMessage, getDailywarningCount} from "@/api/monitor/screenCharts"; import {ElMessage} from "element-plus"; +const warningData = [ + {warningInfo: '超期预警',warningTime: '2025-04-24 13:18:41' }, + {warningInfo: '超期预警',warningTime: '2025-04-23 13:00:21' }, + {warningInfo: '超期预警',warningTime: '2025-04-20 10:11:34' }, + {warningInfo: '超期预警',warningTime: '2025-04-18 09:28:51' }, + {warningInfo: '超期预警',warningTime: '2025-04-16 08:18:21' }, + {warningInfo: '超期预警',warningTime: '2025-04-15 05:12:21' }, + {warningInfo: '超期预警',warningTime: '2025-04-14 04:11:41' } +] +// 配置参数 +const visibleRows = 5 // 显示的行数 +const scrollSpeed = 0.5 // 每次滚动的像素数 +const rowHeight = 36 // 行高,与CSS一致 +const viewport = ref(null) +const scrollPosition = ref(0) +let animationFrame = null + onMounted(()=>{ getList() - +// 设置视口高度 + if (viewport.value) { + viewport.value.style.height = `${visibleRows * rowHeight}px` + } + // 延迟启动滚动,确保初始渲染完成 + setTimeout(() => { + scrollAnimation() + }, 100) }) +onBeforeUnmount(() => { + if (animationFrame) { + cancelAnimationFrame(animationFrame) + } +}) + +// 复制前几行数据用于循环 +const loopData = computed(() => { + return warningData.slice(0, visibleRows) +}) + +// 内容区域样式 +const contentStyle = computed(() => { + return { + transform: `translateY(-${scrollPosition.value}px)` + } +}) + +// 滚动动画 +const scrollAnimation = () => { + const totalHeight = warningData.length * rowHeight + const loopHeight = loopData.value.length * rowHeight + // 更新滚动位置 + scrollPosition.value += scrollSpeed + // 当滚动到循环数据部分时,重置位置实现无缝衔接 + if (scrollPosition.value >= totalHeight) { + scrollPosition.value -= totalHeight + } + animationFrame = requestAnimationFrame(scrollAnimation) +} const getList = async () => { const res = await getDailywarningCount() @@ -105,10 +185,66 @@ .charts-container{ width: 100%; height: 100%; + display: flex; } #preWarning{ - width: 100%; + flex: 2; height: 100%; } + +.table-wrapper { + position: relative; + flex: 1; + height: 100%; + border: 1px solid rgba(255,255,255,.1); + border-radius: 2px; + overflow: hidden; + + .scrollable-table { + width: 100%; + border-collapse: collapse; + + th,td { + padding: 12px 15px; + color: #fff; + text-align: left; + border-bottom: 1px solid rgba(255,255,255,.1); + height: 36px; /* 与rowHeight一致 */ + box-sizing: border-box; + font-size: 12px; + font-weight: normal; + } + th { + position: sticky; + top: 0; + z-index: 10; /* 确保表头在内容之上 */ + } + tr{ + background: rgb(6,38,87); + + &:nth-of-type(2n){ + background: rgb(19,72,127); + } + } + thead tr{ + background: rgba(0,0,0,0); + } + } + .scroll-viewport { + position: relative; + overflow: hidden; + .scroll-content { + will-change: transform; /* 优化性能 */ + } + .danger { + color: #ff2f2f; + animation: blink 1s infinite; + } + .warning { + color: yellow; + animation: blink 1s infinite; + } + } +} </style> -- Gitblit v1.9.2