diff options
| author | Fuwn <[email protected]> | 2024-01-13 18:49:32 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2024-01-13 18:49:32 -0800 |
| commit | 65f4655898512941785a4031360c1bf7ba3eecdb (patch) | |
| tree | f1dfa0ccfbc70acc9ffe1203c2d252128f7f4bcc /src/lib/Tooltip/tooltip.ts | |
| parent | feat(user): radius and middle align (diff) | |
| download | due.moe-65f4655898512941785a4031360c1bf7ba3eecdb.tar.xz due.moe-65f4655898512941785a4031360c1bf7ba3eecdb.zip | |
feat(lib): tooltip action
Diffstat (limited to 'src/lib/Tooltip/tooltip.ts')
| -rw-r--r-- | src/lib/Tooltip/tooltip.ts | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/lib/Tooltip/tooltip.ts b/src/lib/Tooltip/tooltip.ts new file mode 100644 index 00000000..fd1428f4 --- /dev/null +++ b/src/lib/Tooltip/tooltip.ts @@ -0,0 +1,58 @@ +const tooltip = (element: HTMLElement) => { + let div: HTMLDivElement; + let title: string | null; + const offset = 10; + let timer: number; + + const mouseOver = (event: MouseEvent) => { + title = element.getAttribute('title'); + + element.removeAttribute('title'); + + timer = window.setTimeout(() => { + div = document.createElement('div'); + div.textContent = title; + + div.setAttribute( + 'style', + `position: absolute; + top: -${event.pageX - div.offsetWidth / 2}px; + left: -${event.pageY - div.offsetHeight - offset / 2}px;` + ); + + div.classList.add('card'); + div.classList.add('card-small'); + document.body.appendChild(div); + }, 0); + }; + + const mouseMove = (event: MouseEvent) => { + if (div) { + div.style.left = `${event.pageX - div.offsetWidth / 2}px`; + div.style.top = `${event.pageY - div.offsetHeight - offset / 2}px`; + } + }; + + const mouseLeave = () => { + clearTimeout(timer); + + if (div) { + document.body.removeChild(div); + element.setAttribute('title', title as string); + } + }; + + element.addEventListener('mouseover', mouseOver); + element.addEventListener('mouseleave', mouseLeave); + element.addEventListener('mousemove', mouseMove); + + return { + destroy() { + element.removeEventListener('mouseover', mouseOver); + element.removeEventListener('mouseleave', mouseLeave); + element.removeEventListener('mousemove', mouseMove); + } + }; +}; + +export default tooltip; |