效果
代码实现
调用
let uploading = document.querySelector(".uploading")
let file = upLoading(uploading)
file.imgFile()
或
file = upLoading(
this.el.uploading,
imgArr,
6,
300,
false,
function() {
toastr.warning("图片太大!")
},
function() {
toastr.warning("文件类型错误!")
},
function() {
toastr.warning("图片数量超出!")
}
)
html结构
<div class="uploading">
</div>
js
window.upLoading = upLoading
function upLoading(con,imgArr=[],imgLimit=6,imgSize=1024,defaultUrl,imgSizeFun,imgTypeFun,imgNumFun){
defaultUrl = defaultUrl || "../../img/404_not_found.png"
let listObj = {}
let imgIndex = 0;
let upLoadings = true;
function createDom(nodeName,classList){
var node = document.createElement(nodeName)
node.classList = classList || ""
return node
}
function createImgKuai(src,old,closeFun){
let imgList = createDom('div','imgList upkuai')
let img = createDom('img')
let imgclose = createDom('div','imgclose')
img.onerror = function(){
this.dataset.errorsrc = this.src
this.src = defaultUrl
this.onerror = null;
}
img.src = src
imgclose.dataset.img = imgIndex
imgList.appendChild(img)
imgList.appendChild(imgclose)
listObj[imgIndex].src = src
listObj[imgIndex].dom = imgList
listObj[imgIndex].old = old
imgIndex++
imgclose.addEventListener("click",function(){
closeFun && closeFun(this.dataset.img)
})
return imgList
}
let fileAdd = createDom('div','fileAdd upkuai')
let fileimg = createDom('img')
fileimg.src = "../../img/xfm/add.jpg"
let fileinput = createDom('input','fileinput')
fileinput.type = 'file'
fileAdd.appendChild(fileinput)
fileAdd.appendChild(fileimg)
fileimg.onerrr = function(){
this.src = defaultUrl
this.img.onerror = null;
}
fileinput.addEventListener("change",function(e){
upLoadings = false
fileimg.src = "../../img/xfm/loadicon.png"
fileimg.classList.add("loading")
this.disabled = true
if(!this.files.length){
disabledinput()
return
}
if(Object.keys(listObj).length >= imgLimit){
console.log("图片超出"+imgLimit +"张!!")
imgNumFun && imgNumFun()
disabledinput()
return
}
var file = this.files[0]
var type = file.type.split("/")[1]
if (file.type !== 'image/jpeg' && file.type !== 'image/jpg' && file.type !== 'image/png' && file.type !== 'image/gif') {
console.log('不是有效的图片文件!');
imgTypeFun && imgTypeFun()
disabledinput()
return;
}
var size = Math.floor(file.size/1024)
if(size > imgSize){
console.log('图片太大!');
imgSizeFun && imgSizeFun()
disabledinput()
return;
}
var reader = new FileReader();
reader.onload = function(e) {
var base64 = e.target.result;
listObj[imgIndex] = {file:file,dom:"",base64file:"",type:type,name:file.name}
listObj[imgIndex].base64file = base64
var addkuai = createImgKuai(base64,false,function(index){
listObj[index].dom.remove()
delete listObj[index]
})
con.insertBefore(addkuai,fileAdd)
disabledinput()
}
reader.readAsDataURL(file);
})
function disabledinput(){
upLoadings = true
fileinput.disabled = false
fileimg.src = "../../img/xfm/add.jpg"
fileimg.classList.remove("loading")
}
con.appendChild(fileAdd)
imgArr.forEach(item=>{
listObj[imgIndex] = {}
var addkuai = createImgKuai(item,true,function(index){
listObj[index].dom.remove()
delete listObj[index]
})
con.insertBefore(addkuai,fileAdd)
})
function imgFile(){
return listObj
}
return {
imgFile
}
}
css
.uploading{
display: flex;
flex-wrap: wrap;
}
.uploading>div{
margin-right: 10px;
}
.uploading img{
width: 100%;
height: 100%;
}
.upkuai{
width: 50px;
height: 50px;
}
.imgList{
position: relative;
}
.imgList .imgclose{
display:none;
position: absolute;
top: -6px;
right: -6px;
background-color: red;
width: 12px;
height: 12px;
border-radius: 50%;
cursor: pointer;
}
.imgList:hover .imgclose{
display: block;
}
.fileAdd{
border: 1px solid gray;
border-radius: 5px;
position: relative;
overflow: hidden;
cursor: pointer;
}
.fileAdd input{
position: absolute;
display: block;
width: 100%;
height: 100%;
opacity: 0;
cursor: pointer;
}
.fileAdd .loading{
width: 30px;
height: 30px;
margin: 9px auto;
display: block;
cursor: wait;
animation: myRolate 1.5s linear infinite;
}
@keyframes myRolate{
form{
transform: rotate(0deg);
}
to{
transform: rotate(360deg);
}
}