feat(client): allow customizing scrollOffset padding

closes #2739
pull/2750/head
Divyansh Singh 11 months ago
parent e8ebf1b048
commit 20b509c6e1

@ -267,15 +267,20 @@ export function scrollTo(el: Element, hash: string, smooth = false) {
} }
if (target) { if (target) {
const scrollOffset = siteDataRef.value.scrollOffset let scrollOffset = siteDataRef.value.scrollOffset
let offset: number = 0 let offset = 0
let padding = 24
if (typeof scrollOffset === 'object' && 'padding' in scrollOffset) {
padding = scrollOffset.padding
scrollOffset = scrollOffset.selector
}
if (typeof scrollOffset === 'number') { if (typeof scrollOffset === 'number') {
offset = scrollOffset offset = scrollOffset
} else if (typeof scrollOffset === 'string') { } else if (typeof scrollOffset === 'string') {
offset = tryOffsetSelector(scrollOffset) offset = tryOffsetSelector(scrollOffset, padding)
} else if (Array.isArray(scrollOffset)) { } else if (Array.isArray(scrollOffset)) {
for (const selector of scrollOffset) { for (const selector of scrollOffset) {
const res = tryOffsetSelector(selector) const res = tryOffsetSelector(selector, padding)
if (res) { if (res) {
offset = res offset = res
break break
@ -301,12 +306,12 @@ export function scrollTo(el: Element, hash: string, smooth = false) {
} }
} }
function tryOffsetSelector(selector: string): number { function tryOffsetSelector(selector: string, padding: number): number {
const el = document.querySelector(selector) const el = document.querySelector(selector)
if (!el) return 0 if (!el) return 0
const bot = el.getBoundingClientRect().bottom const bot = el.getBoundingClientRect().bottom
if (bot < 0) return 0 if (bot < 0) return 0
return bot + 24 return bot + padding
} }
function handleHMR(route: Route): void { function handleHMR(route: Route): void {

@ -93,7 +93,11 @@ export interface UserConfig<ThemeConfig = any>
* selector if a selector fails to match, or the matched element is not * selector if a selector fails to match, or the matched element is not
* currently visible in viewport. * currently visible in viewport.
*/ */
scrollOffset?: number | string | string[] scrollOffset?:
| number
| string
| string[]
| { selector: string | string[]; padding: number }
/** /**
* Enable MPA / zero-JS mode. * Enable MPA / zero-JS mode.

6
types/shared.d.ts vendored

@ -57,7 +57,11 @@ export interface SiteData<ThemeConfig = any> {
head: HeadConfig[] head: HeadConfig[]
appearance: boolean | 'dark' appearance: boolean | 'dark'
themeConfig: ThemeConfig themeConfig: ThemeConfig
scrollOffset: number | string | string[] scrollOffset:
| number
| string
| string[]
| { selector: string | string[]; padding: number }
locales: LocaleConfig<ThemeConfig> locales: LocaleConfig<ThemeConfig>
localeIndex?: string localeIndex?: string
contentProps?: Record<string, any> contentProps?: Record<string, any>

Loading…
Cancel
Save