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

ops/2024/12/20 19:23:30/

适用于任何类型项目: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.ppmy.cn/ops/143559.html

相关文章

iOS Delegate模式

文章目录 一、 Delegate 模式的概念二、Delegate 的实现步骤步骤 1: 定义一个协议&#xff08;Protocol&#xff09;步骤 2: 在主类中添加一个 delegate 属性步骤 3: 实现协议的类遵守协议并实现方法步骤 4: 设置 delegate 三、Delegate 模式的特点四、Delegate 模式的常见场景…

音视频入门基础:MPEG2-TS专题(18)——PES流简介

一、PES流 《T-REC-H.222.0-202106-S!!PDF-E.pdf》第32页对PES进行了定义。音视频及数字信号经过MPEG-2编码器进行数据压缩&#xff0c;形成基本码流&#xff08;ES流&#xff09;&#xff0c;ES流再打包形成带有包头的码流&#xff0c;就是PES&#xff08;Packetized Element…

CTFshow-php特性(Web125-150)

CTFshow-php特性(Web125-150) Web125 <?php error_reporting(0); highlight_file(__FILE__); include("flag.php"); $a$_SERVER[argv]; $c$_POST[fun]; if(isset($_POST[CTF_SHOW])&&isset($_POST[CTF_SHOW.COM])&&!isset($_GET[fl0g])){if(!p…

Flash Attention

文章目录 Flash Attention: 高效注意力机制解析什么是 Flash Attention&#xff1f;Flash Attention 与普通 Attention 的对比为什么选择 Flash Attention&#xff1f;优点局限性 Flash Attention 的工作原理核心机制 Flash Attention 实现代码普通 Attention 示例Flash Attent…

矩阵论:Vector-Valued Linear and Affine Functions介绍:中英双语

最近在翻看 这本书&#xff0c;对其中的一些英文概念做一些记录。 Link&#xff1a;https://web.stanford.edu/~boyd/books.html 中文版 向量值线性函数和仿射函数的详解 在机器学习、数据科学和工程应用中&#xff0c;向量值线性函数和仿射函数是非常重要的数学工具。本…

自动驾驶AVM环视算法--python版本的540投影模式

c语言版本和算法原理的可以查看本人的其他文档。《自动驾驶AVM环视算法--540度全景的算法实现和exe测试demo》本文档进用于展示部分代码的视线&#xff0c;获取方式网盘自行获取&#xff08;非免费介意勿下载&#xff09;&#xff1a;链接: https://pan.baidu.com/s/19fxwrZ3Bb…

【go每日一题】 实现生产者消费者模式

基本描述 golang使用并发编程&#xff0c;实现一个生产者消费者模式&#xff0c;消费的任务耗时1-3秒&#xff0c;希望最终10秒内能够消费尽可能多的任务 代码 package testimport ("fmt""math/rand""testing""time" )type Consume…

【python实战】-- 解压提取所有指定文件的指定内容

系列文章目录 文章目录 系列文章目录前言一、pandas是什么&#xff1f;1、需求2、程序 总结 前言 一、pandas是什么&#xff1f; 1、需求 指定目录下有若干文件 批量解压 需要汇总包含指定字符的所有文件中的指定数据 2、程序 import os import shutil import zipfile impor…