【发布时间】:2020-02-23 05:58:34
【问题描述】:
我需要帮助才能在 TS 中创建可拖动的滑块。我能够获得客户端和滚动位置,但我无法改变 ref scrollLeft 位置。它不会返回或抛出错误,只是不会改变 ref 的 scrollLeft 属性。
我已尝试记录返回 div ref 的 ref 属性,但 scrollLeft 位置始终为 0
import React, { useRef, useState } from "react";
import Nav from "./Nav";
const Services: React.FC = () => {
const ref = useRef<HTMLDivElement | null>(null);
const [state, setState] = useState({
isDown: false,
clientX: 0,
scrollX: 0,
});
const onMouseDown = (e: React.MouseEvent<HTMLDivElement>): void => {
e.persist();
setState({
...state, isDown: true,
clientX: e.clientX,
});
};
const onMouseUp = () => {
setState({ ...state, isDown: false });
};
const onMouseLeave = () => {
setState({ ...state, isDown: false });
};
const onMouseMove = (e: React.MouseEvent<HTMLDivElement>): void => {
e.persist();
if (!state.isDown) { return; }
const { clientX, scrollX } = state;
if (ref.current) {
// console.log(ref.current.scrollLeft);
ref.current.scrollLeft = scrollX + e.clientX - clientX;
console.log(ref.current.scrollLeft, scrollX + e.clientX - clientX);
// state.scrollX = scrollX + e.clientX - clientX;
// state.clientX = e.clientX;
}
};
return (
<main>
<Nav/>
<div id="content">
<div className="draggable-slider" ref={ref}
onMouseDown={onMouseDown}
onMouseUp={onMouseUp}
onMouseLeave={onMouseLeave}
onMouseMove={onMouseMove}>
<div className="slide">
<h3>.01</h3>
<h3>Basic</h3>
<div className="slide-image">1</div>
</div>
<div className="slide">
<h3>.02</h3>
<h3>Basic</h3>
<div className="slide-image">2</div>
</div>
<div className="slide">
<h3>.03</h3>
<h3>Basic</h3>
<div className="slide-image">3</div>
</div>
<div className="slide">
<h3>.04</h3>
<h3>Basic</h3>
<div className="slide-image">4</div>
</div>
</div>
</div>
</main>
);
};
export default Services;
CSS
.draggable-slider {
position: relative;
display: grid;
padding: 1rem;
width: 100%;
grid-template-columns: repeat(4, 400px);
grid-column-gap: 3em;
top: 35vh;
user-select: none;
background-color: red;
.slide {
padding: 10px;
line-height: 1;
// cursor: grab;
// &.is-grabbing{
// cursor: grabbing;
// }
```
I want to be able to create the draggable slide by mutating the div scrollLeft position
【问题讨论】:
-
hmm... 在
scrollX + e.clientX - clientX.. 中scrollX和clientX是不同的值吗?相反,const { clientX, scrollX } = state是否按您的预期工作? -
实际上.. 继续用您的相关 css 更新您的问题.. 因为不清楚您是否正确使用
scrollLeft并且\或对它有正确的期望(即您的 @ 987654328@ 容器应该有水平滚动条;overflow应该允许滚动条) -
@BrettCaswell,这些值按预期工作。尽管将 ref.current.scrollLeft 位置设置为这些值,但它不仅被重新分配。
-
您对
ref的使用似乎是正确的。我测试了类似的代码。也许变量的名称应该不是ref。 -
我也试过了,好像没用。像 divRef
标签: css reactjs typescript