input[type="file"] のデザインを簡単に変える方法

ファイルを選択する input[type="file"] は、大抵テキストボックスとボタンで構成されているが、それらを個別にデザイン変更したりすることができない。

そこで、このファイル要素を label 要素で囲み、その中で別にボタンを作ってやることで、簡単にデザインを変えられる。

<label for="file-up">
  <span class="btn">ファイルを選択</span>
  <input type="file" id="file-up">
</label>

ファイル要素自体は非表示にしておく。

#file-up {
  display:none;
}

あとは span.btn をテキトーにデザインしてやったりすれば良い。

ファイル要素を囲んでいる label 要素なら、for 属性は書かなくても動くと思う。

選択したファイルなどは、元のとおり input[type="file"#file-up が保持するので、その他の制御には変更が要らない。

この例だと、アップしたファイル名を表示するテキストボックスがないのだが、File API を使えばファイル名は取得できるので (フルパスなどはセキュリティのため不可)、JavaScript を絡めてやれば良い。