mirror of
https://github.com/element-plus/element-plus.git
synced 2024-12-21 02:50:11 +08:00
37 lines
900 B
TypeScript
37 lines
900 B
TypeScript
import { isClient } from '@vueuse/core'
|
|
|
|
export default function scrollIntoView(
|
|
container: HTMLElement,
|
|
selected: HTMLElement
|
|
): void {
|
|
if (!isClient) return
|
|
|
|
if (!selected) {
|
|
container.scrollTop = 0
|
|
return
|
|
}
|
|
|
|
const offsetParents = []
|
|
let pointer = selected.offsetParent
|
|
while (
|
|
pointer !== null &&
|
|
container !== pointer &&
|
|
container.contains(pointer)
|
|
) {
|
|
offsetParents.push(pointer)
|
|
pointer = (pointer as HTMLElement).offsetParent
|
|
}
|
|
const top =
|
|
selected.offsetTop +
|
|
offsetParents.reduce((prev, curr) => prev + curr.offsetTop, 0)
|
|
const bottom = top + selected.offsetHeight
|
|
const viewRectTop = container.scrollTop
|
|
const viewRectBottom = viewRectTop + container.clientHeight
|
|
|
|
if (top < viewRectTop) {
|
|
container.scrollTop = top
|
|
} else if (bottom > viewRectBottom) {
|
|
container.scrollTop = bottom - container.clientHeight
|
|
}
|
|
}
|