vue-hooks-plus
Version:
Vue hooks library
60 lines (59 loc) • 1.86 kB
JavaScript
const vue = require("vue");
const domTarget = require("../utils/domTarget");
const useEffectWithTarget = require("../utils/useEffectWithTarget");
const _interopDefaultLegacy = (e) => e && typeof e === "object" && "default" in e ? e : { default: e };
const useEffectWithTarget__default = /* @__PURE__ */ _interopDefaultLegacy(useEffectWithTarget);
function useScroll(target, shouldUpdate = () => true) {
const position = vue.ref();
const shouldUpdateRef = vue.ref(shouldUpdate);
useEffectWithTarget__default.default(
() => {
const el = domTarget.getTargetElement(target, document);
if (!el) {
return;
}
const updatePosition = () => {
let newPosition;
if (el === document) {
if (document.scrollingElement) {
newPosition = {
left: document.scrollingElement.scrollLeft,
top: document.scrollingElement.scrollTop
};
} else {
newPosition = {
left: Math.max(
window.pageYOffset,
document.documentElement.scrollTop,
document.body.scrollTop
),
top: Math.max(
window.pageXOffset,
document.documentElement.scrollLeft,
document.body.scrollLeft
)
};
}
} else {
newPosition = {
left: el.scrollLeft,
top: el.scrollTop
};
}
if (shouldUpdateRef.value(newPosition)) {
position.value = newPosition;
}
};
updatePosition();
el.addEventListener("scroll", updatePosition);
return () => {
el.removeEventListener("scroll", updatePosition);
};
},
[],
target
);
return vue.readonly(position);
}
module.exports = useScroll;
;