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

JavaScript拖拽上传多图片后,如何实现点击右上角按钮删除对应图片

拖拽上传图片新增删除功能实现

本次调整核心是实现点击右上角叉号删除对应图片的需求,同时修正原代码语法错误、优化布局适配多图展示场景。


完整调整后代码

HTML代码

<br /><br />
<div class="container">
    <div class="row">
        <div>
            <div id="dropZone">
                <div class="icon"><i class="fas fa-cloud-upload-alt"></i></div>
                <header id="BackgroundText">拖拽文件到此处上传</header>
                <div id="imageHold" style="display:flex;gap:10px;flex-wrap:wrap;padding:10px;"></div>
            </div>
        </div>
    </div>
</div>
<div id="imgDetail" style="margin-top:15px;"></div>

CSS代码

#dropZone {
  border: 2px dashed gray;
  min-height: 200px;
  width: auto;
  border-radius: 5px;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-direction: column;
  padding: 10px;
}
#dropZone header{
  font-size: 20px;
  font-weight:bold;
}
.hoverActive{
  border: 2px dashed darkred !important;
}
/* 单张图片包裹容器 */
.img-item {
  position: relative;
  display: inline-block;
}
/* 删除按钮样式,定位到图片右上角 */
.delete-btn {
  position: absolute;
  top: -8px;
  right: -8px;
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: #000;
  color: #fff;
  border: none;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 12px;
  padding: 0;
}

JavaScript代码

var dropZone = document.getElementById('dropZone');
var details = document.querySelector('#imgDetail');
var imageHold = document.getElementById('imageHold');
var backgroundText = document.getElementById('BackgroundText');

///////////
// 拖拽经过事件
///////////
dropZone.addEventListener('dragover', function (e) {
    e.stopPropagation();
    e.preventDefault();
    e.dataTransfer.dropEffect = 'copy';
    dropZone.classList.add("hoverActive");
});

/////////////
// 拖拽离开事件
/////////////
dropZone.addEventListener('dragleave', function (e) {
    dropZone.classList.remove("hoverActive");
});

//////////
// 文件放下事件
//////////
dropZone.addEventListener('drop', (e) => {
    dropZone.classList.remove("hoverActive");
    backgroundText.style.visibility = "hidden";
    e.stopPropagation();
    e.preventDefault();

    details.innerHTML = '';
    var files = e.dataTransfer.files;

    Object.values(files).forEach((file) => {
        var reader = new FileReader();
        reader.onloadend = () => {
            // 创建单张图片的包裹容器
            const imgItem = document.createElement('div');
            imgItem.className = 'img-item';

            // 渲染图片
            var img = document.createElement('img');
            img.src = reader.result;
            img.width = 150;
            img.height = 150;
            img.border = 2;
            imgItem.appendChild(img);

            // 创建删除按钮并绑定删除事件
            const deleteBtn = document.createElement('button');
            deleteBtn.className = 'delete-btn';
            deleteBtn.innerText = 'X';
            deleteBtn.onclick = function() {
                // 删除对应图片容器
                imgItem.remove();
                // 删除对应的文件信息展示
                if (fileDetailEle) fileDetailEle.remove();
                // 所有图片删完后恢复提示文字
                if (imageHold.children.length === 0) {
                    backgroundText.style.visibility = 'visible';
                }
            }
            imgItem.appendChild(deleteBtn);
            imageHold.appendChild(imgItem);

            // 渲染文件信息
            const fileDetailEle = document.createElement('p');
            fileDetailEle.innerText = `文件名: ${file.name} | 大小: ${bytesToSize(file.size)}`;
            details.appendChild(fileDetailEle);
        };
        reader.readAsDataURL(file);
    });
});

// 字节大小格式化
function bytesToSize(bytes) {
    var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
    if (bytes == 0) return '0 Byte';
    var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
    return Math.round(bytes / Math.pow(1024, i), 2) + ' ' + sizes[i];
}

调整说明

  • 新增独立的图片容器包裹单张图片和删除按钮,通过相对+绝对定位实现按钮悬浮在图片右上角的效果
  • 每个删除按钮绑定独立点击事件,点击时同步删除对应图片和文件明细
  • 新增无图片时自动恢复上传提示文字的逻辑
  • 修正原代码字符串拼接的语法错误,移除重复ID的问题
  • 优化图片容器布局,支持多图自动换行展示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 04:36:03