Files
xuziqiang d0155dbe3c push
2024-05-15 17:29:42 +08:00

431 lines
12 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.

<template>
<div class="table-view" id="tableView" ref="tableView" :style="{fontSize:`${fontSize}px`}">
<div class="thead" :style="{height: `${headHeight}px`}">
<div v-for="(value,key,index) in thead" :key="index" :style="{height: `${headHeight-10}px`,lineHeight:`${headHeight-10}px`,flex:flexs[index]}">{{value}}</div>
</div>
<div class="tbodymain" :style="{height: `${bodyHeight}px`}" @mouseenter="bodyMouseEnter" @mouseleave="bodyMouseLeave">
<div class="tbody b1" ref="tbody1" :style="{height: `${bodyHeight}px`}">
<div v-for="item in tableDatas1" :key="item.id" class="row" :style="{height: `${cellHeight}px`}">
<div v-for="(value,key,index) in item" :key="index" :style="{flex:flexs[index]}">
<!-- <marquee v-if="key=='positon' && value.length>fontScroll" behavior="scroll" scrolldelay="200" @mouseenter="marqueeStop($event)" @mouseleave="marqueeStart($event)">{{value}}</marquee> -->
<span :class=[timeHandle(key),colorHandle(key,value),scrollHandle(key,value)] :style="{height: `${cellHeight-10}px`,lineHeight:`${cellHeight-10}px`}">{{value}}</span></div>
</div>
</div>
<div class="tbody b2" ref="tbody2" :style="{height: `${bodyHeight}px`}">
<div v-for="item in tableDatas2" :key="item.id" class="row" :style="{height: `${cellHeight}px`}">
<div v-for="(value,key,index) in item" :key="index" :style="{flex:flexs[index]}">
<!-- <marquee v-if="key=='positon' && value.length>fontScroll" behavior="scroll" scrolldelay="200" @mouseenter="marqueeStop($event)" @mouseleave="marqueeStart($event)">{{value}}</marquee> -->
<span :class=[timeHandle(key),colorHandle(key,value),scrollHandle(key,value)] :style="{height: `${cellHeight-10}px`,lineHeight:`${cellHeight-10}px`}">{{value}}</span>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { defineComponent } from 'vue';
export default defineComponent({
name: 'baisicTable',
props: {
datas:{
type:Array,
required: true
},
thead:{
type:Array,
required: true
},
flexs:{
type:Array,
default:[1,1,3,2.3]
},
fontScroll:{
type:Number,
default:14
},
headHeight:{
type:Number,
default:37
},
rowNum:{
type:Number,
default:7
},
colNum:{
type:Number,
default:4
},
speed:{
type:Number,
default:2
},
fontSize:{
type:Number,
default:10
}
},
data() {
return {
timeOut:null,
srolltime:null,
tableDatas1:[],
tableDatas2:[],
pageIndex:0,
isColScroll:true,
total:0,
curPage:0,
cellHeight:26,
tableDatas:[],
bodyHeight:182
}
},
watch:{
datas:{
handler(newval){
this.tableDatas = newval;
this.changDatas();
},
deep:true
}
},
created() {
this.tableDatas = this.datas;
let len = this.tableDatas.length;
let row = this.rowNum;
let doubleRow = parseInt(row*2);
if(len>=doubleRow){
this.tableDatas1 = this.tableDatas.slice(0,row);
this.tableDatas2 = this.tableDatas.slice(row,doubleRow);
}else if(len>row && len<doubleRow){
this.tableDatas1 = this.tableDatas.slice(0,row);
this.tableDatas2 = this.tableDatas.slice(row,len);
let addData = this.tableDatas.slice(0,row-this.tableDatas2.length);
this.tableDatas2 = this.tableDatas2.concat(addData);
}else if(len <= row){
this.tableDatas1 = this.tableDatas;
}
},
mounted() {
this.getBodyMainHeight();
let row = this.rowNum;
let doubleRow = parseInt(row*2);
if(this.tableDatas.length>row){
this.timeIntervalHandle();
}else{
this.tableDatas1 = this.tableDatas;
}
if(this.tableDatas.length>doubleRow){
this.changDatas();
}
},
methods: {
getBodyMainHeight(){
// debugger;
let tableDom = document.getElementById("tableView");
// console.log(tableDom.clientHeight);
this.bodyHeight = parseInt(tableDom.clientHeight-this.headHeight);
// console.log(this.bodyHeight);
this.cellHeight = (this.bodyHeight/this.rowNum).toFixed(6);
console.log(this.cellHeight);
},
changDatas(){
let len = this.tableDatas.length;
let row = this.rowNum;
this.page = Math.ceil(len/row);
let endNum = len%row;
if(endNum>0){
let addNum = row-endNum;
let addArr = this.tableDatas.slice(0,addNum);
this.tableDatas = this.tableDatas.concat(addArr);
}
this.curPage = 1;
},
bodyMouseEnter(){
this.isColScroll = false;
},
bodyMouseLeave(){
this.isColScroll = true;
this.srollHandle();
},
marqueeStart(e){
e.currentTarget.start();
},
marqueeStop(e){
e.currentTarget.stop();
},
timeIntervalHandle(){
this.$refs.tbody1.style.top = `${0}px`;
this.$refs.tbody2.style.top = `${this.bodyHeight}px`;
setTimeout(this.srollHandle,3000);
},
srollHandle(){
if(!this.isColScroll) return;
let scrollSpeed = 0;
let _this = this;
clearInterval(this.srolltime);
clearTimeout(this.timeOut);
this.srolltime = setInterval(function(){
scrollSpeed += _this.speed;
if(scrollSpeed>_this.cellHeight){
// 当前数据滚动完剩余的
let v = (_this.cellHeight - (scrollSpeed-_this.speed)).toFixed(6);
// console.log("剩余V=====" + v);
// console.log(parseFloat(_this.$refs.tbody1.style.top));
_this.$refs.tbody1.style.top = (parseFloat(_this.$refs.tbody1.style.top) - v).toFixed(6)+"px";
_this.$refs.tbody2.style.top = (parseFloat(_this.$refs.tbody2.style.top) - v).toFixed(6)+"px";
// console.log(parseFloat(_this.$refs.tbody1.style.top));
}else{
_this.$refs.tbody1.style.top = (parseFloat(_this.$refs.tbody1.style.top) - _this.speed).toFixed(6)+"px";
_this.$refs.tbody2.style.top = (parseFloat(_this.$refs.tbody2.style.top) - _this.speed).toFixed(6)+"px";
// console.log("执行");
}
if(parseFloat(_this.$refs.tbody1.style.top)<=-_this.bodyHeight){
// debugger;
_this.$refs.tbody1.style.top = _this.bodyHeight+'px';
if(_this.page > 2){
_this.updateData(1);
}
}else if(parseFloat(_this.$refs.tbody2.style.top)<=-_this.bodyHeight){
// debugger;
_this.$refs.tbody2.style.top = _this.bodyHeight+'px';
if(_this.page > 2){
_this.updateData(2);
}
}
if(scrollSpeed>=_this.cellHeight){
clearInterval(_this.srolltime);
_this.timeOut = setTimeout(_this.srollHandle,1500);
}
},24);
},
updateData(id){
let row = this.rowNum;
this.curPage++;
if(this.curPage>=this.page){
this.curPage = 0;
}
let start = parseInt(this.curPage*row);
let end = start+row;
let getData = this.tableDatas.slice(start,end);
if(id==1){
this.tableDatas1 = getData;
}else{
this.tableDatas2 = getData;
}
},
timeHandle(key){
if(key=="time"){
return 'time';
}else{
return '';
}
},
scrollHandle(index,key,value){
if(key=='positon' && value.length>this.fontScroll){
return 'animate';
}
},
colorHandle(key,value){
if(key=="color"){
if(value.indexOf('蓝') != -1){
return 'blue';
}else if(value.indexOf('黄') != -1){
return 'yellow';
}else if(value.indexOf('绿') != -1){
return 'green';
}
}
}
}
})
</script>
<style lang="less" scoped>
.table-view{
width: 100%;
height: 100%;
border: 1px solid #0E748A;
color: #FFFFFF;
background-color: #04465B;
// font-size: 10px;
.thead{
display: flex;
background-color: #005062;
border-bottom: 1px solid #0E748A;
div{
flex: 1;
text-align: left;
flex-wrap:nowrap;
opacity: 0.85;
margin: 5px 10px;
word-break:keep-all;
white-space:nowrap;
overflow:hidden;
}
.flex0{
flex:1;
}
.flex1{
flex:1;
}
.flex2{
flex:3;
}
.flex3{
flex:2.3;
}
}
.tbodymain{
position: relative;
height: 183px;
overflow: hidden;
.tbody{
position: absolute;
width: 100%;
top:0px;
border-top: none;
height: 182px;
.row:nth-child(odd){
background-color: rgba(0,31,49,0.4);
}
.row:nth-child(even){
background-color: rgba(0,70,105,0.4);
}
.row{
height: 26px;
display: flex;
text-align: left;
flex-wrap:nowrap;
div{
flex: 1;//平均份
margin: 5px 12px;
text-align: left;
flex-wrap:nowrap;
word-break:keep-all;
white-space:nowrap;
overflow:hidden;
span{
opacity: 0.65;
// height: 37px;
// line-height: 37px;
// display: flex;
// // justify-content: center; //水平
// align-items: center; //
}
marquee{
opacity: 0.65;
}
.blue{
background-color:rgba(87, 208, 235, 0.2);
color: #57D0EB;
padding: 0px 5px;
border:1px solid rgba(87, 208, 235, 0.4);
border-radius: 1px;
opacity: 1;
// font-size: 8px;
// line-height: 16px;
}
.yellow{
background-color:rgba(235, 211, 87, 0.2);
color: #EBD357;
padding: 0px 5px;
border:1px solid rgba(235, 211, 87, 0.4);
border-radius: 1px;
opacity: 1;
// font-size: 8px;
// line-height: 16px;
}
.green{
background-color:rgba(87, 235, 155, 0.2);
color: #57EB9B;
padding: 0px 5px;
border:1px solid rgba(87, 235, 155, 0.4);
border-radius: 1px;
opacity: 1;
// font-size: 8px;
// line-height: 16px;
}
.time{
background-color: #012539;
border-radius: 2px;
padding: 5px 10px;
overflow:hidden;
opacity: 0.7;
// font-size: 8px;
// line-height: 16px;
}
.animate {
display: inline-block;
animation: 13s wordsLoop linear infinite normal;
}
@keyframes wordsLoop {
0% {
transform: translateX(100%);
-webkit-transform: translateX(100%);
}
100% {
transform: translateX(-100%);
-webkit-transform: translateX(-100%);
}
}
@-webkit-keyframes wordsLoop {
0% {
transform: translateX(0px);
-webkit-transform: translateX(0px);
}
100% {
transform: translateX(-100%);
-webkit-transform: translateX(-100%);
}
}
}
.flex0{
flex:1;
}
.flex1{
flex:1;
}
.flex2{
flex:3;
}
.flex3{
flex:2.3;
}
}
box-shadow: 0 0 2px #00667C inset,0 0 0px rgb(0,153,184);
}
.b2{
.row:nth-child(odd){
background-color: rgba(0,70,105,0.4);
}
.row:nth-child(even){
background-color: rgba(0,31,49,0.4);
}
}
// .b1{
// top:0px;
// }
// .b2{
// top: -40px;
// }
}
}
</style>