dragbom.tsx 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import { defineComponent, computed, reactive, onMounted } from 'vue';
  2. import styles from './index.module.less';
  3. // 底部拖动区域
  4. export default defineComponent({
  5. name: 'dragBom',
  6. emits: ["guideDone"],
  7. props: {
  8. /** 是否显示引导 */
  9. showGuide: {
  10. type: Boolean,
  11. default: false,
  12. },
  13. },
  14. setup(props, { emit }) {
  15. const data = reactive({
  16. guidePos: "bottom" as "bottom" | "top",
  17. });
  18. const initGuidePos = () => {
  19. const pageHeight = document.documentElement.clientHeight || document.body.clientHeight;
  20. const guideHeight = document.querySelector('.bom_guide')?.getBoundingClientRect().height || 0;
  21. const dragTop = document.querySelector('.bom_drag')?.getBoundingClientRect()?.top || 0;
  22. data.guidePos = pageHeight - dragTop < guideHeight ? "top" : "bottom";
  23. }
  24. onMounted(() => {
  25. initGuidePos();
  26. });
  27. return () => (
  28. <>
  29. <div class={[styles.dragBom, 'bom_drag']}>
  30. <div class={styles.box}></div>
  31. <div class={[styles.box, styles.right]}></div>
  32. </div>
  33. {
  34. props.showGuide &&
  35. <div class={[styles.guide, data.guidePos === "top" && styles.guideTop, 'bom_guide']}>
  36. <div class={styles.guideBg}></div>
  37. <div class={styles.guideDone} onClick={() => emit("guideDone")}></div>
  38. </div>
  39. }
  40. </>
  41. );
  42. }
  43. });