当前位置:   article > 正文

【解读 ahooks 源码系列】DOM篇(四)_ahooks usesize

ahooks usesize

前言

本文是 ahooks 源码(v3.7.4)系列的第四篇,也是 DOM 篇的完结篇,往期文章:

本文主要解读 useMouseuseResponsiveuseScrolluseSizeuseFocusWithin的源码实现

useMouse

监听鼠标位置。

官方文档

基本用法

API:

  1. const state: {
  2. screenX: number, // 距离显示器左侧的距离
  3. screenY: number, // 距离显示器顶部的距离
  4. clientX: number, // 距离当前视窗左侧的距离
  5. clientY: number, // 距离当前视窗顶部的距离
  6. pageX: number, // 距离完整页面左侧的距离
  7. pageY: number, // 距离完整页面顶部的距离
  8. elementX: number, // 距离指定元素左侧的距离
  9. elementY: number, // 距离指定元素顶部的距离
  10. elementH: number, // 指定元素的高
  11. elementW: number, // 指定元素的宽
  12. elementPosX: number, // 指定元素距离完整页面左侧的距离
  13. elementPosY: number, // 指定元素距离完整页面顶部的距离
  14. } = useMouse(target?: Target);
  15. 复制代码

官方在线 Demo

  1. import React, { useRef } from 'react';
  2. import { useMouse } from 'ahooks';
  3. export default () => {
  4. const ref = useRef(null);
  5. const mouse = useMouse(ref.current);
  6. return (
  7. <>
  8. <div
  9. ref={ref}
  10. style={
  11. {
  12. width: '200px',
  13. height: '200px',
  14. backgroundColor: 'gray',
  15. color: 'white',
  16. lineHeight: '200px',
  17. textAlign: 'center',
  18. }}
  19. >
  20. element
  21. </div>
  22. <div>
  23. <p>
  24. Mouse In Element - x: {mouse.elementX}, y: {mouse.elementY}
  25. </p>
  26. <p>
  27. Element Position - x: {mouse.elementPosX}, y: {mouse.elementPosY}
  28. </p>
  29. <p>
  30. Element Dimensions - width: {mouse.elementW}, height: {mouse.elementH}
  31. </p>
  32. </div>
  33. </>
  34. );
  35. };
  36. 复制代码

核心实现

实现原理:通过监听 mousemove 方法,获取鼠标的位置。通过 getBoundingClientRect(提供了元素的大小及其相对于视口的位置) 获取到 target 元素的位置大小,计算出鼠标相对于元素的位置。

  1. export default (target?: BasicTarget) => {
  2. const [state, setState] = useRafState(initState);
  3. useEventListener(
  4. 'mousemove',
  5. (event: MouseEvent) => {
  6. const { screenX, screenY, clientX, clientY, pageX, pageY } = event;
  7. const newState = {
  8. screenX,
  9. screenY,
  10. clientX,
  11. clientY,
  12. pageX,
  13. pageY,
  14. elementX: NaN,
  15. elementY: NaN,
  16. elementH: NaN,
  17. elementW: NaN,
  18. elementPosX: NaN,
  19. elementPosY: NaN,
  20. };
  21. const targetElement = getTargetElement(target);
  22. if (targetElem
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/275093
推荐阅读
相关标签
  

闽ICP备14008679号