【10分钟学习Vue自定义指令开发】鼠标放置提示指令

描述

自定义指令 v-tooltip

  • mounted(el, binding):当元素被挂载到DOM上时,这个钩子会被调用。

    • el 是指令绑定的元素,binding 包含了指令的值,即 binding.value,这里是 clickOutside 字符串。
    • tooltip 变量用于存储创建的提示框元素。
  • isOverflowing() :这是一个辅助函数,用于检查元素的文本内容是否超出了其宽度。如果 scrollWidth(元素内容的宽度)大于 clientWidth(元素可视宽度),则返回 true,表示内容溢出。

  • createTooltip():这个函数用于创建提示框。

    • 创建一个新的 div 元素作为提示框,并设置其文本内容为指令的值或元素的文本内容。
    • 设置提示框的样式,包括位置、背景颜色、文字颜色、内边距、边框圆角、层级和最大宽度。
    • 将提示框添加到 document.body 中。
    • 根据元素的位置和大小调整提示框的位置,使其显示在元素的下方。
  • 鼠标移入事件 :当鼠标移入元素时,会触发 mouseenter 事件。

    • 如果元素的内容溢出,即 isOverflowing() 返回 true,则调用 createTooltip() 创建提示框。
  • 鼠标移出事件 :当鼠标移出元素时,会触发 mouseleave 事件。

    • 如果存在提示框,则将其从 document.body 中移除,并设置 tooltipnull

鼠标移入元素,显示提示内容,如使用中所描述,会提示字符串clickOutside

使用

复制代码
<div v-tooltip="clickOutside">
  <input />
</div>

代码

复制代码
/* 鼠标提示信息 */
  app.directive('tooltip', {
    mounted(el, binding) {
      let tooltip;

      // 检查内容是否超出标签宽度
      const isOverflowing = () => {
        console.log(el, el.scrollWidth, el.clientWidth, el.scrollWidth > el.clientWidth)
        return el.scrollWidth > el.clientWidth;
      };

      // 创建工具提示
      const createTooltip = () => {
        tooltip = document.createElement('div');
        tooltip.textContent = binding.value || el.textContent;
        tooltip.style.position = 'absolute';
        tooltip.style.backgroundColor = '#333';
        tooltip.style.color = '#fff';
        tooltip.style.padding = '5px 10px';
        tooltip.style.borderRadius = '4px';
        tooltip.style.zIndex = '1000';
        tooltip.style.maxWidth = `${el.clientWidth * 2}px`; // 限制为元素宽度

        document.body.appendChild(tooltip);

        const rect = el.getBoundingClientRect();
        tooltip.style.top = `${rect.bottom + 5}px`; // 调整到元素下方5px处
        tooltip.style.left = `${rect.left + 10}px`;
      };

      // 鼠标移入事件
      el.addEventListener('mouseenter', () => {
        if (isOverflowing()) {
          createTooltip();
        }
      });

      // 鼠标移出事件
      el.addEventListener('mouseleave', () => {
        if (tooltip) {
          document.body.removeChild(tooltip);
          tooltip = null;
        }
      });
    }
  });

拓展

【10分钟学习Vue自定义指令开发】复制指令v-copy

【10分钟学习Vue自定义指令开发】元素变化指令

【10分钟学习Vue自定义指令开发】鼠标放置提示指令

相关推荐
落日沉溺于海9 小时前
React From表单使用Formik和yup进行校验
开发语言·前端·javascript
知识分享小能手9 小时前
React学习教程,从入门到精通, React 新创建组件语法知识点及案例代码(11)
前端·javascript·学习·react.js·架构·前端框架·react
会豪9 小时前
工业仿真(simulation)--前端(五)--标尺,刻度尺
前端
会豪9 小时前
工业仿真(simulation)--前端(四)--画布编辑(2)
前端
an__ya__9 小时前
Vue数据响应式reactive
前端·javascript·vue.js
苦逼的搬砖工9 小时前
Flutter UI Components:闲来无事,设计整理了这几年来使用的UI组件库
前端·flutter
想买Rolex和Supra的凯美瑞车主9 小时前
Taro + Vite 开发中 fs.allow 配置问题分析与解决
前端
ruanCat9 小时前
使用 vite 的 base 命令行参数来解决项目部署在 github page 的路径问题
前端·github
Codebee10 小时前
使用Qoder 改造前端UI/UE升级改造实践:从传统界面到现代化体验的华丽蜕变
前端·人工智能
叶落阁主10 小时前
Neovim 插件 i18n.nvim 介绍
java·vue.js·vim