vue移动端照片查看,纯js。可拖拽,双指缩放

代码如下:

<template>
  <div>
    <img :src="src" :alt="alt" @click="open()" style="width: 100%;height: 100%" title="点击查看图片" :id="'vc-imgself-img-'+attach">
    <div class="full-img" v-if="show">
      <div @click="on"  draggable="false" >
        <img :src="src" id="image" alt="" style="width: 100%" class="img-state" :alt="alt || ''">
      </div>
      <div class="btns">
        <button type="button" name="button" class="btn btn-primary" @click="close()" :id="'vc-imgself-close-'+attach">关闭</button>
      </div>
    </div>
  </div>
</template>

<script>
  import $ from 'jquery'


  export default {
    props: {
      src: {
        type: String
      },
      width: {
        default: 60
      },
      height: {
        default: 60
      },
      alt: {
        default: '图片加载失败'
      },
      attach: {
        type: String,
        default: 'name'
      }
    },
    data () {
      return {
        show: false,
        deg: 0,
        power: 1
      }
    },
    methods: {
      open () {
        this.deg = 0
        this.power = 0.5
        this.show = true
      },
      close () {
        this.show = false
      },
      on(){
        $(function (){
          let result = {}
          var eleImg = document.querySelector('#image');
          var store = {
            scale: 1
          };
          // 缩放处理
          eleImg.addEventListener('touchstart', function (event) {
            var touches = event.touches;
            var events = touches[0];
            var events2 = touches[1];

            var x = eleImg.offsetLeft;
            var y = eleImg.offsetTop;

            if (!events) {
              return;
            }
            event.preventDefault();
            // 第一个触摸点的坐标
            store.pageX = events.pageX;
            store.pageY = events.pageY;
            store.x = x;
            store.y = y;
            store.moveable = true;
            if (events2) {
              store.pageX2 = events2.pageX;
              store.pageY2 = events2.pageY;
            }
            store.originScale = store.scale || 1;
          },{ passive: false });
          document.addEventListener('touchmove', function (event) {
            if (!store.moveable) {
              return;
            }
            event.preventDefault();
            var touches = event.touches;
            var events = touches[0];
            var events2 = touches[1];
            result.textContent = '触摸点数量:' + touches.length;
            if (events2) {
              if (!store.pageX2) {
                store.pageX2 = events2.pageX;
              }
              if (!store.pageY2) {
                store.pageY2 = events2.pageY;
              }
              var getDistance = function (start, stop) {
                return Math.hypot(stop.x - start.x, stop.y - start.y);
              };
              var zoom = getDistance({
                  x: events.pageX,
                  y: events.pageY
                }, {
                  x: events2.pageX,
                  y: events2.pageY
                }) /
                getDistance({
                  x: store.pageX,
                  y: store.pageY
                }, {
                  x: store.pageX2,
                  y: store.pageY2
                });
              var newScale = store.originScale * zoom;
              if (newScale > 4) {
                newScale = 4;
              }
              store.scale = newScale;
              eleImg.style.transform = 'scale('+ newScale +')';
              result.textContent = 'zoom: '+ zoom + ', apply scale: ' + newScale;
            }else{
              var moveX = events.pageX - store.pageX;
              var moveY = events.pageY - store.pageY;
              var imagetop = store.x + moveX;
              var imageleft = store.y + moveY;
              eleImg.style.transform = `translate(${imagetop}px, ${imageleft}px) scale(${store.scale})`;
            }
          },{ passive: false });

          document.addEventListener('touchend', function () {
            store.moveable = false;

            delete store.pageX2;
            delete store.pageY2;
          },{ passive: false });
          document.addEventListener('touchcancel', function () {
            store.moveable = false;
            delete store.pageX2;
            delete store.pageY2;
          },{ passive: false });
        });
      }

    },
    ready(){
    }
  }
</script>
<style media="screen">
  .full-img {
    position: fixed;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    z-index: 20;
    background: rgba(0,0,0,0.8);
    display: flex;
    overflow: auto;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    color: #fff;
  }
  .btns {
    position: fixed;
    bottom: 100px;
    height: auto;
  }
  .btns button {
    margin-right: 20px;
  }
  .img-state {

  }
</style>

外层组件调用方式:

<img-self :src="你的图片url" alt="" :width="150" :height="200"></img-self>

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了在Vue移动端实现双指图片缩放,你可以使用一个库叫做easyscroller。首先,你需要在项目中安装easyscroller库,可以使用npm命令进行安装。然后,在你的Vue组件中引入EasyScroller,并在mounted生命周期钩子中创建一个EasyScroller实例。你需要传入一个DOM元素作为容器,并设置一些配置选项,比如scrollingX和scrollingY来启用滚动,zooming来启用缩放,minZoom和maxZoom来限制缩放范围,zoomLevel来设置初始缩放级别等等。最后,在beforeDestroy生命周期钩子中销毁EasyScroller实例。这样,你就可以实现双指图片缩放的功能了。 下面是一个示例代码,你可以参考它来实现双指图片缩放: ``` <template> <div> <div id="zoomBox"> <!-- 缩放盒子 --> <img :src="imageUrl" alt="" class="img" /> </div> </div> </template> <script> import { EasyScroller } from 'easyscroller'; export default { mounted() { const ele = document.querySelector('#zoomBox'); this.scroller = new EasyScroller(ele, { scrollingX: true, scrollingY: true, zooming: true, minZoom: 0.5, maxZoom: 5, zoomLevel: 0.5,<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [vue项目移动端双指缩放,滑动](https://blog.csdn.net/MadSnail00/article/details/131481504)[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^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [vue上传图片通过fabric.js实现移动端双指缩放,移动](https://blog.csdn.net/weixin_44218877/article/details/124102178)[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^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值