@opensig/opendesign
Version:
54 lines (53 loc) • 1.38 kB
JavaScript
function createAxisSelector(isHorizontal) {
const h = () => isHorizontal.value;
return {
getScroll: (el) => h() ? el.scrollLeft : el.scrollTop,
setScroll: (el, val) => {
if (h()) {
el.scrollLeft = val;
} else {
el.scrollTop = val;
}
},
getAxisSize: (el) => h() ? el.offsetWidth : el.offsetHeight,
getScrollSize: (el) => h() ? el.scrollWidth : el.scrollHeight,
getClientSize: (el) => h() ? el.clientWidth : el.clientHeight,
scrollToPos: (el, pos, behavior) => {
el.scrollTo({
[h() ? "left" : "top"]: pos,
behavior
});
}
};
}
function calculateScrollTarget(itemTop, align, sizes) {
const { containerSize, itemSize } = sizes;
if (align === "start") {
return itemTop;
}
if (align === "center") {
return itemTop - containerSize / 2 + itemSize / 2;
}
if (align === "end") {
return itemTop - containerSize + itemSize;
}
if (typeof align === "number") {
return itemTop - align;
}
return itemTop;
}
function resolveNearestAlign(viewport) {
const { currentScroll, itemTop, itemSize, containerSize } = viewport;
if (currentScroll > itemTop) {
return "start";
}
if (currentScroll + containerSize < itemTop + itemSize) {
return "end";
}
return null;
}
export {
calculateScrollTarget,
createAxisSelector,
resolveNearestAlign
};