javascript - 拖动以滚动到元素之外
问题描述
我已经制作了一个可滚动的容器,但是当鼠标指针在按下时离开元素框时它的行为存在问题。当它发生时,滚动与我在 Firefox 中想要的方向相反,并在 Edge 中停止。在 Firefox 中滚动似乎是浏览器的本机行为。是否有可能使它像光标在元素上时一样工作?
HTML
<div id="app"></div>
JS
import React from "https://cdn.skypack.dev/react"
import ReactDOM from "https://cdn.skypack.dev/react-dom"
const HelloWorld = () => <h1>Hello, World!</h1>
const Scrollable = props => {
const ref = React.useRef()
const [scroll, setScroll] = React.useState({ isScrolling: false, clientX: 0 })
const onMouseDown = e => {
setScroll({ ...scroll, isScrolling: true, clientX: e.clientX })
}
const onMouseUp = () => {
setScroll({ ...scroll, isScrolling: false })
}
const onMouseMove = e => {
const { clientX } = scroll
if (scroll.isScrolling) {
const dx = e.clientX - clientX
const scrollLeft = ref.current.scrollLeft - dx
if (scrollLeft < 0 || scrollLeft > ref.current.scrollLeftMax) return
ref.current.scrollLeft = scrollLeft
setScroll({ ...scroll, clientX: e.clientX })
}
}
return(
<div className="scrollable" ref={ref}
style={{'overflow-x': 'auto', width: '200px', 'margin-left': '100px' }}
onMouseDown={onMouseDown}
onMouseUp={onMouseUp}
onMouseMove={onMouseMove}
>
{props.children}
</div>
)
}
ReactDOM.render(<Scrollable><div style={{ height: '100px', width: '1000px', background: 'red' }}></div></Scrollable>, document.getElementById('app'))
解决方案
推荐阅读
- python - 大熊猫在正则表达式后删除空间
- python - Spark 3.0.0 创建 SparkSession 时出错:pyspark.sql.utils.IllegalArgumentException:
- javascript - 实现一个 Vue.js 组件,以便将元素定义为
- cassandra - Cassandra 3.11,按列表过滤结果(搜索替代品)
- postgresql - PostgreSQL - dblink_exec statement_timeout
- c# - Xamarin Forms 嵌套 flex 布局与其他控件无法正确呈现
- javascript - 如何将放置在reactjs中的json对象内的图像发布到spring boot后端rest api
- python - 使用 scikit learn 在 python 中进行管道和交叉验证
- .net - 如何自动启动使用 Msix 打包的应用程序?
- key-value - etcd 是否将其 key-value 数据直接存储在 Raft 日志中?