js实现图片拖拽、根据鼠标位置放大、缩小功能,纵享丝滑

js实现图片拖拽、根据鼠标位置放大、缩小功能,纵享丝滑

废话不多说,上代码

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<style>
  .vm-img {
    position: relative;
    width: 800px;
    height: 800px;
    margin: auto;
    overflow: hidden;
  }

  img {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    width: 100%;
    height: 100%;
    object-fit: contain;
    transition: transform 0.2s;
  }
</style>

<body>
  <div class="vm-img">
    <img src="http://gips2.baidu.com/it/u=3944689179,983354166&fm=3028&app=3028&f=JPEG&fmt=auto?w=1024&h=1024">
  </div>
  <script>
    let imgScale = 100;
    let originX = 0;
    let originY = 0;
    let imgWidth = 0;
    let imgHeight = 0;
    const imgContent = document.querySelector('img');
    imgContent.onload = function () {
      imgWidth = this.offsetWidth;
      imgHeight = this.offsetHeight;
    }
    function centerFn(e) {
      // 改变transformOrigin值的时候,图片会发生移动,需要left,和top抵消偏移量
      const x = (e.offsetX / imgWidth) * 100;
      const y = (e.offsetY / imgHeight) * 100;
      if (originY) {
        imgContent.style.top =
          +imgContent.style.top.replace('px', '') - ((y - originY) / 100) * (1 - imgScale / 100) * imgHeight + 'px';
      }
      if (originX) {
        imgContent.style.left =
          +imgContent.style.left.replace('px', '') - ((x - originX) / 100) * (1 - imgScale / 100) * imgWidth + 'px';
      }
      originX = x;
      originY = y;
      if (originY && originX) {
        imgContent.style.transformOrigin = `${x}% ${y}%`;
      }
    }
    function mouseRollFn(e) {
      /* 最小范围 和 最大范围 的图片缩放尺度 */
      if (e.wheelDelta > 0) {
        // 鼠标向上滚动,放大
        e && centerFn(e);
        imgScale += 10;
        imgContent.style.transform = 'scale(' + imgScale / 100 + ')';
      }
      if (e.wheelDelta < 0) {
        e && centerFn(e);
        imgScale -= 10;
        imgContent.style.transform = 'scale(' + imgScale / 100 + ')';
      }
      return false;
    }
    // 移动
    function mouseDownFm(event) {
      event.preventDefault();
      const el = document.querySelector('img');
      // offSetX图片居中距离左侧的距离
      const disx = event.pageX - el.offsetLeft;
      const disy = event.pageY - el.offsetTop;
      document.onmousemove = function (f) {
        el.style.left = f.pageX - disx + 'px';
        el.style.top = f.pageY - disy + 'px';
      };
      document.onmouseup = function () {
        document.onmousemove = document.onmouseup = null;
      };
    }
    window.onload = () => {
      document.querySelector('img').addEventListener('mousewheel', mouseRollFn);
      document.querySelector('img').addEventListener('mousedown', mouseDownFm);
    }
  </script>
</body>

</html>
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现丝滑的轮播图,可以使用以下几个步骤: 1. 定义轮播图容器和轮播图项的样式,包括宽度、高度、边框、位置等。 2. 在HTML中定义轮播图容器和轮播图项。 3. 使用JavaScript获取容器和轮播图项的元素对象,并计算容器和每个轮播图项的宽度。 4. 设置一个定时器,每隔一定时间切换轮播图项。可以使用CSS3的transition属性让切换过程更加流畅。 5. 切换轮播图项时,将当前的轮播图项向左移动一个容器的宽度,同时将下一个轮播图项向右移动一个容器的宽度。为了实现循环轮播,需要将最后一个轮播图项移到第一个轮播图项的位置。 6. 当轮播图项切换完成后,需要修改当前轮播图项的位置,保证下次切换时轮播图项的位置是正确的。 以下是一个简单的轮播图实现示例: HTML代码: ``` <div class="slider-container"> <div class="slider-item">轮播图1</div> <div class="slider-item">轮播图2</div> <div class="slider-item">轮播图3</div> </div> ``` CSS代码: ``` .slider-container { width: 600px; height: 300px; position: relative; overflow: hidden; } .slider-item { width: 600px; height: 300px; position: absolute; top: 0; left: 0; border: 1px solid #ccc; text-align: center; line-height: 300px; font-size: 24px; } ``` JavaScript代码: ``` var container = document.querySelector('.slider-container'); var items = document.querySelectorAll('.slider-item'); var width = container.offsetWidth; var index = 0; setInterval(function() { var nextIndex = (index + 1) % items.length; items[index].style.transition = 'left 0.5s'; items[nextIndex].style.transition = 'left 0.5s'; items[index].style.left = -width + 'px'; items[nextIndex].style.left = '0px'; if (nextIndex == 0) { setTimeout(function() { items[index].style.transition = ''; items[nextIndex].style.transition = ''; items[index].style.left = (items.length - 1) * width + 'px'; items[nextIndex].style.left = width + 'px'; }, 500); } index = nextIndex; }, 3000); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值