美文网首页
h5端可以拖拽的悬浮窗口demo

h5端可以拖拽的悬浮窗口demo

作者: 泪滴在琴上 | 来源:发表于2023-11-26 11:48 被阅读0次
<template>
  <div
    class="floating-button"
    :style="{
      position: 'fixed',
      right: buttonStyle.right,
      top: buttonStyle.top,
      transform: buttonStyle.transform,
    }"
    @touchstart="startDrag"
  >
    <img src="@/static/images/kefu1.png" @click="gotoAI" />
  </div>
</template>
<script>
export default {
  data() {
    return {
      buttonStyle: {
        position: "fixed",
        right: "2px",
        top: "480px",
        zIndex: 999,
      },
      dragging: false,
      initialX: 0,
      initialY: 0,
      offsetX: 0,
      offsetY: 0,
      messageDialog: false,
    };
  },
  methods: {
    gotoAI(event) {
      event.stopPropagation();
      this.$router.push(`/message`);
    },
    startDrag(event) {
      event.preventDefault(); // 阻止默认行为
      this.dragging = true;
      // 记录初始触摸位置
      this.initialX = event.touches[0].clientX;
      this.initialY = event.touches[0].clientY;
      // 记录当前偏移量
      this.offsetX = parseInt(this.buttonStyle.right.slice(0, -2));
      this.offsetY = parseInt(this.buttonStyle.top.slice(0, -2));
      // 绑定mousemove和mouseup事件
      document.addEventListener("touchmove", this.onDrag, { passive: false });
      document.addEventListener("touchend", this.endDrag, { passive: false });
    },
    onDrag(event) {
      event.preventDefault(); // 阻止默认行为
      if (this.dragging) {
        // 计算偏移量
        const deltaX = event.touches[0].clientX - this.initialX;
        const deltaY = event.touches[0].clientY - this.initialY;
        // 更新按钮位置
        this.buttonStyle.right = `${this.offsetX - deltaX}px`;
        this.buttonStyle.top = `${this.offsetY + deltaY}px`;
      }
    },
    endDrag(event) {
      event.preventDefault(); // 阻止事件的默认行为
      event.stopPropagation(); // 阻止事件冒泡
      this.dragging = false;
      document.removeEventListener("touchmove", this.onDrag);
      document.removeEventListener("touchend", this.endDrag);
      const deltaX = event.changedTouches[0].clientX - this.initialX;
      const deltaY = event.changedTouches[0].clientY - this.initialY;
      const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
      if (distance < 10) {
        // 如果拖拽距离小于10,认为是点击事件
        const button = document.querySelector(".floating-button img");
        button.click();
      }
    },
  },
};
</script>
<style scoped>
.floating-button {
  width: 50px;
  height: fit-content;
  opacity: 0.9;
}

.floating-button img {
  width: 100%;
  height: auto;
  display: block;
}
</style>

相关文章

  • HTML5拖拽上传

    传统拖拽效果小demohtml5实现拖拽小demo调查问卷小demo拖拽拼图小demo拖拽上传小demo h5拖拽...

  • 仿苹果手机客户端悬浮按钮 assisTouchButton

    仿苹果手机客户端悬浮按钮 assisTouchButton 可以自定义按钮背景图片,颜色,触发事件,可以任意拖拽最...

  • 文件拖拽

    文件拖拽ondragover 拖拽文件进入窗口 (不断执行)ondragenter 拖拽文件进入窗口 ...

  • iOS 给view加一个拖拽功能

    前言 现在的直播app都具有悬浮窗功能,悬浮窗可以拖拽,并且具有回弹动画,可以设计一个UIView的分类实现,减少...

  • 悬浮窗口

    概述 在熊猫直播,等视频APP中,都有这样的一个功能,当退出播放界面的时候,会有一个小窗口播放视频,那么怎么实现的...

  • 分享一波资源(二)

    1.FloatWindow 这个库可用于添加一个“悬浮窗口”,可以显示在所有 Activity 的最前方。“悬浮窗...

  • 移动端 h5开发相关内容总结——CSS篇

    1.移动端开发视窗口的添加 h5端开发下面这段话是必须配置的 meta name="viewport" conte...

  • vue2实现移动端开发

    基于vue2+webpack+vue-router+vuex开发的适用移动端的h5 app demo,包含路由的处...

  • Flutter 中悬浮窗口Widget之Overlay

    在开发中常常需要一个悬浮窗口来做各种筛选,实现悬浮控件需要知道悬浮控件应该出现在什么位置以及窗口的大小,而获取悬浮...

  • 为nzModal增加可拖拽功能 最后是RxJS实现版

    实现功能很简单,就是nzModal像windows里的窗口一样,可以拖拽窗口以移动窗口位置。 思路也很简单。创建一...

网友评论

      本文标题:h5端可以拖拽的悬浮窗口demo

      本文链接:https://www.haomeiwen.com/subject/axeawdtx.html