自定义VUE指定,实现鼠标悬停显示提示面板,离开元素或面板后面板消失

参考文档:https://www.bilibili.com/opus/500023412612186477

javascript 复制代码
// 自定义"v-tooltip"指令,实现鼠标悬浮显示文本
Vue.directive('tooltip', {
    bind(element, binding) {
        const tooltipText = binding.value;
        const tooltip = document.createElement('div');
        tooltip.innerHTML = tooltipText;
        tooltip.style.position = 'absolute';
        tooltip.style.display = 'none';
        tooltip.style.background = '#ffffff';
        tooltip.style.borderRadius = '4px';
        tooltip.style.width = '95%';
        tooltip.style.margin = '0px 40px';
        tooltip.style.padding = '5px 10px';
        tooltip.style.fontSize = '12px';
        tooltip.style.textAlign = 'left';
        tooltip.style.zIndex = '1000';
        document.body.appendChild(tooltip);

        // 执行鼠标悬停在元素和面板上展示,离开后面板消失。
        setSecondaryMenu(element, tooltip, 1000);
    }
});

/**
 * 给两个元素绑定事件,鼠标悬停在元素和面板上展示,离开后面板消失。
 * 原理:
 * 鼠标放到按钮上,面板显示出来,鼠标移出按钮,面板延迟dt毫秒消失。
 * 鼠标移出后,面板消失之前,移动到面板上,取消面板的延迟消失
 * 鼠标移出面板后,同样延时dt毫秒消失
 * @param {*} element 鼠标悬停的元素
 * @param {*} tooltip 面板元素
 * @param {*} delayTime 延迟消失的时间,毫秒(ms)
 */
function setSecondaryMenu(element, tooltip, delayTime) {
    /** 鼠标移开按钮后面板延迟消失的时间(ms) */
    var delayTask;

    /**鼠标移入按钮 */
    element.addEventListener("mouseenter", (event) => {
        let rect = element.getBoundingClientRect();
        tooltip.style.display = 'block';
        tooltip.style.top = rect.bottom + 'px';
        clearTimeout(delayTask);
    });
    /**鼠标移出按钮 */
    element.addEventListener("mouseleave", (event) => {
        delayTask = setTimeout(() => {
            tooltip.style.display = 'none';
        }, delayTime);
    });
    /**鼠标移入面板 */
    tooltip.addEventListener("mouseenter", (event) => {
        clearTimeout(delayTask);
    });
    /**鼠标移出面板 */
    tooltip.addEventListener("mouseleave", (event) => {
        delayTask = setTimeout(() => {
            tooltip.style.display = 'none';
        }, delayTime);
    });
}
相关推荐
晗夜未央44 分钟前
任务队列反复失败,先分清重试、阻塞和结果待核对
开发语言·javascript
锋行天下1 小时前
DeepSeek写Langgraph就是个大傻逼,一本正经胡说八道
前端·人工智能·后端
jktantan2 小时前
每个节点 41 字节:把一棵百万节点树拆进 14 个 typed array
前端·javascript·vue.js·算法·typescript
计算机魔术师2 小时前
Anthropic官方插件被「寄生」,背后是同一类攻击又来了
前端
我命由我123452 小时前
访客系统形式(有用户概念、无用户概念)
java·开发语言·前端·javascript·python·产品运营·产品经理
key_3_feng2 小时前
评估与对齐:Agent 自我进化的护栏
前端·数据库·agent
程序员大阳3 小时前
副队长JavaScript教程(65)-详解JSON:轻量级数据交换格式
javascript·json·序列化·反序列化·stringify·parse
LaughingZhu3 小时前
Product Hunt 热榜 2026-10-30:Empacer、Scape、Floot in ChatGPT
java·前端·数据库·人工智能·chatgpt·notion
Lank_M3 小时前
抠图结果缩放后边缘发脏,该怪的不是插值
前端
jerrywus3 小时前
Skill、MCP、Workflow、Rules、Memory 有什么区别?拿几次真实开发任务讲清楚
前端·agent·claude