ivue-material-plus
Version:
A high quality UI components Library with Vue.js
81 lines (64 loc) • 1.9 kB
text/typescript
import { getCurrentInstance } from 'vue';
export default (data: any, container: any, wrapper: any, activeIndex) => {
const { proxy }: any = getCurrentInstance();
// 手势开始
const onTouchStart = (e) => {
data.startX = data.scrollOffset + e.touchstartX;
container.value.style.transition = 'none';
container.value.style.willChange = 'transform';
};
// 手势移动
const onTouchMove = (e: any) => {
data.scrollOffset = data.startX - e.touchmoveX;
};
// 手势结束
const onTouchEnd = () => {
const maxScrollOffset =
container.value.clientWidth - wrapper.value.clientWidth;
container.value.style.transition = '';
container.value.style.willChange = '';
if (data.scrollOffset < 0 || !data.isOverflowing) {
data.scrollOffset = 0;
} else if (data.scrollOffset >= maxScrollOffset) {
data.scrollOffset = maxScrollOffset;
}
};
// 偏移位置
const newOffset = (direction: string) => {
const clientWidth = wrapper.value.clientWidth;
if (direction === 'prev') {
return Math.max(data.scrollOffset - clientWidth, 0);
} else {
return Math.min(
data.scrollOffset + clientWidth,
container.value.clientWidth - clientWidth
);
}
};
// 内容滑动切换.
const handleSwipeItem = (direction) => {
// 左
if (direction === 'next') {
const index = activeIndex.value + 1;
const tab = data.tabs[index];
if (tab) {
proxy.tabNavClick(tab);
}
}
// 右
if (direction === 'prev') {
const index = activeIndex.value - 1;
const tab = data.tabs[index];
if (tab) {
proxy.tabNavClick(tab);
}
}
};
return {
onTouchStart,
onTouchMove,
onTouchEnd,
newOffset,
handleSwipeItem,
};
};