2020-07-28 00:32:04 +08:00
|
|
|
import isServer from './isServer'
|
|
|
|
|
|
|
|
export default function scrollIntoView(
|
|
|
|
container: HTMLElement,
|
|
|
|
selected: HTMLElement,
|
2020-07-29 15:09:29 +08:00
|
|
|
): void {
|
2020-07-28 00:32:04 +08:00
|
|
|
if (isServer) 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
|
|
|
|
}
|
|
|
|
}
|