valaxy-theme-sakura
Version:
<h1 align="center">valaxy-theme-sakura</h1> <pre align="center"> 一个简单、个性化、可爱的动漫风格博客主题 ❥(ゝω・✿ฺ) </pre>
55 lines (42 loc) • 1.68 kB
text/typescript
import { isClient, useCssVar, useScrollLock as useScrollLockCore } from '@vueuse/core'
import { useBackToTop } from 'valaxy'
import { lenisRef } from '../plugins/lenis'
import { useThemeConfig } from '.'
export function useScroll(options: Partial<{
scrollAnimation: boolean
scrollDamping: boolean
}> = {}) {
const themeConfig = useThemeConfig()
const { percentage, show } = useBackToTop({ offset: 100 })
const scrollAnimation = options.scrollAnimation ?? themeConfig.value.scrollAnimation
const scrollDamping = options.scrollDamping ?? themeConfig.value.scrollDamping
function scrollTo(top: number) {
if (scrollDamping) {
lenisRef.value?.scrollTo(top, { offset: 0, immediate: !scrollAnimation })
}
else {
window.scrollTo({ top, behavior: scrollAnimation ? 'smooth' : 'auto' })
}
}
function to(target: Element | string | number, offset: string | number = '--sakura-navbar-height') {
offset = typeof offset === 'string' ? Number.parseInt(useCssVar(offset).value || '', 10) : offset
const targetElement = (typeof target === 'string')
? document.querySelector(target)
: (target instanceof Element ? target : null)
if (!targetElement) {
console.warn('Target element not found:', target)
return
}
scrollTo(targetElement.clientHeight - offset)
}
const toTop = () => scrollTo(0)
const toDown = () => to('.sakura-hero')
return { to, toTop, toDown, percentage, show }
}
export function useScrollLock() {
const themeConfig = useThemeConfig()
if (!themeConfig.value.scrollLock)
return
const isLocked = useScrollLockCore(isClient ? document.body : null)
return isLocked
}