index.ts
9 months ago
useModal.ts
9 months ago
useOverviewData.ts
9 months ago
useReachUrls.ts
9 months ago
useScrollLock.ts
9 months ago
useToast.ts
9 months ago
useScrollLock.ts
44 lines
| 1 | import { ref } from 'vue'; |
| 2 | |
| 3 | const scrollLockCount = ref(0); |
| 4 | const originalBodyStyles = ref<{ |
| 5 | overflow: string; |
| 6 | paddingRight: string; |
| 7 | } | null>(null); |
| 8 | |
| 9 | export const useScrollLock = () => { |
| 10 | const lockScroll = () => { |
| 11 | scrollLockCount.value++; |
| 12 | |
| 13 | if (scrollLockCount.value === 1) { |
| 14 | originalBodyStyles.value = { |
| 15 | overflow: document.body.style.overflow, |
| 16 | paddingRight: document.body.style.paddingRight |
| 17 | }; |
| 18 | |
| 19 | const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth; |
| 20 | |
| 21 | document.body.style.overflow = 'hidden'; |
| 22 | if (scrollbarWidth > 0) { |
| 23 | document.body.style.paddingRight = `${scrollbarWidth}px`; |
| 24 | } |
| 25 | } |
| 26 | }; |
| 27 | |
| 28 | const unlockScroll = () => { |
| 29 | scrollLockCount.value = Math.max(0, scrollLockCount.value - 1); |
| 30 | |
| 31 | if (scrollLockCount.value === 0 && originalBodyStyles.value) { |
| 32 | document.body.style.overflow = originalBodyStyles.value.overflow; |
| 33 | document.body.style.paddingRight = originalBodyStyles.value.paddingRight; |
| 34 | originalBodyStyles.value = null; |
| 35 | } |
| 36 | }; |
| 37 | |
| 38 | return { |
| 39 | lockScroll, |
| 40 | unlockScroll, |
| 41 | isLocked: () => scrollLockCount.value > 0 |
| 42 | }; |
| 43 | }; |
| 44 |