vue中 拖动元素边框 改变元素宽度

摘要:
事实上,这不是表单的边界,而是一个单独的组件。监视鼠标的向下、移动和向上事件exportdefault{name:“XHandle”,data(){return{lastX:“”};},created(){document.addEventListener;},destroyed(){document.removeEventListener,},方法:{mouseDown{document.addEvent Listener;this.lastX=event.screenX;},mouseMove{this.$emit;this.lastX=event.screenX,console.log;},mouseUp(){this.lastX=“”;document.removeEvent Listener,}};。x-handle{2px;cursor:w-resize;z-index:10;background:#ccc;}侦听事件,此$Emit将值传递给父组件。父组件动态修改需要通过传递的值更改其宽度的元素。这两个元素的弹性布局相当于手柄组件将粘贴到我们需要拖动的元素上。我们似乎在拖动要更改宽度的元素,但实际上是在拖动我们的控制柄。

先上效果图:

vue中 拖动元素边框 改变元素宽度第1张

如图所示,通过拖动来改变表单的宽度。

但实际上,这边并不是表单的边框,而是一个单独的组件。通过监听鼠标的down,move以及up事件。

我们可以单独的写个组件handle.vue。

<template>
  <div   @mousedown="mouseDown"></div>
</template>

<script>
export default {
  name: "XHandle",
  data() {
    return {
      lastX: ""
    };
  },

  created() {
    document.addEventListener("mouseup", this.mouseUp);
  },

  destroyed() {
    document.removeEventListener("mouseup", this.mouseUp);
  },

  methods: {
    mouseDown(event) {
      document.addEventListener("mousemove", this.mouseMove);
      this.lastX = event.screenX;
    },
    mouseMove(event) {
      this.$emit("widthChange", this.lastX - event.screenX);
      this.lastX = event.screenX;
      console.log(this.lastX, "...", event.screenX);
    },
    mouseUp() {
      this.lastX = "";
      document.removeEventListener("mousemove", this.mouseMove);
    }
  }
};
</script>
<style lang="less">
.x-handle {
   2px;
  cursor: w-resize;
  z-index: 10;
  background: #ccc;
}
</style>

监听事件并this.$emit将值传给父组件,父组件通过传过来的值来动态的修改需要改变宽度的元素。

如效果图所示,写一个有需求组件,并引入handle组件

<div class='sss'>    
  <div  :style="{  width + 'px' }" ></div> // 这里是你自己需要改变宽度的组件
  <XHandle   @widthChange="widthChange" />
</div>
<script>
import XHandle from "@/components/Xhandle";
export default {
  data() {
    return {
       700,
    };
  },
  components: {
    XHandle
  },

  methods: {
    widthChange(movement) {
      console.log(movement, "~~~");
      this.width -= movement;
      if (this.width < 300) {
        this.width = 300;
      }
      if (this.width > 700) {
        this.width = 700;
      }
    }
  }
};
</script>

<style lang="less" scoped>
.sss {
  display: flex;
}
</style>

这里将需要改变宽度的元素给一个双向绑定的值,然后通过子组件传来的值修改。再将两个元素弹性布局,相当于hanle组件就会

贴着我们需要拖动的元素,看上去是再拖动我们要改变宽度的元素,其实是在拖动我们的handle。

免责声明:文章转载自《vue中 拖动元素边框 改变元素宽度》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇百度地图常用 获取中心点 缩放级别等Hadoop平台基本组成下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

vue-element-admin实战 | 第一篇: 移除mock接入后台,搭建微服务和前后端分离的管理平台

一. 前言本篇基于有来商城youlai-mall 微服务项目搭建的后台前端管理平台,技术选型Vue+Element-UI实现前后端分离,解决方案选型vue-element-admin。希望通过本篇你可以改造vue-element-admin工程接入到自己的平台。 二. 工程改造1.导入vue-element-admin 导入vue-element-admi...

Android_UI_点击按钮切换背景效果实现

实现按钮按下和释放,按钮背景图片相应切换效果的方法这里介绍两种,一种是在代码里实现,另一种是在xml文件里实现 一、在xml文件里 首先现在layout的一个xml文件下定义Button如下所示: [html]view plaincopy <Button android:id="@+id/btn_user_selected" android...

如何用BlazeDS更改图片

相信大家在实际应用中肯定会碰到这样的问题:如何动态更改网元图片或者Topo背景?本文用具体实例演示了如何从本地上传图片到服务器,并设置为Topo背景。 首先介绍一下本文用到的技术: 1. FileReferenceFileReference用于从本地打开文件,而且需要添加编译选项:-target-player=10.0.0。关于FileReference的...

Vue中如何给字符串前面加空格

  背景:        最近再用element UI写一个页面,输入框是必输的话,如果没有输入点提交,需要有个红色的提示信息。但是提示信息没有个输入框对齐,就想用加空格的方法来实现。后来发现通常的加空格的方法都无效       一、效果和代码如下:        二 、 想要的效果是提示信息和输入框对齐,网上没找到很好的方法,可能我加了label-w...

vue中promise的使用

vue中promise的使用 promise是处理异步的利器,在之前的文章《ES6之promise》中,我详细介绍了promise的使用, 在文章《js动画实现&&回调地狱&&promise》中也提到了promise的then的链式调用, 这篇文章主要是介绍在实际项目中关于异步我遇到的一些问题以及解决方法,由此来加深对pro...

vue2项目使用axios发送请求

前言:在Vue1.0的时候有一个官方推荐的 ajax 插件vue-resource,但是自从 Vue 更新到 2.0 之后,官方就不再更新 vue-resource。 目前主流的 Vue 项目,都选择axios来完成 ajax 请求,下面来具体介绍一下axios的使用。 项目中安装axios cnpm install axios -S 每个需要请求的组件中...