Skip to content

useMouse

一个鼠标位置和状态跟踪 Hook,提供实时的鼠标坐标、移动状态、按键状态等信息。支持相对定位、边界检测、自定义目标元素等功能。

基础用法

全局鼠标位置跟踪

最基本的用法是跟踪全局鼠标位置。

鼠标 X 坐标: 0px

鼠标 Y 坐标: 0px

源元素类型: mouse

移动鼠标查看坐标变化

相对位置跟踪

可以指定目标元素,获取相对于该元素的鼠标位置。

在此区域移动鼠标

相对 X 坐标: 0px

相对 Y 坐标: 0px

是否在区域内:

鼠标按键状态

检测鼠标按键的按下状态。

🖱️
左键
释放
🖱️
右键
释放
🖱️
中键
释放

在此区域按下鼠标按键查看状态变化

API 参考

参数

参数类型默认值说明
targetMaybeRefOrGetter<Element>window目标元素,用于相对定位
touchbooleantrue是否启用触摸支持
resetOnTouchEndsbooleanfalse触摸结束时是否重置坐标
initialValuePosition{ x: 0, y: 0 }初始坐标值

返回值

属性类型说明
xRef<number>鼠标 X 坐标
yRef<number>鼠标 Y 坐标
sourceTypeRef<MouseSourceType>输入源类型 (mouse | touch)
elementXRef<number>相对于目标元素的 X 坐标
elementYRef<number>相对于目标元素的 Y 坐标
elementPositionXRef<number>目标元素的 X 位置
elementPositionYRef<number>目标元素的 Y 位置
elementHeightRef<number>目标元素的高度
elementWidthRef<number>目标元素的宽度
isInsideRef<boolean>鼠标是否在目标元素内
buttonsRef<number>鼠标按键状态的位掩码

使用示例

基础位置跟踪

vue
<template>
  <div>
    <p>鼠标位置: ({{ x }}, {{ y }})</p>
  </div>
</template>

<script setup>
import { useMouse } from "@vakao-ui/hooks";

const { x, y } = useMouse();
</script>

相对定位

vue
<template>
  <div>
    <div ref="container" class="container">
      <div class="pointer" :style="{ left: x + 'px', top: y + 'px' }"></div>
    </div>
  </div>
</template>

<script setup>
import { ref } from "vue";
import { useMouse } from "@vakao-ui/hooks";

const container = ref();
const { x, y } = useMouse({ target: container });
</script>

<style>
.container {
  position: relative;
  width: 400px;
  height: 300px;
  border: 1px solid #ccc;
}

.pointer {
  position: absolute;
  width: 10px;
  height: 10px;
  background: red;
  border-radius: 50%;
  transform: translate(-50%, -50%);
}
</style>

鼠标按键检测

vue
<template>
  <div>
    <p>左键: {{ leftPressed ? "按下" : "释放" }}</p>
    <p>右键: {{ rightPressed ? "按下" : "释放" }}</p>
    <p>中键: {{ middlePressed ? "按下" : "释放" }}</p>
  </div>
</template>

<script setup>
import { computed } from "vue";
import { useMouse } from "@vakao-ui/hooks";

const { buttons } = useMouse();

const leftPressed = computed(() => !!(buttons.value & 1));
const rightPressed = computed(() => !!(buttons.value & 2));
const middlePressed = computed(() => !!(buttons.value & 4));
</script>

触摸设备支持

vue
<template>
  <div>
    <p>位置: ({{ x }}, {{ y }})</p>
    <p>输入类型: {{ sourceType }}</p>
  </div>
</template>

<script setup>
import { useMouse } from "@vakao-ui/hooks";

// 启用触摸支持,触摸结束时重置坐标
const { x, y, sourceType } = useMouse({
  touch: true,
  resetOnTouchEnds: true,
});
</script>

基于 MIT 协议发布