结合Elementui实现文字溢出才展示Tooltip

场景:表格中内容溢出展示...鼠标移上去展示tooltip。

虽然elementui的表格有内容溢出显示tooltips的配置项,但是只适用于简单的数据展示,如果自定义的内容,或者默认展示两行再溢出就不适用,所以,参考elementui的实现方式进行自己的修改。

 <el-table :data="tableData">
      <el-table-column prop="name" label="name">
        <template slot-scope="scope" >
          <div class='table_name '>
            <div @mouseover='handleCellMouseEnter' @mouseleave="handleCellMouseLeave">{{ scope.row.name}}</div>
          </div>
        </template>
      </el-table-column>
 </el-table>
<el-tooltip effect='dark' placement="top" ref="tooltip" :content='tooltipContent'></el-tooltip>

.table_name {
  font-size: 16px;
  line-height: 22px;
  font-weight: 500;
  display: -webkit-box;
  color: #101010;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  display: -moz-box;
  -moz-line-clamp: 2;
  -moz-box-orient: vertical;
  overflow-wrap: break-word;
  word-break: normal;
  white-space: normal;
  overflow: hidden;
}

1、一个简单的表格,列可以是任何自定义的html结构,样式也是两行展示。

主要是定义一个鼠标移入和移除的方法

2、随便在哪个位置加一个el-tooltip

js部分(vue3)

export default defineComponent({
    const tooltip = ref(null);
    const tooltipContent = ref("");

    const handleCellMouseEnter = (e)=>{ //鼠标进入触发的方法
      const textDom = e.target.parentNode.querySelector(".table_name");
      if (!textDom) {
        return;
      }
      //获取可见元素的长度
      const cw = textDom.clientWidth;
      const range = document.createRange();
      //创建一个div,塞到看不见的地方,把内容放进去,并获取他的长度
      let dom = document.createElement('div') 
      dom.innerHTML = textDom.innerHTML
      dom.style.position = 'fixed'
      dom.style.left = '50000px'
      dom.style.whiteSpace = 'nowrap'
      dom.id='tempDom'
      document.querySelector('body').append(dom)

      range.setStart(dom, 0);
      range.setEnd(dom, dom.childNodes.length);
      //获取 长度
      const rangeWidth = range.getBoundingClientRect().width;
      //获取完删除dom
      document.querySelector('body #tempDom').remove()
      //对比内容长度和可见长度的大小,这里是两行展示所以除以2再对比
      if (rangeWidth/2 > cw) {
        //设置tooltip的内容
        tooltipContent.value = textDom.innerText || textDom.textContent;
        tooltip.value.referenceElm = textDom;
        tooltip.value.$refs.popper && (tooltip.value.$refs.popper.style.display = 'none');
        tooltip.value.doDestroy();
        tooltip.value.setExpectedState(true);
        tooltip.value.handleShowPopper()
        tooltip.value.$refs.popper.style.height = `auto`
        tooltip.value.$refs.popper.style.maxWidth = `${cw * 2}px`
        tooltip.value.$refs.popper.style.transform = `translate(0 ,-10px)`
      }
    }
    const handleCellMouseLeave = ()=> {
      if (tooltip.value) {
        //关闭tooltip
        tooltip.value.setExpectedState(false);
        tooltip.value.handleClosePopper();
      }
    }
    return{
        tooltip,
        tooltipContent,
        handleCellMouseEnter,
        handleCellMouseLeave 
    }
})

用长度来判断的可能会因为word break导致不准,所以改进一下使用宽度来判断

    const handleCellMouseEnter = (e) => {
      const textDom = e.target.parentNode.querySelector(".table_name") || e.target.parentNode.querySelector(".table_owner") ;
      if (!textDom) {
        return;
      }
      const cw = textDom.clientWidth;
      const ch = textDom.clientHeight;
      const range = document.createRange();
      let dom = document.createElement("div");
      dom.innerHTML = textDom.innerHTML;
      dom.style.position = "fixed";
      dom.style.left = "50000px";
      dom.style.width = cw+'px'
      // dom.style.whiteSpace = "nowrap";
      dom.style.wordBreak = 'break-word'
      dom.id = "tempDom";
      document.querySelector("body").append(dom);
      range.setStart(dom, 0);
      range.setEnd(dom, dom.childNodes.length);
      const rangeHeight = range.getBoundingClientRect().height;
      document.querySelector("body #tempDom").remove();
      if (rangeHeight > ch) {
        tooltipContent.value = textDom.innerText || textDom.textContent;
        tooltip.value.referenceElm = textDom;
        tooltip.value.$refs.popper &&
          (tooltip.value.$refs.popper.style.display = "none");
        tooltip.value.doDestroy();
        tooltip.value.setExpectedState(true);
        tooltip.value.handleShowPopper();
        tooltip.value.$refs.popper.style.height = `auto`;
        tooltip.value.$refs.popper.style.maxWidth = `${cw * 2}px`;
        tooltip.value.$refs.popper.style.transform = `translate(0 ,-10px)`;
      }
    };

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值