提到上传文件,首先想到用input file属性来实现,简单便捷,一行代码即可。可是如果想自定义input样式,往往是一件麻烦的事,因为我们无法单纯用CSS给它定义兼容的样式。现在有一种很好的解决方法,那就是使用label标签,用label标签的for属性关联到input文件输入框,点击label标签时会触发input文件输入框,相当于点击了文件输入框。最后别忘了把input隐藏掉。
本站评论区使用的传图功能就是基于此方法实现。
html部分
<!-- 使用label美化input标签 --> <!-- accept接收的文件类型 image/*图片样式 --> <input type="file" id="upload" accept="image/*" style="display: none;"> <!-- for属性绑定input标签 --> <label for="upload" id="send">点我上传图片至图床</label> <br> <!-- 图片展示区域 --> <img src="" id="pic" width="200px" style="display: none;" height="120px;">
css部分
<style>
#send {
display: inline-block;
width: 200px;
height: 60px;
line-height: 60px;
text-align: center;
border-radius: 5px;
background: aqua;
cursor: pointer;
}
</style>
js部分
<script>
// 获取dom元素
let upload = document.querySelector('#upload');
let send = document.querySelector('#send');
let pic = document.querySelector('#pic');
// 绑定事件
upload.addEventListener('change', function() {
console.log(this.files);
// 上传多个文件可用for循环 input默认上传最多1个文件
// 如需一次性传入多个文件可在input标签加上multiple="multiple"
for (var i = 0; i < this.files.length; i++) {
var f = this.files[i];
// 判断文件类型
if (!/image\/\w+/.test(f.type)) {
alert('请选择图片文件(png | jpg | gif)');
return
}
}
var formData = new FormData();
formData.append('file', f); // formData对象根据图床的api不同可能需要更换
formData.append('ispwd', 1);
formData.append('pwd', 'mima');
fetch("图床链接", { //填写自己的图床api
method: "POST",
body: formData
})
.then((res) => {
return res.json();
})
.then((data) => {
console.log(data);
send.innerText = "上传成功,继续上传"
pic.src = data.viewurl; // 根据自己图床的返回链接展示图片
pic.style.display = "block";
})
})
</script>







