npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

rc-touchlayer

v0.1.4

Published

react触摸/鼠标/触摸板事件统一分发层

Readme

rc-touchlayer

问题反馈: [email protected]

派生自 @ke/touchlayer

 将触摸事件、鼠标事件和触摸板/精确式滚轮/滚轮事件合并为用户行为进行反馈的交互统一层

使用示例

import React, { useState } from "react";
import TouchLayer, { TouchLayerEvent } from "rc-touchlayer";
export default function App() {
  const [x, setX] = React.useState(0);
  const [y, setY] = React.useState(0);
  const [scale, setScale] = React.useState(1);
  const [rotate, setRotate] = useState(0);
  return (
    <TouchLayer
      onDrag={(e:TouchLayerEvent) => {
        setX(Math.max(0, Math.min(window.innerWidth - 50, x + e.deltaX)));
        setY(Math.max(0, Math.min(window.innerHeight - 50, y + e.deltaY)));
        console.log(e);
      }}
      onZoom={(e:TouchLayerEvent) => {
        console.log(e);
        setScale(Math.max(0.3, Math.min(10, scale + e.deltaZ / 50)));
        setRotate(rotate + e.deltaW);
      }}
      wheelX //用于支持滚轮和触摸板的横向滚动
      wheelY //用于支持滚轮和触摸板的纵向滚动
    >
      <div className="test-cover">
        <div
          style={{
            width: 50,
            height: 50,
            background: "#fff",
            transform: `translate(${x}px,${y}px) rotate(${rotate}rad) scale(${scale}) `,
          }}
        ></div>
      </div>
    </TouchLayer>
  );
}

可使用的事件

所有用户操作都会以onOperate的jsx参数属性回调形式向外传递事件,所有事件都符合TouchLayerEvent(见表2)类型定义,同时每种事件也会有自己独特的jsx参数如onDrag提供开发者使用。

  • 表1 :TouchLayerEventType枚举定义 - 事件参照表

| 事件名称 | 说明 | jsx参数 | | -------------- | ----------------- | ------------------ | | dragStart | 开始拖动动作 | onDragStart | | drag | 拖动 | onDrag | | dragEnd | 结束拖动动作 | onDragEnd | | inertanceEnd | 惯性拖动结束 | onInertanceEnd | | zoomStart | 开始缩放/旋转动作 | onZoomStart | | drag&zoom | 拖动同时缩放 | onDrag|onZoom | | zoom | 缩放 | onZoom | | zoomEnd | 结束缩放/旋转动作 | onZoomEnd | | click | 点击 | onClick | | doubleClick | 双击 | onDoubleClick | | longtapStart | 长按开始 | onLongtapStart | | longtapEnd | 长按结束 | onLongtapEnd |

  • 表1.1 : TouchLayerOperateMode枚举定义 - 用户操作模式

| 名称 | 说明 | | ----------- | -------------------------------- | | "drag" | 拖动动作 | | "zoom" | 缩放(旋转)动作 | | "drag&zoom" | 拖动同时缩放(旋转)动作 | | "none" | 当前动作不是由用户触发(如惯性) |

  • 表1.2 : TouchLayerInputType枚举定义 - 用户输入模式

| 名称 | 说明 | | ---------- | ------ | | "touch" | 触摸 | | "mouse" | 鼠标 | | "trackpad" | 触摸板 | | "wheel" | 滚轮 |

  • 表2 : TouchLayerEvent类型定义

| 属性 | 类型 | 说明 | | ------------ | --------------------- | ------------------------------ | | time | number | 页面打开事件触发经过的毫秒数 | | type | TouchLayerEventType | 事件的类型(见表1) | | operateMode | TouchLayerOperateMode | 用户操作的模式(见表1.1) | | inputType | TouchLayerInputType | 用户的输入方式(见表1.2) | | mouseButton0 | boolean | 鼠标左键是否被按下 | | mouseButton1 | boolean | 鼠标中键是否被按下 | | mouseButton2 | boolean | 鼠标右键是否被按下 | | clientX | number | 当前光标的客户端坐标X | | clientY | number | 当前光标的客户端坐标Y | | deltaX | number | 和上一次触发事件间位移的坐标X | | deltaY | number | 和上一次触发事件间位移的坐标Y | | deltaZ | number | 和上一次触发事件间缩放的距离 | | deltaW | number | 和上一次触发事件间旋转的弧度差 | | speedX | number | 坐标X分量速度 | | speedY | number | 坐标Y分量速度 | | distanceX | number | X分量总移动距离 | | distanceY | number | Y分量总移动距离 | | distanceZ | number | 缩放总距离 | | distanceW | number | 旋转总弧度(最大为2PI) | | inertance | boolean | 是否为惯性触发 | | moved | boolean | 当前光标是否移动过 | | target | HTMLElement | 触发事件的Dom元素 |

所有JSX参数

interface TouchLayerProps {
  /**
   * 全局事件监听
   */
  onOperate?: (event: TouchLayerEvent) => void;
  /**
   * 点击事件
   */
  onClick?: (event: TouchLayerEvent) => void;
  /**
   * 双击事件
   */
  onDoubleClick?: (event: TouchLayerEvent) => void;
  /**
   * 双击判定时间间隔 单位ms
   * 默认值200 ms
   */
  doubleClickGap?: number;
  /**
   * 每次用户输入都反馈事件,不再按帧合并(性能降低,但反应变快)
   */
  eachTick?: boolean;
  /**
   * 输入平滑过滤参数 0~1 值越小效果越平滑,同时滞后感越强
   */
  inputFilter?: number;
  /**
   * 开始拖拽
   */
  onDragStart?: (event: TouchLayerEvent) => void;
  /**
   * 拖拽动作
   */
  onDrag?: (event: TouchLayerEvent) => void;
  /**
   * 拖拽结束
   */
  onDragEnd?: (event: TouchLayerEvent) => void;
  /**
   * 惯性运动结束,注意,该方法会在onDragEnd后触发,无论是否开启惯性模拟。当前惯性模拟被其他输入打断后,该次运动不会触发本事件
   */
  onInertanceEnd?: (event: TouchLayerEvent) => void;
  /**
   * 关闭惯性模拟
   */
  noInertance?: boolean;
  /**
   * 开始长按
   */
  onLongtapStart?: (event: TouchLayerEvent) => void;
  /**
   * 结束长按
   */
  onLongtapEnd?: (event: TouchLayerEvent) => void;
  /**
   * 监听鼠标中键按下
   */
  useMouseMiddleButton?: boolean;
  /**
   * 监听鼠标右键按下
   */
  useMouseRightButton?: boolean;
  /**
   * 监听横向滚轮、横向触摸板事件
   */
  wheelX?: boolean;
  /**
   * 监听纵向滚轮、纵向触摸板事件
   */
  wheelY?: boolean;
  /**
   * 反转滚轮X输入
   */
  flipWheelX?: boolean;
  /**
   * 反转滚轮的Y输入
   */
  flipWheelY?: boolean;
  /**
   * 滚轮不需要按住metaKey直接触发缩放
   */
  wheelZoom?: boolean;
  /**
   * 开始缩放
   */
  onZoomStart?: (event: TouchLayerEvent) => void;
  /**
   * 缩放动作
   */
  onZoom?: (event: TouchLayerEvent) => void;
  /**
   * 缩放结束
   */
  onZoomEnd?: (event: TouchLayerEvent) => void;
  /**
   * 禁止缩放时拖拽
   */
  noZoomMove?: boolean;
  noEnableCheck?: boolean;

  /**
   * 禁止缩放结束后拖拽
   */
  noHandlerDownlevel?: boolean;

  preventDefault?: boolean;
  stopPropagation?: boolean;
  stopPropagationCapture?: boolean;

  /**
   * 防止错误输入事件传递的遮罩层的zIndex
   */
  maskZIndex?: number;

  /**
   * dataset-type黑名单,用于保护特定子元素的交互,在该元素上的交互不会触发touchlayer事件
   */
  preventElementDataType?: string;
  /**
   * 该touchlayer内部的其他touchlayer上的事件不会传递到该层上
   */
  preventOtherTouchLayer?: boolean;

  style?: React.CSSProperties;
  className?: string;
}