press-plus
Version:
123 lines (102 loc) • 2.75 kB
text/typescript
import { getScrollSelector } from 'press-ui/common/dom/scroll';
export const REF_MAP = {
TREE_REF: 'scheduleTree',
TREE_ID: 'scheduleTreeId',
};
export const SCROLL_SELECTOR = getScrollSelector(REF_MAP.TREE_ID);
const TOUCH_THRESHOLD = 60; // 滑动阈值
const SCROLL_DURATION = 500;
function backToTopMp(context: any) {
context?.createSelectorQuery?.()
?.select?.(SCROLL_SELECTOR)
?.node?.()
?.exec?.((res: Record<string, any>) => {
const scrollView = res[0]?.node;
if (!scrollView) return;
scrollView.scrollTo({
top: 0,
duration: SCROLL_DURATION,
});
});
}
function log(info: Record<string, any> | string, needLog = false) {
if (!needLog) return;
const list = Array.isArray(info) ? info : [info];
console.log(list.join(' '));
}
export function endTouch({
endX,
context,
scrollTime = 0,
column = 1,
autoBackToTop = true,
setScrollParams,
needLog = false,
}: Record<string, any>) {
// 通过x轴移动的距离判断是左滑右滑
if (endX < - TOUCH_THRESHOLD && scrollTime < (column - 1)) {
// scrollTime < (column - 1) 左滑的边界值
log('左滑', needLog);
// 赛程树返回顶部
if (autoBackToTop) {
backToTop(context);
}
setScrollParams(scrollTime + 1);
return true;
}
if (endX > TOUCH_THRESHOLD && scrollTime != 0) {
// scrollTime != 0 右滑的边界值
log('右滑', needLog);
// 赛程树返回顶部
if (autoBackToTop) {
backToTop(context);
}
setScrollParams(scrollTime - 1);
return true;
}
log('just to touch', needLog);
}
export function backToTop(context: any) {
// #ifdef H5
scrollToH5(0, {
animation: true,
});
// #endif
// #ifndef H5
backToTopMp(context);
// #endif
}
export function scrollToH5(endPosition = 0, {
animation = true,
}) {
// 记录开始时间
const beginTime = Date.now();
const ref = document
?.querySelector(SCROLL_SELECTOR);
if (!ref) return;
// 初始位置
const startPosition = ref.scrollTop;
if (startPosition === endPosition) return;
// ref.scrollTo({
// top: endPosition,
// behavior: 'smooth',
// });
if (!animation) {
ref.scrollTop = endPosition;
return;
}
const distance = endPosition - startPosition;
const rAF = window.requestAnimationFrame || (func => setTimeout(func, 16));
const frameFunc = () => {
// 进度,500ms 内将页面滚动到顶部
const progress = (Date.now() - beginTime) / SCROLL_DURATION;
if (progress < 1) {
// 根据进度修改 scrollTop 的值
ref.scrollTop = startPosition + distance * progress;
rAF(frameFunc);
} else {
ref.scrollTop = endPosition;
}
};
rAF(frameFunc);
}