自定義input檔案上傳樣式
阿新 • • 發佈:2018-12-17
檔案上傳是我們經常會用到的功能,但是原生的input樣式太醜了,能不能自定義一個input檔案上傳樣式呢?
我這裡寫了兩種方法,form表單提交跟ajax非同步提交都沒有問題,自動上傳或者點選上傳按鈕上傳也都沒問題
先看效果:
程式碼貼出來:
方法1
<!-- 方法1: div : 設定寬高、overflow:hidden;超出的部分被隱藏 input : 設定層級z-index = 1;設定透明度opacity:0;設定相對定位position:relative;使兩個元素重疊 i : 設定層級z-index = 0;(要比input小)設定相對定位position:relative;使兩個元素重疊 利用div框出大小,input在i上面但透明度為0,當我們點選i時其實是點選到了input但視覺上我們只看到了i--> <h3>方法1:</h3> <form action="upload" method="post" enctype="multipart/form-data"> <!-- 輔助div,框出顯示內容 --> <div style="width: 20px;height: 20px;overflow:hidden;"> <!-- 實際的選擇檔案input --> <inputstyle="position:relative;z-index :1;opacity:0" onchange="change()" id="file" type="file" name="file"/> <!-- 可檢視標 --> <i class="glyphicon glyphicon-open" style="position:relative;top:-22px;z-index :0;font-size: 20px;"></i> </div> <!-- 檔名 --> <br/><span id="fileName"></span> <!-- 表單提交按鈕 --> <br/><input id="but_submit" type="submit" value="上傳"/> </form> <script> function change() { //回顯檔名 $("#fileName").text($("#file").val()); } </script>
方法2
<!-- 方法2: input : 設定層級display: none; 直接隱藏 i : onclick="document.getElementById('file2').click();" 圖示的click觸發input的click 直接隱藏input,設定圖示的click觸發input的click,從而達到我們想要的效果 --> <h3>方法2:</h3> <form id="uploadForm"> <!-- 實際的選擇檔案input --> <input style="display: none;" onchange="change2()" id="file2" type="file" name="file"/> <!-- 可檢視標 --> <i class="glyphicon glyphicon-open" style="font-size: 20px;" onclick="document.getElementById('file2').click();"></i> <!-- 檔名 --> <br/><span id="fileName2"></span> </form> <script> //自動上傳 function change2() { //回顯檔名 $("#fileName2").text($("#file2").val()); //執行上傳 var form = new FormData(document.getElementById("uploadForm")); $.ajax({ url: ctx + "/rack/upload", type: "post", data: form, processData: false, contentType: false, success: function (data) { console.log(data); }, error: function (e) { console.log(e); } }); } </script>
controller
@PostMapping("upload") public ResultModel<Boolean> upload(MultipartFile file) { //檔名 System.out.println(file.getOriginalFilename()); return ResultModel.of(true); }
樣式還是醜了一點,但這些都不重要,關鍵是掌握了方法再找個UI小姐姐來幫忙除錯,就可以做出任何想要的UI效果啦!