vue+elemen实现el-tooltip在文本超出区域后浮现

 更新时间:2023年12月20日 11:48:23   作者:sgabon  
el-tooltip组件本身就是悬浮提示功能,在对它进行二次封装时,实现超出的文本浮现,本文就来介绍一下vue+elemen实现el-tooltip在文本超出区域后浮现,感兴趣的可以了解一下

前言

最近在做一个vue+element的项目,遇到的一些难搞的需求。
关于<el-tooltip>的使用想必也不用我多说了,官方文档是相当的详细,基本使用自己去饿了么官网看。

具体需求

由于我的内容是循环生成的,字体的多少,并不是一个定值,如果仅使用官方的<el-tooltip>组件的话,岂不是包着的每一个div都会有这个tooltip,结果导致一整个页面的tooltip,体验特别不好。而且整个页面生成了上百个<el-tooltip>标签,占用了大量的资源。

解决方案

方案一

刚开始在网上翻找解决方案,找到一个别人将tooltip组件二次封装,好用确实是好用,但是同样会生成大量的tooltip标签,遂放弃。

方案二

后来,我想到了一个我用过的表格属性——:show-overflow-tooltip=“true”——在表格组件中,某一个单元格中的内容超过了该单列的列宽,会隐藏多余部分,通过…展示。并且将鼠标移入即可查看该单元格内的完整内容。效果如图:

效果展示

而鼠标放到文字没超出列宽的地方则不显示 tooltip,神奇的是,整个页面,只生成了一个<el-tooltip>标签,无论有多少内容,永远只有一个<el-tooltip>存在,大大节省了资源。于是翻看源码看他是怎么实现该功能的。

表格的tooltip属性

具体方法

1.先在页面上定义一个tooltip标签

<el-tooltip ref="tooltip" :content="tooltipContent" />

此标签就是要在页面中生成的那个唯一的<el-tooltip>标签。

2.在文字区域的父标签上添加鼠标移入移除方法

					   <div
                           class="card-carousel--card--footer"
                           @mouseenter="handleDivMouseEnter($event)"
                           @mouseleave="handleDivMouseleave($event)"
                         >
                           <p class="topicStyle"> {{ info } </p>
	                   </div>

前提是:承载内容的标签需要有一个class。若要在组件标签上添加方法,应该是要添加【.native】的。

3.引入需要的方法

import debounce from 'throttle-debounce/debounce'
import { getStyle } from '@/utils/dom.js

在created中添加

created() {
     this.activateTooltip = debounce(50, tooltip =&gt; tooltip.handleShowPopper())
},

此处getStyle方法是自动计算边距,我将源码中的js提出来,方便使用。
源码位置:\element-dev\packages\table\src\table-body.js

4.在methods添加鼠标移入移出方法

// 鼠标移入
handleDivMouseEnter(event) {
        const target = event.target
        // 判断是否text-overflow, 如果是就显示tooltip
        let child = target.querySelector('.groupItemClass')
	    // 在此处我一共有三个class控制三块class,这一块主要是对<el-menu>以及文本区域控制,所以class要有多个。
        // 如果区域宽度被限定,则通过高度判断
        let heightFlag = false
        if (!child) {
          child = target.querySelector('.setItemClass')
          if (!child) {
            // 文本区域 
            child = target.querySelector('.topicStyle')
          }
        }
        if (child.scrollHeight > child.offsetHeight) {
            heightFlag = true
        }
        // use range width instead of scrollWidth to determine whether the text is overflowing
        // to address a potential FireFox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1074543#c3
        const range = document.createRange()
        range.setStart(child, 0)
        range.setEnd(child, child.childNodes.length)
        const rangeWidth = range.getBoundingClientRect().width // 文本区域宽度
        const padding = (parseInt(getStyle(target, 'paddingLeft'), 10) || 0) +
          (parseInt(getStyle(target, 'paddingRight'), 10) || 0)
        if ((rangeWidth + padding > target.offsetWidth || child.scrollWidth > child.offsetWidth) || heightFlag && this.$refs.tooltip) {
          const tooltip = this.$refs.tooltip
          // TODO 会引起整个 Table 的重新渲染,需要优化
          this.tooltipContent = target.innerText || target.textContent
          tooltip.referenceElm = target
          tooltip.$refs.popper && (tooltip.$refs.popper.style.display = 'none')
          tooltip.doDestroy()
          tooltip.setExpectedState(true)
          this.activateTooltip(tooltip)
        }
      }
      
// 鼠标移出  
handleDivMouseleave(event) {
        const tooltip = this.$refs.tooltip
        if (tooltip) {
          tooltip.setExpectedState(false)
          tooltip.handleClosePopper()
        }
      },

效果展示

悬浮

而且在页面中只生成一个<el-tooltip>标签。

展示

根据不同的情况可以通过判断宽度和高度,对自己的页面进行一定的兼容,对方法handleDivMouseEnter()进行相应的修改。

到此这篇关于vue+elemen实现el-tooltip在文本超出区域后浮现的文章就介绍到这了,更多相关elemen el-tooltip文本超出浮现内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue编写自定义Plugin详解

    Vue编写自定义Plugin详解

    这篇文章主要介绍了Vue编写自定义Plugin详解,在Vue开发中,我们经常需要使用一些第三方库或功能性模块,Vue插件就是一种将这些库或模块集成到Vue应用中的方式,插件是Vue.js提供的一种机制,用于扩展Vue的功能,需要的朋友可以参考下
    2023-08-08
  • 前端vue中实现文件下载的几种方法总结

    前端vue中实现文件下载的几种方法总结

    这篇文章主要介绍了前端vue中实现文件下载的几种方法总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • 详解key在Vue3和Vue2的不同之处

    详解key在Vue3和Vue2的不同之处

    key属性是一个特殊的属性,用于标识每个节点的唯一性。在Vue2.x版本中的key和Vue3.x版本中的key有很大的不同,那么在这篇文章中,我们将会讨论Vue2中的key和Vue3中的key的区别
    2023-04-04
  • Vue项目查看当前使用的elementUI版本的方法

    Vue项目查看当前使用的elementUI版本的方法

    今天小编就为大家分享一篇Vue项目查看当前使用的elementUI版本的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • Vue 多选框所选数量动态变换Box的高度

    Vue 多选框所选数量动态变换Box的高度

    在Web开发中,使用Vue.js框架可以通过ref属性、v-model指令和计算属性等特性实现元素高度的动态调整,文章详细介绍了如何利用Vue的功能根据多选框的选择数量动态改变元素的高度,并通过多个示例展示其应用
    2024-09-09
  • Vuex实现购物车小功能

    Vuex实现购物车小功能

    这篇文章主要为大家详细介绍了Vuex实现购物车小功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • vue如何使用driver.js实现项目功能向导指引

    vue如何使用driver.js实现项目功能向导指引

    driver.js 是一个轻量级、无依赖的原生JavaScript引擎,在整个页面中驱动用户的注意力,强大的、高度可定制的原生JavaScript引擎,无外部依赖,支持所有主流浏览器,这篇文章主要介绍了vue如何使用driver.js实现项目功能向导指引,需要的朋友可以参考下
    2023-03-03
  • 浅谈vue使用axios的回调函数中this不指向vue实例,为undefined

    浅谈vue使用axios的回调函数中this不指向vue实例,为undefined

    这篇文章主要介绍了浅谈vue使用axios的回调函数中this不指向vue实例,为undefined,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • element-ui 表格sortable排序手动js清除方式

    element-ui 表格sortable排序手动js清除方式

    这篇文章主要介绍了element-ui 表格sortable排序手动js清除方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Vue中的函数同步执行导致的数据获取失败问题处理办法

    Vue中的函数同步执行导致的数据获取失败问题处理办法

    Vue中的mount中有两个函数,第一个函数执行完后给data中的userInfo赋值,但是第二个函数获取userInfo时是空值,这种情况可能是因为第二个函数在获取 userInfo 时发生在第一个函数执行完之前,所以本文给大家介绍了Vue中的函数同步执行导致的数据获取失败问题处理办法
    2024-08-08

最新评论