使用事件委托实现图片移动及缩放功能

该文章为个人纪录,如有错误请指正

问题及解决:

拖住会将图片文件拖出

  $(imgview).on("dragstart", function (e) {
    e.preventDefault();
  });

 被拖出后解除该事件

多次拖拽放大缩小后出现移动误差

    let mousex = e.originalEvent.clientX;
    let mousey = e.originalEvent.clientY;
    const sx = transform.x;
    const sy = transform.y;


    let mousex2 = ei.originalEvent.clientX;
    let mousey2 = ei.originalEvent.clientY;

通过两层事件计算移动的数值,具体可看下方完整代码逻辑

封装代码

var transform = { x: 0, y: 0, scale: 1 };

// 初始化
function init(imgview) {
  transform = { x: 0, y: 0, scale: 1 };
  settransform(imgview);
}

function moveimageinit(imgdialog, imgview) {
  init(imgview);
  $(imgview).on("dragstart", function (e) {
    e.preventDefault();
  });

  var move = false;
  $(imgdialog).mousedown(function (e) {
    move = true;
    let mousex = e.originalEvent.clientX;
    let mousey = e.originalEvent.clientY;
    const sx = transform.x;
    const sy = transform.y;
    $(imgdialog).mousemove(function (ei) {
      if (move) {
        let mousex2 = ei.originalEvent.clientX;
        let mousey2 = ei.originalEvent.clientY;
        //   console.log(mousex2, mousey2);
        transform.x = sx + mousex2 - mousex;
        transform.y = sy + mousey2 - mousey;
        settransform(imgview);
      }
    });
  });
  $(imgdialog).on("mousewheel", function (e) {
    if (e.originalEvent.wheelDelta > 0) {
      transform.scale += 0.1;
    } else {
      transform.scale -= 0.1;
    }
    if (transform.scale < 0.5) {
      transform.scale = 0.5;
    }
    if (transform.scale > 5) {
      transform.scale = 5;
    }
    settransform(imgview);
  });
  $(imgdialog).on("dblclick", function (e) {
    transform.scale += 0.5;
    if (transform.scale > 2) {
      transform.scale = 2;
    }
    settransform(imgview);
  });

  $(imgdialog).mouseup(function () {
    move = false;
  });
}

// 设置transform
function settransform(imgview) {
  $(imgview).css({
    transform:
      "translate(" +
      transform.x +
      "px, " +
      transform.y +
      "px) scale(" +
      transform.scale +
      ")",
  });
}

// 清除事件
function clearmoveimage(imgdialog) {
  $(imgdialog).off("mousedown");
  $(imgdialog).off("mousemove");
  $(imgdialog).off("mouseup");
  $(imgdialog).off("mousewheel");
}

调用方法:

    // 样式代码
    <style>
      .img-dialog-view-class {
        position: fixed;
        left: 0;
        top: 0;
        width: 100%;
        height: 100%;
        background-color: #00000099;
        display: flex;
        align-items: center;
        justify-content: center;
      }

      .close-button {
        position: absolute;
        right: 10px;
        top: 10px;
        padding: 10px 20px;
        background-color: cornflowerblue;
        border-radius: 5px;
        color: #fff;
        z-index: 5;
        cursor: pointer;
      }
    </style>


    // html代码
    <div class="img-dialog-view-class" id="imgdialog">
      <div class="close-button">关闭</div>
      <img src="./demo.png" alt="" id="imgview" />
    </div>


    // js代码
    var imgdialog = "#imgdialog";
    var imgview = "#imgview";


    $(".button-class").click(function (e) {
        $(imgdialog).show();
        moveimageinit(imgdialog, imgview);
    })


    $(".close-button").click(function () {
      $(imgdialog).hide();
      // 清除事件
      clearmoveimage(imgdialog);
    });

因为页面还有其他内容,只将关键代码摘出

如需帮助可直接私信

QQ:929477145

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值