首页 > 其他分享 >文本溢出时,悬浮显示,使用自定义指令

文本溢出时,悬浮显示,使用自定义指令

时间:2024-09-13 20:06:40浏览次数:12  
标签:el tooltipVM const 自定义 悬浮 ctx tooltip range 文本

单行溢出代码
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
多行溢出代码
overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; word-break: break-all; -webkit-box-orient: vertical;

JS文件

import Vue from 'vue';
import { Tooltip } from 'element-ui';
Vue.use(Tooltip);
let tooltipContent
let props
const ctx = '@@store'
// 创建一个Vue实例并渲染为真实DOM,内有一个空的el-tooltip组件
const vm = new Vue({
  render (h) {
    return (<Tooltip ref="customToolTipRef" popper-class="item-popper" placement="top" content={ tooltipContent } { ...{ props } }></Tooltip>)
  }
}).$mount()
const tooltipVM = vm.$refs.customToolTipRef

import debounce from 'throttle-debounce/debounce';
const activateTooltip = debounce(50, tooltipVM => tooltipVM.handleShowPopper());



const overflowHandler = (el, binding, vnode) => {
  
  // 获取元素文本内容,作为el-tooltip的默认content进行展示
  el[ctx].tooltipContent = el.innerText || el.textContent
  // 获取通过指令接收的绑定值
  el[ctx].props = { ...binding.value }
  const computedStyle = getComputedStyle(el)
  // 使用range对象判断文本是否有溢出,优先考虑使用range对象, 因为 scrollWidth 属性在火狐浏览器 v32 版本中有 bug。当元素的 CSS 属性中使用了 text-overflow: ellipsis 和 box-sizing: border-box 时获取到的 scrollWidth 的值会比真实值偏小
  const range = document.createRange()
  range.setStart(el, 0)
  range.setEnd(el, el.childNodes.length)
  const rangeDOM = range.getBoundingClientRect()
  const padding = parseInt(computedStyle.paddingLeft.replace('px', '')) + parseInt(computedStyle.paddingRight.replace('px', ''))
  const rangeWidth = Math.round(rangeDOM.width)
 
  if (rangeWidth + padding > el.offsetWidth || el.scrollWidth > el.offsetWidth || el.scrollHeight > el.offsetHeight) {
    // 文本溢出了,绑定鼠标事件
    el.addEventListener('mouseenter', el[ctx].handleMouseEnter)
    el.addEventListener('mouseleave', el[ctx].handleMouseLeave)
  } else {
    // 文本未溢出,移除鼠标事件
    el.removeEventListener('mouseenter', el[ctx].handleMouseEnter)
    el.removeEventListener('mouseleave', el[ctx].handleMouseLeave)
  }
}

Vue.directive('overflowTooltip', {
    // 只调用一次,指令第一次绑定到元素时调用。在这里进行一次初始化设置,初始化鼠标事件,控制el-tooltip的展开与收起
  bind: function (el, binding, vnode) {
    el[ctx] = {
      tooltipContent: '',
      props: {},
      handleMouseEnter: () => {
        
        // 展开el-tooltip方法,将el-tooltip的引用元素指向当前绑定节点,然后执行展开逻辑
        tooltipContent = el[ctx].tooltipContent
        props = el[ctx].props
        vm.$forceUpdate()
        tooltipVM.referenceElm = el
        tooltipVM.$refs.popper && (tooltipVM.$refs.popper.style.display = 'none')
        tooltipVM.doDestroy()
        tooltipVM.setExpectedState(true)
        activateTooltip(tooltipVM)
      },
      handleMouseLeave: () => {
        // 关闭el-tooltip方法,销毁内部popperJS的实例后走关闭逻辑
        tooltipVM.doDestroy()
        tooltipVM.setExpectedState(false)
        tooltipVM.handleClosePopper()
      }
    }
  },
  inserted: overflowHandler,
  componentUpdated: overflowHandler,
  unbind (el) {
    delete el[ctx]
  }

})

main.js引入
import '@/utils/tooltip'
设置溢出后,悬浮显示
<div class="item-title" v-overflow-tooltip="{content:'筹备召开公司科技大会。完成科技大会组织方案(内部讨论版)编制'}">筹备召开公司科技大会。完成科技大会组织方案(内部讨论版)编制</div>
参考网址
https://juejin.cn/post/7411160922645446690

标签:el,tooltipVM,const,自定义,悬浮,ctx,tooltip,range,文本
From: https://www.cnblogs.com/mengqc1995/p/18412790

相关文章

  • 10、Linux文本编辑器
    文本编辑器常见文本编辑器WindowsNotepad(记事本)SublimeUltraEditLinuxVI/VIMnanoEmacsSedgeditKateVI和VIM的区别VI全称:VisualInterface创建时间:1976年创建者:BillJoyVIM全称:VIIMproved,即VI的升级版创建时间:1991年创建者:BramMoolenaar特点......
  • ros 自定义消息(图像+标志位+位姿)python和c++发布和接受
      编译 脚本 v3_gaosi_img_pose_flag.sh#!/bin/bash#外部给与执行权限#sudochmod+xrun_ros_nodes.sh#定义ROS安装路径#安装时候添加到系统路径了不需要每次都sourceROS_SETUP="/opt/ros/noetic/setup.bash"#定义工作目录路径自己的工程没有加到系......
  • 9、查看和处理文件内容(文本文件)
    文本文件和二进制文件文本文件编码格式:ASCII,UTF-8,Unicode,ANSI常见类型:.txt,.xml,.conf,.properties,.yml等配置文件、日志文件、源代码二进制文件常见类型:可执行程序、图片、视频、音频文件操作命令cat英文全称:concatenate(连接)功能:连接文件并打印到标准......
  • echarts X轴文本太长 formatter自定义文本的显示方式
    如果ECharts中X轴的文本太长,可以通过设置axisLabel的rotate属性来旋转标签,或者使用formatter函数来自定义文本的显示方式。另外,可以开启axisLabel的interval属性来控制显示的标签的间隔。option={tooltip:{},xAxis:{type:'category',data:['这是一段非......
  • SAP B1 单据页面自定义 - 用户界面编辑字段
    背景接《SAPB1基础实操-用户定义字段(UDF)》,在设置完自定义字段后,如下图,通过打开【用户定义字段】可打开表单右侧的自定义字段页。然而再开打一页附加页面操作繁复,若是客户常用的定义字段,也可以把这些用户定义字段自由编辑入左侧原始表单中,本文将详细介绍。操作1.字......
  • 如何在PbootCMS前台调用自定义表单?PbootCMS自定义调用代码说明
    要在PbootCMS前台调用自定义表单,可以按照以下详细步骤进行操作:1.创建自定义表单登录后台:登录PbootCMS后台管理系统。创建表单:进入表单管理模块。点击“新建表单”,填写表单的基本信息(如表单名称)。添加所需的字段(如姓名、邮箱、电话等)。保存表单。2.在模板文件......
  • 基于深度学习的文本引导的图像编辑
    基于深度学习的文本引导的图像编辑(Text-GuidedImageEditing)是一种通过自然语言文本指令对图像进行编辑或修改的技术。它结合了图像生成和自然语言处理(NLP)的最新进展,使用户能够通过描述性文本对图像内容进行精确的调整和操控。1.文本引导的图像编辑的挑战文本和图像之间的......
  • CSS文本超出后隐藏并显示省略号及其他浏览器兼容方案
    废话不多说,先上代码!1、只显示一行文字后隐藏并省略//只显示一行文字后省略.element{ width:300px;/*需要设置一个固定宽度*/ white-space:nowrap;/*强制单行显示,不换行*/ overflow:hidden;/*超出盒子部分隐藏*/ text-o......
  • 自定义转场
    在iOS中,自定义转场动画可以通过实现UIViewControllerAnimatedTransitioning协议来为模态(modal)和推送(push)转场提供自定义动画。以下是这两种转场的具体实现方式:1.自定义模态转场Step1:创建转场代理创建一个遵循UIViewControllerAnimatedTransitioning协议的类:importUIK......
  • ByteTrak训练自定义训练集
    ByteTrack目标追踪训练主要参考的博文是https://blog.csdn.net/Ddddd4431/article/details/126910083但是这位博主的数据集准备跟我的还有点不一样,他用的是labelimg标注,我用的是Darklabel对视频直接进行标注。而ByteTrak的训练格式是COCO数据集格式。而Darklabel对视频标注生......