使用鼠标事件实现拖拽划动(React)

我使用了 onMouseDown onMouseMove 和 onMouseUp 来实现了拖拽划动。

代码

import React, { MutableRefObject, useRef } from 'react'
import { throttle } from 'lodash'
import styles from './index.less'

export default () => {
  const ScrollContainer: MutableRefObject<HTMLDivElement | null> = useRef(null)

  let downScrollLeft = 0
  let downClientX = 0
  let downScrollTop = 0
  let downClientY = 0
  let isMoving = false

  const handleMouseDown = (
    event: React.MouseEvent<HTMLDivElement, MouseEvent>,
  ) => {
    isMoving = true
    if (ScrollContainer.current) {
      downClientX = event.clientX
      downScrollLeft = ScrollContainer.current.scrollLeft
      downClientY = event.clientY
      downScrollTop = ScrollContainer.current.scrollTop
    }
  }

  const scrollCallback = throttle((clientX: number, clientY: number) => {
    if (isMoving && ScrollContainer.current) {
      ScrollContainer.current.scrollLeft =
        downScrollLeft + (downClientX - clientX)
      ScrollContainer.current.scrollTop =
        downScrollTop + (downClientY - clientY)
    }
  }, 16)

  const handleMouseMove = (
    event: React.MouseEvent<HTMLDivElement, MouseEvent>,
  ) => scrollCallback(event.clientX, event.clientY)

  const handleMouseUp = () => {
    isMoving = false
  }

  return (
    <div
      className={styles.container}
      ref={ScrollContainer}
      onMouseDown={handleMouseDown}
      onMouseMove={handleMouseMove}
      onMouseUp={handleMouseUp}
    >
      <div className={styles.content}>content</div>
    </div>
  )
}
.container {
  width: 600px;
  height: 600px;
  overflow: auto;
}

.content {
  width: 1200px;
  height: 1200px;
  background: rgb(144, 203, 243);
}

原理

  1. 修改容器元素的 scrollTop 和 scrollLeft 来进行容器内容的纵向和横向滑动。
  2. 通过鼠标事件记录鼠标位置,并计算鼠标位移距离。
  3. 通过 lodash 的节流函数避免 onMouseMove 过快调用。

最后

这些 API 的具体资料可以去查阅 MDN,其实实现起来并不难,主要是知道这些 API 的存在并结合起来使用。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容