You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

移除jQuery后使用Croppie实现图片裁剪时遭遇错误求助

移除jQuery实现图片裁剪功能的解决方案

我完全懂你的痛点——那个标注"纯JavaScript"的示例居然偷偷用了jQuery,想砍掉jQuery简化维护却踩了坑对吧?别担心,我帮你把示例的核心裁剪逻辑完全转换成原生JS,保留所有功能的同时彻底摆脱jQuery依赖。

先拆解原示例的jQuery依赖点

原示例里用到的jQuery功能其实都是原生API可以替代的:

  • 文档就绪事件 → 用DOMContentLoaded监听
  • DOM选择器 → 用getElementById/querySelector
  • 事件绑定 → 用addEventListener
  • 样式操作 → 直接操作元素的style属性
  • DOM插入 → 用appendChild

完整原生实现代码

HTML

<div id="page">
  <div id="demo-basic">
    <!-- 裁剪容器,JS会动态添加图片和调整手柄 -->
  </div>
</div>

CSS(补全你提供的部分,匹配原示例样式)

#page {
  background: #FFF;
  padding: 20px;
  max-width: 800px;
  margin: 0 auto;
}

#demo-basic {
  position: relative;
  width: 100%;
  height: 400px;
  border: 1px solid #ccc;
  overflow: hidden;
}

.crop-image {
  position: absolute;
  top: 0;
  left: 0;
  cursor: move;
}

.crop-handle {
  position: absolute;
  width: 12px;
  height: 12px;
  background: #fff;
  border: 1px solid #333;
  border-radius: 50%;
  cursor: nwse-resize;
}

原生JavaScript代码

document.addEventListener('DOMContentLoaded', function() {
  const container = document.getElementById('demo-basic');
  let img = null;
  let isDragging = false;
  let startX, startY, initialX, initialY;
  let isResizing = false;
  let resizeStartX, resizeStartY, initialWidth, initialHeight;

  // 加载目标图片(替换成你的图片URL即可)
  function loadImage() {
    img = new Image();
    img.src = 'https://picsum.photos/800/600';
    img.className = 'crop-image';
    img.onload = function() {
      // 初始化图片的默认位置和大小
      img.style.width = '600px';
      img.style.height = 'auto';
      img.style.top = '50px';
      img.style.left = '100px';
      container.appendChild(img);
      addResizeHandle();
    };
  }

  // 添加右下角的尺寸调整手柄
  function addResizeHandle() {
    const handle = document.createElement('div');
    handle.className = 'crop-handle';
    handle.style.bottom = '5px';
    handle.style.right = '5px';
    container.appendChild(handle);

    // 绑定调整大小的事件监听
    handle.addEventListener('mousedown', startResize);
    document.addEventListener('mousemove', resize);
    document.addEventListener('mouseup', stopResize);
  }

  // 图片拖动开始
  function startDrag(e) {
    isDragging = true;
    startX = e.clientX;
    startY = e.clientY;
    initialX = parseInt(img.style.left) || 0;
    initialY = parseInt(img.style.top) || 0;
    img.style.cursor = 'grabbing';
  }

  // 图片拖动逻辑
  function drag(e) {
    if (!isDragging) return;
    const dx = e.clientX - startX;
    const dy = e.clientY - startY;
    img.style.left = `${initialX + dx}px`;
    img.style.top = `${initialY + dy}px`;
  }

  // 停止图片拖动
  function stopDrag() {
    isDragging = false;
    img.style.cursor = 'move';
  }

  // 开始调整图片尺寸
  function startResize(e) {
    isResizing = true;
    resizeStartX = e.clientX;
    resizeStartY = e.clientY;
    initialWidth = parseInt(img.style.width) || img.width;
    initialHeight = parseInt(img.style.height) || img.height;
    document.body.style.cursor = 'nwse-resize';
    e.preventDefault();
  }

  // 尺寸调整逻辑(保持宽高比)
  function resize(e) {
    if (!isResizing) return;
    const dx = e.clientX - resizeStartX;
    const dy = e.clientY - resizeStartY;
    const newWidth = initialWidth + dx;
    // 按原图比例计算高度,避免拉伸变形
    const newHeight = initialHeight + (dy * (initialHeight / initialWidth));
    // 设置最小尺寸限制,防止图片太小
    img.style.width = `${Math.max(100, newWidth)}px`;
    img.style.height = `${Math.max(75, newHeight)}px`;
  }

  // 停止尺寸调整
  function stopResize() {
    isResizing = false;
    document.body.style.cursor = 'default';
  }

  // 绑定图片拖动的事件监听
  container.addEventListener('mousedown', function(e) {
    if (e.target === img) {
      startDrag(e);
    }
  });
  document.addEventListener('mousemove', drag);
  document.addEventListener('mouseup', stopDrag);

  // 初始化加载图片
  loadImage();
});

关键转换说明

  1. 文档就绪:用document.addEventListener('DOMContentLoaded')替代jQuery的$(document).ready(),确保DOM加载完成后再执行代码
  2. DOM选择:用getElementById直接获取容器元素,比jQuery选择器更高效
  3. 事件绑定:全部使用原生addEventListener,支持多事件绑定且没有兼容性问题(现代浏览器都支持)
  4. 样式操作:直接通过元素的style属性读写样式,替代jQuery的css()方法
  5. DOM创建与插入:用document.createElement创建调整手柄,appendChild插入到容器中

你可以直接把这段代码替换掉原来的jQuery版本,测试一下图片拖动和尺寸调整功能,和原示例完全一致,而且彻底摆脱了jQuery依赖,后续维护起来更省心。

内容的提问来源于stack exchange,提问作者Dan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:45:11