useScrollReveal.ts 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. /*
  2. * @Author: LiZhiWei
  3. * @Date: 2026-01-22 10:31:06
  4. * @LastEditors: LiZhiWei
  5. * @LastEditTime: 2026-01-22 10:45:30
  6. * @Description:
  7. */
  8. import { ref, onMounted, isRef, type Ref } from 'vue'
  9. export const useScrollReveal = (
  10. targetOrThreshold: Ref<HTMLElement | null> | number = 0.1,
  11. threshold = 0.1
  12. ) => {
  13. let targetRef: Ref<HTMLElement | null>
  14. let actualThreshold = threshold
  15. if (isRef(targetOrThreshold)) {
  16. targetRef = targetOrThreshold
  17. } else {
  18. targetRef = ref(null)
  19. if (typeof targetOrThreshold === 'number') {
  20. actualThreshold = targetOrThreshold
  21. }
  22. }
  23. const isVisible = ref(false)
  24. onMounted(() => {
  25. const observer = new IntersectionObserver(
  26. (entries) => {
  27. entries.forEach((entry) => {
  28. if (!entry.isIntersecting) return
  29. isVisible.value = true
  30. observer.unobserve(entry.target)
  31. })
  32. },
  33. { threshold: actualThreshold }
  34. )
  35. if (targetRef.value) {
  36. observer.observe(targetRef.value)
  37. }
  38. })
  39. return {
  40. targetRef,
  41. isVisible,
  42. }
  43. }