<input type=”file”>
ファイルアップロードボタンの装飾
フォームのファイルアップロードボタンを作る際に、<input type=”file”>を使用することがあるかと思います。
しかし、このボタンはそのまま装飾しようとしても、CSSだけではテキストの色を変えるなど、単純な装飾しかできず、ほとんど見た目を変えることができません。
これを装飾するには、<label>タグやjavascript等を使用してデザインを変更する必要があります。今回はその方法を紹介します。
デモ:http://marukin-ad.jp/maru_school/kuma/input/
方法1:<input>を<label>で囲い、<label>に対して装飾する
<label for="sample1"> ファイルを選択 <input type="file" id="sample1"/> </label>
label { background: #000; color: #fff; cursor: pointer; padding: 15px 30px; margin: 0 10px 0 0; display: inline-block; } label input { display: none; }
簡単に説明しますと、<input>を<label>で囲い、forを使い関連付けます。
そして、<input>をdisplay:none;で非表示にして、後は<label>に対して好きな装飾をするだけです。この方法を使えば、cssのみでとても簡単にデザインを変更できます。
background-imageを設定すれば、ボタンを画像にすることもできますし、角丸やグラデーションを使うことで様々な装飾が可能です。しかし、この方法では<input type=”file”>のデフォルト機能である、選んだファイル名を表示させることができません。表示させなくてもいいのであればこの方法でもいいですが、これがないと何を選択したかが後から確認できず、ユーザビリティもよくありませんので、あまりオススメできません。
この問題は、ちょっと手間がかかりますがjavascriptを使用することで解決できます。
方法2:javascriptを使用し、
デフォルト機能をそのままに装飾する
<div id="btn">ファイルを選択</div> <input type="file" id="files"/> <input type="text" id="filename" placeholder="選択されていません" readonly />
#btn { background: #000; color: #fff; cursor: pointer; padding: 15px 30px; display: inline-block; } input { background: none; box-shadow: none; border: none; }
<script type="text/javascript"> $(function() { $('#files').css({ 'position': 'absolute', 'top': '-9999px' }).change(function() { var val = $(this).val(); var path = val.replace(/\\/g, '/'); var match = path.lastIndexOf('/'); $('#filename').css("display","inline-block"); $('#filename').val(match !== -1 ? val.substring(match + 1) : val); }); $('#filename').bind('keyup, keydown, keypress', function() { return false; }); $('#filename, #btn').click(function() { $('#files').trigger('click'); }); }); </script>
この方法では、<label>ではなく、<div>に対して装飾します。#btnか#filenameをクリックした時に、#filesをクリックした時と同じようにさせています。そして、選んだファイル名を、#filenameに反映させます。<input type=”text”>の値を書き換えられてしまうのを防ぐためにreadonlyと設定しましょう。
この方法であれば、cssのみで装飾する方法と比べて手間がかかりますが、デフォルトの機能をそのままに、自由にデザインを変えることができます。
まとめ
サイト制作の際に、お問い合わせフォームなどで使用する<input>タグですが、その中でも<input type=”file”>は装飾が大変です。そして、<input type=”file”>はデフォルトの見た目が地味なため、ボタンの見た目を変えたいという要望が多くなりがちです。
しかし上記のように、他のinputタグと比べて装飾にとても手間がかかりますし、デフォルトと同じような機能をつけようとすればjavascriptを使用しなくてはいけないので、ちょっと抵抗を感じるかもしれません。<input type=”file”>は他のフォーム機能と比べて使用頻度があまり高くないので、いざ使うとなった時に「どうやるんだっけ?」となることが多いと思います。そうなった時に、今回紹介した方法で、コーディングの手間を少しでも省いてもらえればと思います。
WEBプログラマー / K.S