scroll-into-view.js 824 B

123456789101112131415161718192021222324252627
  1. import Vue from 'vue';
  2. export default function scrollIntoView(container, selected) {
  3. if (Vue.prototype.$isServer) return;
  4. if (!selected) {
  5. container.scrollTop = 0;
  6. return;
  7. }
  8. const offsetParents = [];
  9. let pointer = selected.offsetParent;
  10. while (pointer && container !== pointer && container.contains(pointer)) {
  11. offsetParents.push(pointer);
  12. pointer = pointer.offsetParent;
  13. }
  14. const top = selected.offsetTop + offsetParents.reduce((prev, curr) => (prev + curr.offsetTop), 0);
  15. const bottom = top + selected.offsetHeight;
  16. const viewRectTop = container.scrollTop;
  17. const viewRectBottom = viewRectTop + container.clientHeight;
  18. if (top < viewRectTop) {
  19. container.scrollTop = top;
  20. } else if (bottom > viewRectBottom) {
  21. container.scrollTop = bottom - container.clientHeight;
  22. }
  23. }