【前端开发】可拖拽浮窗组件

本文介绍了如何在Vue中使用DragWindow组件创建一个可拖动的窗口,包括模板结构、props配置、鼠标交互处理和窗口关闭事件。
摘要由CSDN通过智能技术生成

1. 组件:DragWindow

<template>
  <div id="dragWindow" ref="dragBox" :style="{ width: width, height: height }">
    <div id="dragHead" @mousedown.stop="mouseDownHandler">
      <slot name="title"></slot>
    </div>
    <div id="dragBody">
      <slot name="content"></slot>
    </div>
  </div>
</template>

<script>
export default {
  name: "DragWindow",
  components: {},
  props: {
    title: {
      type: String,
      default: "",
    },
    width: {
      type: String,
      default: "300px",
    },
    height: {
      type: String,
      default: "100vh",
    },
  },
  data() {
    return {
      // 是否可以移动
      isMove: false,

      // 移动开始位置
      startPosition: {},
      // 元素当前位置
      currentPosition: {},

      // 拖拽元素
      dragHead: null,
    };
  },
  computed: {},
  created() {},
  mounted() {},
  methods: {
    mouseDownHandler(e) {
      // 获取元素当前位置
      this.currentPosition = {
        x: this.$refs.dragBox.offsetLeft,
        y: this.$refs.dragBox.offsetTop,
      };

      // 获取移动开始位置
      this.startPosition = {
        x: e.clientX,
        y: e.clientY,
      };

      // 设置为true,允许移动
      this.isMove = true;

      this.dragWindow = document.getElementById("dragWindow");

      // 鼠标移动事件
      this.dragWindow.addEventListener("mousemove", this.mouseMoveHandler);
      // 鼠标抬起事件
      this.dragWindow.addEventListener("mouseup", (e) => {
        this.isMove = false;
        this.dragWindow.removeEventListener(
            "mousemove",
            this.mouseMoveHandler
        );
      });
      // 鼠标移出事件
      this.dragWindow.addEventListener("mouseleave", (e) => {
        this.isMove = false;
        this.dragWindow.removeEventListener(
            "mousemove",
            this.mouseMoveHandler
        );
      });
    },

    // 鼠标移动事件
    mouseMoveHandler(e) {
      if (!this.isMove) {
        return;
      }

      // 获取鼠标移动的距离
      const nowX = e.clientX - this.startPosition.x,
          nowY = e.clientY - this.startPosition.y;

      // 计算并设置移动后的位置
      this.$refs.dragBox.style.left = `${this.currentPosition.x + nowX}px`;
      this.$refs.dragBox.style.top = `${this.currentPosition.y + nowY}px`;
    },

    // 关闭窗口
    close() {
      this.$emit("close");
    },
  },
};
</script>

<style lang="scss" scoped>
#dragWindow {
  position: fixed;
  left: 50%;
  top: 50%;
  z-index: 999;
  transform: translate(-50%, -50%);
  background-color: #030e06;
  color: #fff;
  border-radius: 10px;

  #dragHead {
    width: 100%;
    height: 50px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    background-color: rgba(#34a83a, 1);
    padding: 0px 10px 0px 20px;
    box-sizing: border-box;
    border-top-left-radius: 10px;
    border-top-right-radius: 10px;
    position: relative;

    .dragTitle {
      font-size: 18px;
    }

    .el-icon-close {
      font-size: 18px;
      cursor: pointer;

      &:hover {
        color: #ff6347;
      }
    }
  }

  #dragBody {
    width: 100%;
    height: calc(100% - 50px);
  }
}
</style>

2. main.js全局调用

import DragWindow from './components/DragWindow/index.vue';
    <DragWindow
        ref="DragWindow"
        w="600px"
        h="600px"
        title="可拖拽浮窗"
        @close="close()">
    </DragWindow>
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前端拖拽组件生成页面是一种通过拖拽组件来生成动态页面的方法。这种方法可以帮助开发者快速搭建页面,提高开发效率。在实际应用中,可以使用一些第三方插件来实现这个功能,比如vuedraggable。 vuedraggable是一个Vue.js的插件,它提供了一种简单的方式来实现拖拽组件。你可以通过拖拽组件来生成页面。具体的实现步骤如下: 1. 首先,在你的项目中引入vuedraggable插件。你可以通过在项目中引入draggable组件来使用该插件。 2. 然后,根据你的需求,结合相关的文档和示例代码,来进行开发。你可以根据自己的需求来定义拖拽组件的样式、属性和行为。 3. 接下来,你可以将需要拖拽组件放置在页面上,并配置好拖拽的规则和交互效果。你可以使用vuedraggable提供的一些API来实现拖拽组件的排序、限制拖拽的范围和处理拖拽事件。 4. 最后,你可以在浏览器中预览生成的动态页面,通过拖拽组件来实现页面的交互和布局调整。你可以根据需要对拖拽组件进行修改和优化,以满足项目的需求。 通过使用前端拖拽组件生成页面的方法,你可以更加灵活和高效地进行页面开发,同时提供了一种可视化的方式来搭建页面结构。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [vue使用vuedraggable拖拽组件,进行组件生成](https://blog.csdn.net/m0_59023970/article/details/129798365)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Vue拖拽组件列表实现动态页面配置功能](https://download.csdn.net/download/weixin_38732463/12940620)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值