Microsoft Edge(以下Edge)やその他のブラウザでは、<input type="file">
をすると以下のようなデザインになります。
ちなみにInternetExploer(以下IE)では、以下のようなデザインになります。(以下はIEモードで開いています。)
今回は、EdgeでIEのようなスタイルに変更したいと思います。
Microsoft Edgeのバージョンは、120.0.2210.91となります。
ソースコード
<!DOCTYPE html>
<html>
<head>
<title>TEST</title>
<style>
label {
display: inline-block;
height: 20px;
vertical-align: middle;
}
input[type="text"] {
background-color: #ebebeb;
border: solid #c7c6c6 1px;
outline: none;
height: 100%;
box-sizing: border-box;
}
input[type="file"]{
display: none;
}
p {
cursor: pointer;
padding: 1px 10px;
font-size: small;
background-color: #ebebeb;
border: solid 1px #b7b7b7;
display: inline-block;
height: 100%;
box-sizing: border-box;
vertical-align: middle;
}
</style>
</head>
<body>
<label for="file">
<input id="file_name" type="text" readonly="readonly"><p>参照...</p>
<input id="file" type="file">
</label>
<script>
const fileName = document.getElementById("file_name");
const fileInput = document.getElementById("file");
fileInput.addEventListener("change", () => {
fileName.value = fileInput.value;
});
</script>
</body>
</html>
上記ソースコードのポイント
親要素のlabelタグを20pxにし、inputタグとpタグの高さをheight:100%
とし、統一しています。
labelタグでfor="file"
とすることで<input id="file">
と紐づけています。
こうすることでlabel要素内のpタグをクリックすることで<input id="file">
をクリックすることができます。
<p>参照...</p>
ですが、inputタグの横に記述することで、inputタグとのスペースをなくしています。
<input id="file_name">
は、IEにおけるファイル名を表示する役割を果たし、readonlyとすることでキーボードからの入力をできなくしています。
<input id="file">
は、display: none;
にすることで非表示にしています。
changeイベントで選択されたファイルを<input id="file_name">
に表示させています。
Edgeで表示
Edgeで先ほどのソースコードを表示させると
IEと同じようなデザインとなりました。
めでたし、めでたし。。。