| /* 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); |
| }; |
| } |