vue-hooks-plus
Version:
Vue hooks library
65 lines (64 loc) • 1.99 kB
JavaScript
const vue = require("vue");
const useResizeObserver = require("../useResizeObserver");
const useEventListener = require("../useEventListener");
const domTarget = require("../utils/domTarget");
const _interopDefaultLegacy = (e) => e && typeof e === "object" && "default" in e ? e : { default: e };
const useResizeObserver__default = /* @__PURE__ */ _interopDefaultLegacy(useResizeObserver);
const useEventListener__default = /* @__PURE__ */ _interopDefaultLegacy(useEventListener);
function keyisUseElementBoundingReturnTypeKey(key) {
return ["width", "height", "top", "left", "bottom", "right"].includes(key);
}
function useElementBounding(target, options) {
const { reset = true, windowResize = true, windowScroll = true, immediate = true } = options != null ? options : {};
const size = vue.reactive({
width: 0,
height: 0,
top: 0,
left: 0,
bottom: 0,
right: 0
});
const update = () => {
const targetDom = domTarget.getTargetElement(target);
if (!targetDom) {
if (reset) {
Object.keys(size).forEach((key) => {
if (keyisUseElementBoundingReturnTypeKey(key))
size[key] = 0;
});
}
return;
}
if (targetDom) {
const { width, height, top, left, bottom, right } = targetDom.getBoundingClientRect();
size.width = width;
size.height = height;
size.top = top;
size.left = left;
size.bottom = bottom;
size.right = right;
}
};
if (windowResize) {
useEventListener__default.default("resize", update, {
passive: true
});
}
if (windowScroll) {
useEventListener__default.default("scroll", update, {
capture: true,
passive: true
});
}
useResizeObserver__default.default(target, update);
vue.watch(() => domTarget.getTargetElement(target), update);
vue.onMounted(() => {
if (immediate)
update();
});
return {
...vue.toRefs(size)
};
}
module.exports = useElementBounding;
;