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

【JS/TS鼠标气泡跟随】文本提示 / 操作提示

适用于任何类型项目:vue、react、angular、js、ts、jsp、jquery


 1、功能封装:


export function useMouseActionTip(text: string, parentEl: HTMLElement, offset?: XY) {
    function mousemove(e: MouseEvent) {
        const offsetX = offset?.x || 16;
        const offsetY = offset?.y || 16;
        cursorEl.style.left = e.pageX + offsetX + "px";
        cursorEl.style.top = e.pageY + offsetY + "px";
    }
    function mouseenter() {
        cursorEl.style.display = "block";
    }
    function mouseout() {
        cursorEl.style.display = "none";
    }
    const cursorEl = document.createElement("div");
    cursorEl.className = "_mouse_action_tip";
    cursorEl.innerHTML = text;
    cursorEl.style.display = "block";

    setStyle();
    document.body.appendChild(cursorEl);
    document.addEventListener("mousemove", mousemove);
    parentEl.addEventListener("mouseenter", mouseenter);
    parentEl.addEventListener("mouseout", mouseout);

    return {
        destroy() {
            document.removeEventListener("mousemove", mousemove);
            setStyle();
            parentEl.removeEventListener("mouseenter", mouseenter);
            parentEl.removeEventListener("mouseout", mouseout);
            document.body.removeChild(cursorEl);
        },
    };
}
export type UseMouseActionTip = ReturnType<typeof useMouseActionTip>;
let hasStyle = false;
function setStyle() {
    if (hasStyle) {
        return;
    }
    hasStyle = true;
    const styleElement = document.createElement("style");
    styleElement.textContent = `
    ._mouse_action_tip {
        position: fixed;
        display: flex;
        padding: 5px 10px;
        background-color: #33383e;
        color: #e8eaec;
        border-radius: 4px;
        pointer-events: none;
        z-index: 9999;
        box-shadow: rgba(255, 255, 255, 0.3) 0px 0px 3px, rgba(255, 255, 255, 0.3) 0px 0px 3px;
        font-size: 14px;
      }
    `;
    document.head.appendChild(styleElement);
}

2、使用:


let mouseTip: UseMouseActionTip | undefined;
watch(
    () => editorStore.currentSubTool,
    () => {
            if (editorStore.currentSubTool === SubTools.Measure) {
                mouseTip = useMouseActionTip(
                    t("Editor.Tip.Hold_down_and_drag_the_mouse"),
                    editorStore.canvas().canvas.upperCanvasEl
                );
            } else {
                mouseTip?.destroy();
                mouseTip = undefined;
            }
    }
);

 


http://www.kler.cn/a/442220.html

相关文章:

  • Redis瓶颈和调优
  • minio https配置
  • 关于 Cursor 的一些学习记录
  • Jupyter notebook中运行dos指令运行方法
  • 网络科技有限公司网络设计
  • 计算机组成原理(计算机系统3)--实验二:MIPS64乘法实现实验
  • access数据库代做/mysql代做/Sql server数据库代做辅导设计服务
  • Jackson @JsonRootName 注解
  • Python | 虚拟环境04 - Qt Creator设置Python虚拟环境
  • HarmonyOS Next开发工具DevEco Studio介绍:ASan与TSan检测根治你的C++恐惧症
  • 使用k6进行kafka负载测试
  • 允许某段网络访问Linux服务器上的MariaDB
  • Excel技巧:使用PowerQuery批量提取文件名
  • 如何在铁威马NAS上安装内网穿透,实现对铁威马NAS的远程访问管理
  • el-table表格嵌套子表格:展开所有内容;对当前展开行内容修改,当前行默认展开;
  • OpenCV相机标定与3D重建(24)计算两个二维点集之间的最佳仿射变换矩阵(2x3)函数estimateAffine2D()的使用
  • 【第七节】Git 进阶操作
  • 土地档案管理关系[源码+文档]
  • 包子凑数(2017年蓝桥杯试题H)
  • 提前对风险进行预警并实施管控,运用AI技术将管理推向新时代的智慧地产开源了。
  • 大腾智能CAD:国产云原生三维设计新选择
  • 基于python对网页进行爬虫简单教程
  • ISCTF复现-misc
  • docker 搭建自动唤醒UpSnap工具
  • CAN配置---波特率中断引脚等---autochips-AC7811-ARM-M3内核
  • 指针的一些题目