实现效果如下

提供盒子,使用子组件实现图片拖拽和放大

这几天做了个没做过的组件,以此记录下,需要的效果是在一个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;
    }
  }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持Devmax。 

实现vue图片缩放方式-拖拽组件的更多相关文章

  1. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  2. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. vue自定义加载指令v-loading占位图指令v-showimg

    这篇文章主要为大家介绍了vue自定义加载指令和v-loading占位图指令v-showimg的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. vue使用动画实现滚动表格效果

    这篇文章主要为大家详细介绍了vue使用动画实现滚动表格效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. 关于Vue 监控数组的问题

    这篇文章主要介绍了Vue 监控数组的示例,主要包括Vue 是如何追踪数据发生变化,Vue 如何更新数组以及为什么有些数组的数据变更不能被 Vue 监测到,对vue监控数组知识是面试比较常见的问题,感兴趣的朋友一起看看吧

  6. Vue子组件props从父组件接收数据并存入data

    这篇文章主要介绍了Vue子组件props从父组件接收数据并存入data的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  7. Vue h函数的使用详解

    本文主要介绍了Vue h函数的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  8. VUE响应式原理的实现详解

    这篇文章主要为大家详细介绍了VUE响应式原理的实现,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

  9. vue+Element ui实现照片墙效果

    这篇文章主要为大家详细介绍了vue+Element ui实现照片墙效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. vue+elemet实现表格手动合并行列

    这篇文章主要为大家详细介绍了vue+elemet实现表格手动合并行列,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部