实现vue图片缩放-拖拽组件

实现效果如下:
提供盒子,使用子组件实现图片拖拽和放大
这几天做了个没做过的组件,以此记录下,需要的效果是在一个dom内,缩放拖拽图片。
封装的子组件imgbox.Vue。父组件中使用,需要在父组件中准备一个盒子用来装图片,在这个盒子中可以缩放拽拽图片。

父组件如下

父组件html部分

<!-- 普通方形盒子 -->
<div class="box1">
      <imgbox :config="data1" @enlarge="enlargeImg" @narrow="narrowImg" @changeImg="change"></imgbox>
</div>

父组件的css部分

.box1{
    width: 300px;
    height: 300px;
	border: 1px solid #000;
	/deep/ .dragImg{//深度css,由于vue中的style标签的scoped属性不能直接给子组件样式,需要使用deep在父组件中给子组件中的dom给样式
      width: 420px;//子组件中的图片大小
      height: 280px;
    }
    /deep/ .btnbox{//深度css,由于vue中的style标签的scoped属性不能直接给子组件样式,需要使用deep在父组件中给子组件中的dom给样式
      width: 70px;//子组件中按钮盒子的大小
      height: 20px;
      top: 20px;//子组件盒子的位置
      left: 20px;
      .operChange{//按钮的大小
        width: 20px;
        height: 20px;
      }
    }
  }

父组件应用子组件

import imgbox from './imgbox' //拖拽,放大缩小图片  子组件
components:{ imgbox },

配置数据

data1:{
        name:"data1",//标识数据
        imgsrc:require('@/assets/timg.jpg'),//图片路径
        imgname:"img01",//图片对应的名字   用该属性和下面的图片数组属性对照,用于子组件获取索引,给默认高亮
        scale:1,//默认缩放1
      }

方法

enlargeImg:function(val){//放大图片
      this[val.name].scale = this[val.name].scale + 0.1
    }
,narrowImg:function(val){//缩小图片
      if(this[val.name].scale >= 0.1){
        this[val.name].scale = this[val.name].scale - 0.1
      }
    }

子组件imgbox.vue如下

子组件html部分

<template>
  <div class="myDiv">
    <img class="dragImg" ref="img" name="removeImg" :src="imgsrc" v-drag :style="scaleFun">
    <div class="btnbox" :ref="config.ref">
      <img src="../assets/operaImg2.png" title="放大" @click="clickEnlarge" class="operChange">
      <img src="../assets/operaImg3.png" title="缩小" @click="clickNarrow" class="operChange">
    </div>
  </div>
</template>

子组件接受父组件传递参数,自定义指令

export default {
  components:{},
  props:['config'],
  data(){
    return {
      imgsrc:"",//图片的路径
    }
  },
  directives:{//注册指令
    drag:function(el){
      let dragBox = el; //获取当前元素
      dragBox.onmousedown = e => {
        e.preventDefault();
        //算出鼠标相对元素的位置
        let disX = e.clientX - dragBox.offsetLeft;
        let disY = e.clientY - dragBox.offsetTop;
        document.onmousemove = e => {
          //用鼠标的位置减去鼠标相对元素的位置,得到元素的位置
          e.preventDefault();
          let left = e.clientX - disX;
          let top = e.clientY - disY;
          //移动当前元素
          dragBox.style.left = left + "px";
          dragBox.style.top = top + "px";
        };
        document.onmouseup = e => {
          e.preventDefault();
          //鼠标弹起来的时候不再移动
          document.onmousemove = null;
          //预防鼠标弹起来后还会循环(即预防鼠标放上去的时候还会移动)  
          document.onmouseup = null;
        };
      }
    }
  },
  watch:{
    config:function(val){
      this.imgsrc = val.imgsrc
    }
  },
  computed:{
    scaleFun:function(){
      return `transform:scale(${this.config.scale})`
    }
  },
  created(){},
  methods:{
    clickEnlarge(){//点击放大
      let data = this.config
      this.$emit('enlarge',data)
    }
    ,clickNarrow(){//点击缩小
      let data = this.config
      this.$emit('narrow',data)
    }
  },
}

子组件css

.myDiv{
  width: 100%;
  height: 100%;
  position: relative;
  overflow: hidden;
  img{
    width: 100%;
    height: 100%;
    position: relative;
  }
  .btnbox{
    display: flex;
    position: absolute;
    top: 20px;
    left: 20px;
    width: 70px;
    height: 20px;
    justify-content: space-around;
    z-index: 99;
    img{
      width: 20px;
      height: 20px;
      opacity: 0.7;
      cursor: pointer;
      display: inline-block;
    }
  }
}
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你好!关于Vue裁剪组件,我推荐你使用vue-cropper组件。它是一个功能强大且易于使用的图片裁剪工具,可以在Vue项目中方便地集成和使用。 Vue-cropper提供了一些常见的图片裁剪功能,包括、旋转、翻转、裁剪框调整等。你可以使用它来实现用户上传图片后的裁剪操作,适用于头像上传、图片编辑等场景。 使用vue-cropper组件很简单,首先你需要安装它: ``` npm install vue-cropper ``` 然后,在你的Vue组件中引入并使用它: ```vue <template> <div> <vue-cropper ref="cropper" :src="imageUrl" :config="cropperConfig" ></vue-cropper> <button @click="cropImage">裁剪图片</button> </div> </template> <script> import VueCropper from 'vue-cropper'; export default { components: { VueCropper, }, data() { return { imageUrl: 'https://example.com/image.jpg', cropperConfig: { aspectRatio: 1, // 裁剪框宽高比例 viewMode: 1, // 显示模式:0表示自由模式,1表示限制裁剪框在图片内 dragMode: 'move', // 模式 }, }; }, methods: { cropImage() { const cropper = this.$refs.cropper.getCropper(); const croppedImageData = cropper.getCroppedCanvas().toDataURL(); // 处理裁剪后的图片数据 }, }, }; </script> ``` 以上是一个简单的示例代码,其中`imageUrl`是待裁剪的图片地址,`cropperConfig`是裁剪工具的配置选项。你可以根据自己的需求自定义配置。 在裁剪按钮点击事件中,我们通过`this.$refs.cropper.getCropper()`获取裁剪实例,然后使用`.getCroppedCanvas().toDataURL()`方法获取裁剪后的图片数据,你可以根据需要对其进行进一步的处理。 希望这个组件能满足你的需求,如果还有其他问题,请随时提问!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值