index.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import compute from 'compute-scroll-into-view';
  2. function isOptionsObject(options) {
  3. return options === Object(options) && Object.keys(options).length !== 0;
  4. }
  5. function defaultBehavior(actions, behavior) {
  6. if (behavior === void 0) {
  7. behavior = 'auto';
  8. }
  9. var canSmoothScroll = ('scrollBehavior' in document.body.style);
  10. actions.forEach(function (_ref) {
  11. var el = _ref.el,
  12. top = _ref.top,
  13. left = _ref.left;
  14. if (el.scroll && canSmoothScroll) {
  15. el.scroll({
  16. top: top,
  17. left: left,
  18. behavior: behavior
  19. });
  20. } else {
  21. el.scrollTop = top;
  22. el.scrollLeft = left;
  23. }
  24. });
  25. }
  26. function getOptions(options) {
  27. if (options === false) {
  28. return {
  29. block: 'end',
  30. inline: 'nearest'
  31. };
  32. }
  33. if (isOptionsObject(options)) {
  34. return options;
  35. }
  36. return {
  37. block: 'start',
  38. inline: 'nearest'
  39. };
  40. }
  41. function scrollIntoView(target, options) {
  42. var isTargetAttached = target.isConnected || target.ownerDocument.documentElement.contains(target);
  43. if (isOptionsObject(options) && typeof options.behavior === 'function') {
  44. return options.behavior(isTargetAttached ? compute(target, options) : []);
  45. }
  46. if (!isTargetAttached) {
  47. return;
  48. }
  49. var computeOptions = getOptions(options);
  50. return defaultBehavior(compute(target, computeOptions), computeOptions.behavior);
  51. }
  52. export default scrollIntoView;