index.ts 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /**
  2. 获取元素的大小及其相对于视口的位置,等价于 Element.getBoundingClientRect。
  3. width 宽度 number
  4. height 高度 number
  5. top 顶部与视图窗口左上角的距离 number
  6. left 左侧与视图窗口左上角的距离 number
  7. right 右侧与视图窗口左上角的距离 number
  8. bottom 底部与视图窗口左上角的距离 number
  9. */
  10. import { Ref, unref } from 'vue';
  11. function isWindow(val: unknown): val is Window {
  12. return val === window;
  13. }
  14. export interface rectTaro {
  15. top: number;
  16. left: number;
  17. right: number;
  18. bottom: number;
  19. width: number;
  20. height: number;
  21. }
  22. export const useTaroRect = (elementRef: (Element | Window | any) | Ref<Element | Window | any>, Taro: any): any => {
  23. let element = unref(elementRef);
  24. console.log(Taro.getEnv());
  25. return new Promise((resolve) => {
  26. if (Taro.getEnv() === 'WEB') {
  27. if (element && element.$el) {
  28. element = element.$el;
  29. }
  30. if (isWindow(element)) {
  31. const width = element.innerWidth;
  32. const height = element.innerHeight;
  33. resolve({
  34. top: 0,
  35. left: 0,
  36. right: width,
  37. bottom: height,
  38. width,
  39. height
  40. });
  41. }
  42. if (element && element.getBoundingClientRect) {
  43. resolve(element.getBoundingClientRect());
  44. }
  45. resolve({
  46. top: 0,
  47. left: 0,
  48. right: 0,
  49. bottom: 0,
  50. width: 0,
  51. height: 0
  52. });
  53. } else {
  54. const query = Taro.createSelectorQuery();
  55. let el = (element as any).id ? (element as any).id : (element as any);
  56. query.select(`#${el}`) && query.select(`#${el}`).boundingClientRect();
  57. query.exec(function (res: any) {
  58. resolve(res[0]);
  59. });
  60. }
  61. });
  62. };