The style of input[type="file"] behaves differently in various browsers:
1.chrome:
2.firefox:
3. opera:
4.ie:
5.edge:
In addition, when we specify the height of input[type="file"] and set its line height to be equal to its height, an ugly style appears in chrome:
The line "No files selected" is not centered vertically.
It seems to look better in firefox. Well, I prefer using firefox. However, the performance in these browsers is inconsistent, and we must do compatibility processing.
Idea:
1. Customize a style similar to one of the browsers and put it on the lower layer;
2. "Hide" the style displayed by the browser itself, and place opacity: 0; on the upper layer, so that what we click is the event that input[type="file"] responds to;
3. After selecting a file or changing a file, change the value of displayed file.
Code:
html: <form action="" class="activityForm"> <div class="file"> <label for="file">文件:</label> <div class="userdefined-file"> <input type="text" name="userdefinedFile" id="userdefinedFile" value="未选择任何文件"> <button type="button">上传</button> </div> <input type="file" name="file" id="file"> </div> </form>
css: .file { position: relative; height: 40px; line-height: 40px; } .file label { display: inline-block; } .userdefined-file { position: absolute; top: 0; left: 60px; z-index: 2; width: 300px; height: 40px; line-height: 40px; font-size: 0; /*应对子元素为 inline-block 引起的外边距*/ } .userdefined-file input[type="text"] { display: inline-block; vertical-align: middle; padding-right: 14px; padding-left: 14px; width: 220px; box-sizing: border-box; border: 1px solid #ccc; height: 40px; line-height: 40px; font-size: 14px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .userdefined-file button { display: inline-block; vertical-align: middle; width: 80px; text-align: center; height: 40px; line-height: 40px; font-size: 14px; background-color: #f54; border: none; color: #fff; cursor: pointer; } .file input[type="file"] { position: absolute; top: 0; left: 60px; z-index: 3; opacity: 0; width: 300px; height: 40px; line-height: 40px; cursor: pointer; }
js: document.getElementById("file").onchange = function() { document.getElementById("userdefinedFile").value = document.getElementById("file").value; }
After processing in this way, the performance will be consistent in various browsers:
1. In chrome when no file is selected:
2. After selecting the file, in firefox: