Главная » Статьи » Web-кодинг » CSS

Стилизация файл-инпутов (input type=file)

Столкнулся с непроходимостью стилизовать инпут типа файл.
Оказалось это не совсем просто.
Поискал в Инете, нашёл несколько способов видоизменения данного поля, но большинство из них вовсю используют JavaScript и слишком громоздки и избыточны.

Мне нужен был простой и лёгкий способ, без всяких наворотов.

Вот мой вариант.
Смысл примерно такой: запаковываем файл-инпут в блок, с фоновой картинкой кнопки,создаём дополнительный инпут для вывода значения (название выбранного файла) из inputtype="file", и скрываем стилями файл-инпут.

Приступим.

Исходные данные страницы, с которой буду работать, такие:

Code (HTML)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Cтилизация файл-инпутов (тип file)</title>
<style type="text/css">
/* ResetStyle */
*{margin:0;padding:0;border:none;outline:0;}
html,body{height:100%;font:11px/1 Verdana,sans-serif;}
input{border:1px solid #D7D7D7;}
#exContent{width:80%;margin:0 auto;padding-top:50px;text-align:left;}
/* EndStyle */
</style>
</head>
<body>
<div id="exContent">
<form action="" method="get">
<input name="myfile" size="1" type="file" />
</form>
</div>
</body>
</html>

Сначала, запакуем инпут в блок, зададим класс инпуту и блоку, и добавим дополнительный инпут в который, позже, будем выводить данные выбранного файла:


Code (HTML)
<form action="" method="get">
<div class="file-input-box">
<input id="fileName" class="file-input-text" readonly="readonly" />
<input class="file-input" name="myfile" size="1" type="file" />
</div>
</form>

Задаём блоку фоновую картинку в виде кнопки и его габариты, а дополнительному инпуту обтекание и размеры.
Для всех инпутов в блоке зададим overflow:hidden;

Фоновая картинка (кнопка):
Cтилизация файл-инпутов. Картинка кнопки

Стили:

Code (CSS)
.file-input-box,.file-input-box input{overflow:hidden;}
.file-input-box{position:relative;width:300px;height:24px;background:url('/_example/_test/fileinput/fileinputbutton.png')no-repeat right top;cursor:pointer;}
.file-input-text{float:left;height:20px;line-height:20px;width:215px;}

Результат:


Теперь, скроем до конца файл инпут, позиционируем его как нужно - под фоновую картинку, и пропишем размеры:

Стили:

Code (HTML)
.file-input {position:absolute;right:0px;top:0px;width:81px;height:22px;font-size:99px;opacity:0;filter:alpha(opacity=0);cursor:pointer;}

Размеры файл-инпута равны размерам кнопки. а этими стилями - opacity:0;filter:alpha(opacity=0);- делаем его прозрачным.

Результат:


И последнее, пишем маленький JavaScript, который при событии onchange инпутаtype="file" будет заполнять дополнительный текстовый инпут значением(названием выбранного файла) из инпута type="file".
И вешаем его на файл-инпут.

Html-код:

Code (HTML)
<input class="file-input" name="myfile" size="1" type="file" onchange="document.getElementById('fileName').value=this.value;" />

Собираем всё вместе:

Стили:

Code (CSS)
/* ResetStyle */
*{margin:0;padding:0;border:none;outline:0;}
html,body{height:100%;font:11px/1 Verdana,sans-serif;}
input{border:1px solid #D7D7D7;}
#exContent{width:80%;margin:0 auto;padding-top:50px;text-align:left;}
/* StartStyle */
.file-input-box,.file-input-box input{overflow:hidden;}
.file-input-box{position:relative;width:300px;height:24px;background:url(/_example/_test/fileinput/fileinputbutton.png)no-repeat right top;cursor:pointer;}
.file-input-text{float:left;height:20px;line-height:20px;width:215px;}
.file-input{position:absolute;right:0px;top:0px;width:81px;height:22px;font-size:99px;opacity:0;filter:alpha(opacity=0);cursor:pointer;}
/* EndStyle */

HTML-код:

Code (HTML)
<form action="" method="get">
<div class="file-input-box">
<input id="fileName" class="file-input-text" readonly="readonly" />
<input class="file-input" name="myfile" size="1" type="file" onchange="document.getElementById('fileName').value=this.value;" />
</div>
</form>


Вся страница, на всякий ヅ:

Code (HTML)
<!DOCTYPEhtml PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Cтилизация файл-инпутов (тип file)</title>
<style type="text/css">
/* ResetStyle */
*{margin:0;padding:0;border:none;outline:0;}
html,body{height:100%;font:11px/1 Verdana,sans-serif;}
input{border:1px solid #D7D7D7;}
#exContent{width:80%;margin:0 auto;padding-top:50px;text-align:left;}
/* StartStyle */
.file-input-box,.file-input-box input{overflow:hidden;}
.file-input-box{position:relative;width:300px;height:24px;background:url(/_example/_test/fileinput/fileinputbutton.png)no-repeat right top;cursor:pointer;}
.file-input-text{float:left;height:20px;line-height:20px;width:215px;}
.file-input{position:absolute;right:0px;top:0px;width:81px;height:22px;font-size:99px;opacity:0;filter:alpha(opacity=0);cursor:pointer;}
/* EndStyle */
</style>
</head>
<body>
<div id="exContent">
<form action="" method="get">
<div class="file-input-box">
<input id="fileName" class="file-input-text" readonly="readonly" />
<input class="file-input" name="myfile" size="1" type="file" onchange="document.getElementById('fileName').value=this.value;" />
</div>
</form>
</div>
</body>
</html>

Результат:


 Живой пример cтилизации файл-инпута ...

Проверено: Мозилла v3.6, v4.1, Opera v11, Safari 4.0, Хром v11, ИЕ v7, v8, v6.

Для ИЕ v6 нужно дописать вот такой фильтр:

Code (CSS)
* html .file-input{filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);}

Скриншот:


 Архив с примером и сопутствующими файлами ...    12.11 Kb


Автор: Likbezz aka Flesh



Источник: Cтилизация файл-инпутов,тип file,type=file,оформление инпутов,CSS,HTML,JavaScript,простой способ, пример,инструкция
Категория: CSS | Добавил: likbezz (18.05.2011)
Просмотров: 26273 | Комментарии: 3 | Теги: CSS, type=file, JavaScrip, HTML, Cтилизация файл-инпутов, оформление инпутов, тип file
Всего комментариев: 3
0  
2  Дмитрий [Материал[06.12.2011]

Спасибо. Решение хорошее.
Но возникает проблема, когда пользователь перемещается по элементам формы с помощью табуляции. Текстовый инпут исчезает, кнопка активной не становится и пользователю, чтобы выбрать файл, приходится пользоваться мышью.

0  
3  likbezz [Материал[09.12.2011]

Quote (Дмитрий)
Но возникает проблема, когда пользователь перемещается по элементам формы с помощью табуляции. Текстовый инпут исчезает, кнопка активной не становится

Да, есть такой “косяк”... Интересненько, как исправить ...

0  
1  Александр [Материал[26.05.2011]

Спасибо, хорошее решение

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]