|
4 | 4 | * @LastEditTime: 2024/02/13 14:05:16 |
5 | 5 | * @description: 为元素添加返回顶部功能 |
6 | 6 | */ |
7 | | -import { Directive, DirectiveBinding } from 'vue'; |
| 7 | +import type { Directive, DirectiveBinding } from 'vue' |
8 | 8 |
|
9 | 9 | interface BackTopElement extends HTMLElement { |
10 | | - style: CSSStyleDeclaration; |
| 10 | + style: CSSStyleDeclaration |
11 | 11 | } |
12 | 12 |
|
13 | 13 | // 定义通用的滚动元素接口 |
14 | 14 | interface ScrollableElement extends HTMLElement { |
15 | | - scrollTop: number; |
| 15 | + scrollTop: number |
16 | 16 | } |
17 | 17 |
|
18 | 18 | const vBackTop: Directive = { |
19 | 19 | mounted(el: BackTopElement, binding: DirectiveBinding<number | undefined>) { |
20 | | - const target = binding.arg ? document.getElementById(binding.arg) as (Window | HTMLElement) : window; |
21 | | - el.addEventListener("click", () => { |
| 20 | + const target = binding.arg ? document.getElementById(binding.arg) as (Window | HTMLElement) : window |
| 21 | + el.addEventListener('click', () => { |
22 | 22 | target.scrollTo({ |
| 23 | + behavior: 'smooth', |
23 | 24 | top: 0, |
24 | | - behavior: "smooth", |
25 | | - }); |
26 | | - }); |
| 25 | + }) |
| 26 | + }) |
27 | 27 | const handleScroll = () => { |
28 | | - const isScrolledUp = (target as ScrollableElement).scrollTop < (binding.value as number); |
29 | | - el.style.visibility = isScrolledUp ? "hidden" : "unset"; |
30 | | - }; |
31 | | - if ((target as ScrollableElement).scrollTop < (binding.value as number)) { |
32 | | - el.style.visibility = "hidden"; |
| 28 | + const isScrolledUp = (target as ScrollableElement).scrollTop < (binding.value as number) |
| 29 | + el.style.visibility = isScrolledUp ? 'hidden' : 'unset' |
33 | 30 | } |
34 | | - (target as ScrollableElement).addEventListener("scroll", handleScroll); |
35 | | - }, |
36 | | - updated(el: BackTopElement, binding: DirectiveBinding<number | undefined>) { |
37 | | - const target = binding.arg ? document.getElementById(binding.arg) as (Window | HTMLElement) : window; |
38 | | - const handleScroll = () => { |
39 | | - const isScrolledUp = (target as ScrollableElement).scrollTop < (binding.value as number); |
40 | | - el.style.visibility = isScrolledUp ? "hidden" : "unset"; |
41 | | - }; |
| 31 | + if ((target as ScrollableElement).scrollTop < (binding.value as number)) |
| 32 | + el.style.visibility = 'hidden'; |
42 | 33 |
|
43 | | - if (binding.value !== undefined) { |
44 | | - (target as ScrollableElement).addEventListener("scroll", handleScroll); |
45 | | - } else { |
46 | | - (target as ScrollableElement).removeEventListener("scroll", handleScroll); |
47 | | - } |
| 34 | + (target as ScrollableElement).addEventListener('scroll', handleScroll) |
48 | 35 | }, |
49 | 36 | unmounted(el: BackTopElement, binding: DirectiveBinding<number | undefined>) { |
50 | | - const target = binding.arg ? document.getElementById(binding.arg) as (Window | HTMLElement) : window; |
| 37 | + const target = binding.arg ? document.getElementById(binding.arg) as (Window | HTMLElement) : window |
51 | 38 | const handleScroll = () => { |
52 | | - const isScrolledUp = (target as ScrollableElement).scrollTop < (binding.value as number); |
53 | | - el.style.visibility = isScrolledUp ? "hidden" : "unset"; |
| 39 | + const isScrolledUp = (target as ScrollableElement).scrollTop < (binding.value as number) |
| 40 | + el.style.visibility = isScrolledUp ? 'hidden' : 'unset' |
54 | 41 | }; |
55 | 42 |
|
56 | | - (target as ScrollableElement).removeEventListener("scroll", handleScroll); |
57 | | - el.removeEventListener("click", handleScroll) |
| 43 | + (target as ScrollableElement).removeEventListener('scroll', handleScroll) |
| 44 | + el.removeEventListener('click', handleScroll) |
58 | 45 | }, |
59 | | -}; |
| 46 | + updated(el: BackTopElement, binding: DirectiveBinding<number | undefined>) { |
| 47 | + const target = binding.arg ? document.getElementById(binding.arg) as (Window | HTMLElement) : window |
| 48 | + const handleScroll = () => { |
| 49 | + const isScrolledUp = (target as ScrollableElement).scrollTop < (binding.value as number) |
| 50 | + el.style.visibility = isScrolledUp ? 'hidden' : 'unset' |
| 51 | + } |
60 | 52 |
|
61 | | -export default vBackTop; |
| 53 | + if (binding.value !== undefined) |
| 54 | + (target as ScrollableElement).addEventListener('scroll', handleScroll) |
| 55 | + else |
| 56 | + (target as ScrollableElement).removeEventListener('scroll', handleScroll) |
| 57 | + }, |
| 58 | +} |
62 | 59 |
|
| 60 | +export default vBackTop |
0 commit comments