关于HTML5拖拽API的具体教程可以移步到教程区查看:
下面这个案例实现了拖拽或者点击选择多张图片,显示缩略图,并且可以删除缩略图等效果。
点击图片查看具体效果。
1、可以在本地选择多张图片一并拖拽到方框中,或者点击选择多张图片。
2、图片尺寸不能大于1M。
3、需要是图片格式,如果有某个文件不是图片格式,则跳过这个文件,继续上传后面的图片。
4、允许的图片格式:jpg|png|gif|jpeg|svg|webp
5、不能上传重复的图片。
6、点击关闭按钮会删除该图片。
核心代码如下:
const oDiv = document.querySelector('.box');
const oSltDivs = document.querySelector('.slts');
const oBtn = document.querySelector('#btn');
let base64Arr = [];
const size = 1024 * 1024;
// 把图片拖放到div中
oDiv.addEventListener('dragover', function (e) {
e.preventDefault();
})
// 释放图片,显示缩略图
oDiv.addEventListener('drop', function (e) {
// 浏览器的默认行为,会打开图片,所以需要阻止
e.preventDefault();
console.log(e);
// 直接获取dataTransfer下面的files文件。
let files = e.dataTransfer.files;
console.log(files);
readFilesToBase64(files)
})
// 删除,因为是动态更新的数据,所以使用事件委托
oSltDivs.addEventListener('click', function (e) {
let target = e.target;
if (target.className == 'btn-close') {
e.target.parentElement.parentElement.remove();
// 获取src的base64的编码字符串
let oImg = e.target.parentElement.parentElement.querySelector('.slt-cover').src;
console.log(oImg);
// 查找数组里面这个base64的位置
let index = base64Arr.indexOf(oImg);
console.log(index);
// 删除数据
base64Arr.splice(index, 1);
if (base64Arr.length > 0) {
oBtn.disabled = false;
} else {
oBtn.disabled = true;
}
}
})
// 读取图片,并转成base64位,并把缩略图保存在数组中
function readFilesToBase64(files) {
for (let i = 0; i < files.length; i++) {
let file = files[i];
let ruff = file.name.slice(file.name.lastIndexOf('.') + 1);
if (!isImgRuff(ruff)) {
alert('有文件不是图片格式');
// 如果图片不正确,则结束本张图片的循环,进入下一个文件的循环
continue;
}
if (file.size > size) {
alert('该图片体积大于1M');
continue;
}
// 通过验证的图片
let readfile = new FileReader();
readfile.readAsDataURL(file);
readfile.onload = function () {
let result = readfile.result;
// 去重
if (base64Arr.includes(result)) {
alert('已上传该图片!');
return;
}
base64Arr.push(readfile.result);
// 显示图片
oSltDivs.innerHTML += `<div class="slt">
<img src="${result}" class="slt-cover">
<div class="close"><img src="images/close.png" class="btn-close"></div>
</div>`
if (base64Arr.length > 0) {
oBtn.disabled = false;
} else {
oBtn.disabled = true;
}
}
}
}
// 图片格式校验
function isImgRuff(ruff) {
let reg = /jpg|png|gif|jpeg|svg|webp/;
return reg.test(ruff);
}
发表评论:
◎请发表你卖萌撒娇或一针见血的评论,严禁小广告。