问题:
表格数据需要滚动展示,表格内容由于过长使用省略号进行展示,鼠标移上去显示文本内容。滚动展示使用vue-seamless-scroll组件,由于vue-seamless-scroll通过直接复制div,通过两个div的交替移动使得表格数据滚动展示,因此原本的div鼠标移上去能够显示el-tooltip,复制的div鼠标移上去没有反应。
解决措施:
1、去除el-tooltip组件,使用事件代理的方式,显示文本内容弹窗
目前
- 当前html结构:
<vue-seamless-scroll :data="tableList">
<table ref="table-box">
<tr v-for="(item,index) in tableList" :key="index">
<td>{{item.date}}</td>
<td>{{item.Naeme}}</td>
<td >
<el-tooltip
class="item yg_cursor"
effect="dark"
:content="item.content"
placement="top"
visible-arrow="true"
popper-class="pop-class1"
>{{item.content}}</el-tooltip>
</td>
</tr>
</table>
</vue-seamless-scroll>
- 使用了vue-seamless-scroll组件之后的页面上显示的html结构
<div>
//第一个原本的div,鼠标移上去可以显示弹窗
<div>
<table >
<tr >
<td>20220504</td>
<td>名字</td>
<td>文本内容</td>
</tr>
</table>
</div>
//第二个复制的div,鼠标移上去不可以显示弹窗
<div>
<table >
<tr >
<td>20220504</td>
<td>名字</td>
<td>文本内容</td>
</tr>
</table>
</div>
</div>
解决后:
- 采用事件代理方式监听鼠标移到content上显示弹窗,在最外层添加@mouseover、@mouseout方法,添加了class="table-content"标识,方便后续判断el是否在content的
<td>
标签上,增加了ref="table-box"方便获取表格高度;增加一个div用来显示文本内容
//增加一个div用来显示文本内容
<div ref="vc-tooltip" style="position: absolute;display: none" class="tooltip-box"></div>
<vue-seamless-scroll :data="tableList" @mouseover.native="handleMouseover($event)" @mouseout.native="handleMouseout($event)">
<table ref="table-box">
<tr v-for="(item,index) in tableList" :key="index">
<td>{{item.date}}</td>
<td>{{item.Naeme}}</td>
<td class="table-content">{{item.content}}</td>
</tr>
</table>
</vue-seamless-scroll>
- 在@mouseover、@mouseout方法中
handleMouseover(el){
//判断el是否在content的`<td>`标签上
if(el.target.className.includes('table-content'))
{
el.target.style.cursor='pointer'
//el所在div的transform在y轴上的移动px
let h=parseFloat(this.$refs["table-box"].parentElement.parentElement.style.transform.replaceAll('translate(0px,','').replace('px)',''))
//显示div
this.$refs["vc-tooltip"].style.display=''
this.$refs["vc-tooltip"].innerHTML=el.target.innerHTML
this.$refs["vc-tooltip"].style.left=el.target.offsetLeft-this.$refs["vc-tooltip"].offsetWidth/2+'px'
//判断el所在的div后面是否有元素,有则为第一个div
if(el.target.parentElement.parentElement.parentElement.nextSibling!=null)
{
this.$refs["vc-tooltip"].style.top=el.target.offsetTop+h+'px'
}
else {
//当el所在div为第二个即最后一个,弹窗的top还需加上上一个div的高度
this.$refs["vc-tooltip"].style.top=el.target.offsetTop+h+this.$refs["table-box"].offsetHeight+'px'
}
}
},
handleMouseout(el){
if(el.target.className.includes('table-content'))
{
this.$refs["vc-tooltip"].style.display='none'
}
},