提到上传文件,首先想到用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>