36 lines
1.2 KiB
JavaScript
36 lines
1.2 KiB
JavaScript
|
/* eslint-disable no-nested-ternary */
|
||
|
import { cancel, request } from './animationFrame';
|
||
|
import height from './height';
|
||
|
import getWindow from './isWindow';
|
||
|
import getOffset from './offset';
|
||
|
import getScrollParent from './scrollParent';
|
||
|
import scrollTop from './scrollTop';
|
||
|
export default function scrollTo(selected, scrollParent) {
|
||
|
var offset = getOffset(selected);
|
||
|
var poff = {
|
||
|
top: 0,
|
||
|
left: 0
|
||
|
};
|
||
|
if (!selected) return undefined;
|
||
|
var list = scrollParent || getScrollParent(selected);
|
||
|
var isWin = getWindow(list);
|
||
|
var listScrollTop = scrollTop(list);
|
||
|
var listHeight = height(list, true);
|
||
|
if (!isWin) poff = getOffset(list);
|
||
|
offset = {
|
||
|
top: offset.top - poff.top,
|
||
|
left: offset.left - poff.left,
|
||
|
height: offset.height,
|
||
|
width: offset.width
|
||
|
};
|
||
|
var selectedHeight = offset.height;
|
||
|
var selectedTop = offset.top + (isWin ? 0 : listScrollTop);
|
||
|
var bottom = selectedTop + selectedHeight;
|
||
|
listScrollTop = listScrollTop > selectedTop ? selectedTop : bottom > listScrollTop + listHeight ? bottom - listHeight : listScrollTop;
|
||
|
var id = request(function () {
|
||
|
return scrollTop(list, listScrollTop);
|
||
|
});
|
||
|
return function () {
|
||
|
return cancel(id);
|
||
|
};
|
||
|
}
|