Кроссбраузерная стилизация input type="file" с помощью CSS
Продолжаем тему извечного противостояния дизайнеров и верстальщиков. Основной конфликт возникает тогда, когда дизайнер рисует картинку сайта так, как нужно заказчику, а потом верстальщику приходится адаптировать под это изображение различные элементы HTML. Один из самых сложных для стилизации элементов - это поле выбора файлов, элемент input с типом file. В качестве наглядного примера, вот как он отображается в различных браузерах:Поле input type="file" в разных браузерах
Дополнительную сложность создает то, что это поле попадает под различные правила безопасности браузеров, поэтому его нельзя, например, заменить каким-нибудь стилизованным div, нельзя обернуть тегом label, нельзя напрямую присвоить значение с помощью скриптов или вызвать окно выбора файла, сэмулировав нажатие через element.click(). А в некоторых браузерах даже нельзя сделать поле выбора файлов скрытым, так как после отправки формы его значение не будет передано на сервер. В разных интернетах я встречал попытки сделать кроссбраузерное решение, но все они, на самом деле, не универсальные и ограничиваются конкретными браузерами.
Когда мне понадобилось решить эту проблему, я решил воспользоваться уже проверенным трюком, при котором нужный элемент помещается внутрь блока div с фиксированными размерами и фоновым изображением, а самому же элементу присваивается атрибут "прозрачный". Не скрытый, а именно полностью прозрачный. Еще немного пришлось пошаманить, чтобы в границах родительского div'а оказалась область input, отвечающая на клик мышкой и открывающая окно выбора файла. Для этого был максимально увеличен шрифт и высота самого input'а. HTML-код получается простейший:
Code (HTML) : Убрать нумерацию
- <div class="input_file">
- <input type="file" size="1" name="uploaded_file" />
- </div>
Code: Убрать нумерацию
- .input_file {
- width: 210px;
- height: 70px;
- background: url('upload_select.png') no-repeat;
- cursor: pointer;
- overflow: hidden;
- padding: 0;
- }
- .input_file input {
- opacity: 0;
- filter: alpha(opacity:0);
- font-size: 200px;
- height: 200px;
- padding: 0;
- margin: 0 0 0 -450px;
- border: 0 none;
- cursor: pointer;
- }
На этом можно было бы и закончить, но в некоторых случаях может понадобиться имя выбранного файла, например, чтобы до отправки формы мы могли выполнить предварительную проверку, если ожидается файл определенного типа. Или же, например, чтобы пользователь мог проверить, тот ли файл он загружает. В обычном поле input пользователь его и так видит, а в нашем стилизованном - нет. Для этого добавим обработчик на событие onchange, HTML-код немного дополнится:
Code (HTML) : Убрать нумерацию
- <input type="file" size="1" name="uploaded_file" id="uploaded_file"
- onchange="file_selected();" />
- <div id="file_name"></div>
- <div id="file_size"></div>
Code (JavaScript) : Убрать нумерацию
- <script type="text/javascript">
- function file_selected() {
- try {
- var file = document.getElementById('uploaded_file').files[0];
- if (file) {
- var file_size = 0;
- if (file.size > 1024 * 1024) {
- file_size = (Math.round(file.size*100/(1024*1024))/100).toString() + 'MB';
- }
- else {
- file_size = (Math.round(file.size*100/1024)/100).toString() + 'KB';
- }
- document.getElementById('file_name').innerHTML = 'Name: ' + file.name;
- document.getElementById('file_size').innerHTML = 'Size: ' + file_size;
- }
- }
- catch(e) {
- var file = document.getElementById('uploaded_file').value;
- file = file.replace(/\\/g, "/").split('/').pop();
- document.getElementById('file_name').innerHTML = 'Name: ' + file;
- }
- }
- </script>
Готовый пример формы со стилизованным полем выбора файла и его обработкой, вы можете посмотреть на демонстрационной странице.
Просмотров: 14346 | Комментариев: 3
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Иван
(14.09.2017 в 21:00):
Большое спасибооо.
Алексей
(02.06.2016 в 05:36):
Спасибо. Всё понадобилось.
Но себе ещё и превьюху классную сделали Хд (которую удалось стащить с js с помощью исходного кода)
Но себе ещё и превьюху классную сделали Хд (которую удалось стащить с js с помощью исходного кода)
X-Wing Top Ace
(13.04.2015 в 10:11):
И в программе для их скачивания (предпоследний пример). ;))))
Добавить комментарий
Заполните форму для добавления комментария