首页 > 其他分享 >vue 自定义指令实现overflow-tooltip

vue 自定义指令实现overflow-tooltip

时间:2023-07-07 10:22:27浏览次数:70  
标签:function el vue 自定义 tooltip range import

利用element ui el-tooltip 组件实现

1. 创建overflow-tooltip指令

import Vue from 'vue'
/* eslint-disable */

function getStyle(obj, attr) {
  if (obj.currentStyle) {
      return obj.currentStyle[attr];
  } else {
      return getComputedStyle(obj)[attr];
  }
}

Vue.directive('overflow-tooltip', {
  bind: function (el, binding, vnode, oldVnode) {
    // 获取app.vue根节点下的 ref为tooltip的el-tooltip组件
    const tooltip = vnode.context.$root._vnode.child.$refs.tooltip
    // 给添加指令的el对象添加鼠标移入事件
    el.onmouseenter = function() {
      // 获取el.childNodes长度判断是否触发Range对象计算宽度
      const childNodesLength = el.childNodes.length
      if (childNodesLength) {
        // 使用 range 代替 scrollWidth 来判断文本是否溢出,这样做是为了解决潜在的 bug。
        const range = document.createRange();
        // 设置 range 的起点
        range.setStart(el, 0);
        // 设置 range 的终点,因为起终点都在同一个节点上,所以设置终点偏移量以选中节点的内容
        range.setEnd(el, childNodesLength);
        // 获取节点的内容的宽度
        const rangeWidth = range.getBoundingClientRect().width;
        // 获取el盒模型
        const boxSizing = getStyle(el, 'boxSizing');
        // 获取el左右pandding
        const padding = boxSizing === 'border-box' ? 0 : (parseInt(getStyle(el, 'paddingLeft'), 10) + parseInt(getStyle(el, 'paddingRight'), 10))

        if (rangeWidth + padding > el.offsetWidth || el.scrollWidth > el.offsetWidth) {
          // 改变app.vue根节点的data里tooltipContent 值(给el-tooltip组件的content设置值)
          tooltip.$parent.$data.tooltipContent = el.innerText || el.textContent;
          // 关联el
          tooltip.referenceElm = el;
          // 隐藏之前打开的popper
          tooltip.$refs.popper && (tooltip.$refs.popper.style.display = 'none');
          tooltip.doDestroy();
          tooltip.setExpectedState(true);
          tooltip.handleShowPopper()
        }
      }
    }
    // 给添加指令的dom对象添加鼠标移出事件
    el.onmouseleave = function() {
      tooltip.setExpectedState(false);
      tooltip.handleClosePopper();
    }
  },
  inserted(el, binding, vnode, oldVnode) {
  },
  update: function () {},
  componentUpdated: function () {},
  unbind: function () {}
})

2.app.vue 添加全局el-tooltip组件

<template>
  <div id="app">
    ...
    <router-view/>
    <!-- 添加全局公用el-tooltip -->
    <el-tooltip  placement="top" ref="tooltip" :content="tooltipContent"></el-tooltip>
  </div>
</template>
<script>
export default {
  data() {
    return {
     // 为el-tooltip设置content值
      tooltipContent: ''
    }
  },
  components: {
  },
  mounted() {
  },
  created() {
  },
  methods: {
  }
}
</script>

3.main.js 引入overflow-tooltip指令

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import 'element-ui/lib/theme-chalk/index.css'
import ElementUI from 'element-ui'
// 引入overflow-tooltip指令
import '@/components/overflow-tooltip'


Vue.config.productionTip = false
Vue.use(ElementUI)
Vue.use(window.ELEMENT, {
  size: 'small'
})
new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')

 

   

标签:function,el,vue,自定义,tooltip,range,import
From: https://www.cnblogs.com/ysxq/p/17534113.html

相关文章

  • vue项目打包,配置nginx反向代理
    1.将Vue项目打包在终端中执行npmrunbuild打包完成后可以在项目的dist目录看到index.html(如下图)。将此目录的所有文件放到nginx服务器即可访问。 2.下载nginx并放到服务器上http://nginx.org/en/download.html通过点击上面的链接,下载对应于自己系统的nginx,这里使用Windo......
  • vue3 ref全家桶(小满zs vue3 笔记六)
    tip1:vue3无响应式数据(控制台数据已经变化,但是页面无刷新)<template><div>认识Ref全家桶</div><div>{{message}}</div><button@click="change">改变</button></template><scriptsetuplang="ts">letmessage:s......
  • 手把手教你自定义自己SpringBoot Starter组件源码剖析
    我们知道SpringBootStarter也就是启动器。是SpringBoot组件化的一大优点。基于这个思想,基于这个思想SpringBoot才变得非常强大,官方给我们提供很多开箱即用的启动器。SpringBootStarter是SpringBoot的一个重要特性,它有以下优点:依赖管理:Starter自动处理项目的依赖关系,......
  • 前端Vue自定义精美底部操作栏导航栏工具栏 可用于电商购物车底部导航
    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。通过组件化开发,可以有效实现单独开发,单独维护,而且他们之间可以随意的进行组合。大大提升开发效率......
  • 前端Vue组件之仿京东拼多多领取优惠券弹出框popup 可用于电商商品详情领券场景使用
    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。通过组件化开发,可以有效实现单独开发,单独维护,而且他们之间可以随意的进行组合。大大提升开发效率......
  • uniapp实现这该死的自定义弹窗
    最近自己学习和写这个uniapp,刚开始规划的时候就觉得自己到时候会需要一个这个弹框,弹框里面药房input这样的东西什么的,然后就在想uniapp里面会不会没有这个modal呢?转念一想应该是会有的吧,毕竟是一个框架嘛.然后我就找找找,找了好久都没找到合适的.可能是人家有我没找到吧,最......
  • Vue(十):监视属性——watch
    1.监视属性的基本用法<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>天气案例-监视属性</title><scripttype="text/javascript"src="../js/vue.js"></script>......
  • vue(七)路由 vue-router
    安装和使用通过vue-router路由管理页面之间的关系,是Vue.js的官方路由1、安装路由npminstall--savevue-router2、配置路由文件route/index.js//导入路由库import{createRouter,createWebHashHistory}from"vue-router"//导入静态页面importHomeviewfrom"../vi......
  • 【vue-问题】vue : 无法加载文件 D:\Program Files\nodejs\node_global\vue.ps1,因
    【vue-问题】vue:无法加载文件D:\ProgramFiles\nodejs\node_global\vue.ps1,因为在此系统上禁止运行脚本。解决方法:①:管理员方式运行PowerShell,输入get-ExecutionPolicy。如果它回复Restricted,表示是禁止的②:输入:set-ExecutionPolicyRemoteSigned③:输入Y(也有可能不会询问,直......
  • vue(六)网络请求
    AxiosAxios是一个基于promise的网络请求库,安装npminstall--saveaxios局部引入:组件中引入importaxiosfrom"axios"全局引入:main.js中引入,并挂载//在main.js中全局引入importaxiosfrom"axios"//挂载到全局constapp=createApp(App)app.config.globalPrope......