【发布时间】:2021-07-15 10:08:33
【问题描述】:
我有一个可以水平滑动对象的功能。垂直滚动页面时如何阻止水平滑动功能/事件。
我想出了如何阻止垂直滚动,但我找不到水平滚动的解决方案,也许有人遇到了类似的问题并且可以提出解决方案的算法,或者也许有人还有一些基础工作?
这是一个关于代码框的完整示例(仅适用于触摸事件)。
let ref = useRef();
const [state, setState] = useState({
isScrolling: false,
clientX: 0,
scrollX: 0
});
const touchStartHandler = (e) => {
if (ref && ref.current && !ref.current.contains(e.target)) {
return;
}
e.preventDefault();
setState({
...state,
isScrolling: true,
clientX: e.touches[0].clientX
});
};
const touchMoveHandler = (e) => {
if (ref && ref.current && !ref.current.contains(e.target)) {
return;
}
e.preventDefault();
const { clientX, scrollX, isScrolling } = state;
if (isScrolling === true) {
let sX = scrollX - e.touches[0].clientX + clientX;
let cX = e.touches[0].clientX;
if (sX < -0) {
sX = 0;
} else if (sX >= 0 && sX <= 1800) {
ref.current.scrollLeft = sX;
}
setState({
...state,
scrollX: sX,
clientX: cX
});
}
};
const touchEndHandler = (e) => {
if (ref && ref.current && !ref.current.contains(e.target)) {
return;
}
e.preventDefault();
setState({
...state,
isScrolling: false
});
};
useEffect(() => {
document.addEventListener("touchstart", touchStartHandler);
document.addEventListener("touchmove", touchMoveHandler);
document.addEventListener("touchend", touchEndHandler);
return () => { document.removeEventListener("touchstart", touchStartHandler);
document.removeEventListener("touchmove", touchMoveHandler);
document.removeEventListener("touchend", touchEndHandler);
};
});
return (
<div className={classes.charPage}>
<div
className={classes.items}
ref={ref}
onTouchStart={touchStartHandler}
onTouchMove={touchMoveHandler}
onTouchEnd={touchEndHandler}
>
{scrollBar}
</div>
</div>
);
【问题讨论】:
标签: javascript reactjs vue.js