当前位置: 首页 > news >正文

【分享一个vue指令】鼠标放置提示指令v-tooltip

描述

自定义指令 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 中移除,并设置 tooltip 为 null

鼠标移入元素,显示提示内容,如使用中所描述,会提示字符串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自定义指令开发】鼠标放置提示指令

http://www.lryc.cn/news/490294.html

相关文章:

  • 掌握 Spring 事务管理:深入理解 @Transactional 注解
  • 字符三角形
  • 【LLM】一文学会SPPO
  • 如何通过ChatGPT提高自己的编程水平
  • NVR管理平台EasyNVR多品牌NVR管理工具的流媒体视频融合与汇聚管理方案
  • python之使用django框架开发web项目
  • ChatGPT 桌面版发布了,如何安装?
  • ubuntu 配置 多个 git 客户端 账户
  • React Native的界面与交互
  • autogen+ollama+litellm实现本地部署多代理智能体
  • InstantStyle容器构建指南
  • 百度主动推送可以提升抓取,它能提升索引量吗?
  • A045-基于spring boot的个人博客系统的设计与实现
  • JavaEE 【知识改变命运】02 多线程(1)
  • Pytorch使用手册-Transforms(专题四)
  • 【Android】ARouter的使用及源码解析
  • ValueError: bbox_params must be specified for bbox transformations
  • 挂壁式空气净化器哪个品牌的质量好?排名top3优秀产品测评分析
  • 钉钉数据如何高效集成到金蝶云星空系统
  • 躺平成长-腾讯云数据库(又消失了一次)
  • 初学 flutter 问题记录
  • Hadoop的MapReduce详解
  • 全新配置ubuntu18.04深度学习环境
  • 持续集成与持续部署:CI/CD实现教程
  • 深度学习实验十二 卷积神经网络(3)——基于残差网络实现手写体数字识别实验
  • Linux系统如何排查端口占用
  • Linux常用命令之id命令详解
  • WGCLOUD如何部署在ARM平台
  • K8S + Jenkins 做CICD
  • HarmonyOS4+NEXT星河版入门与项目实战(11)------Button组件