Блог Дмитрия Волотко - Это нормально © Подпишись на обновления!

Кастомизация input type=”file” с помощью CSS

Есть несколько способов кастомизации (изменения внешнего вида) инпутов такого типа. Все они обладают своими плюсами и минусами, но, на мой взгляд, предложенный мною вариант, выигрывает даже со своими минусами, коих всего один.

Кастомизация input type=file с помощью CSS

Эти самые альтернативные способы – это подмена через JavaScript, это flash загрузчик, ну или href=mailto =)

Плюсы и минусы каждого из них, я думаю, вполне очевидны и понятны. Наиболее распространён вариант с flash загрузчиком, на JavaScript’е извращаются много реже. Стилями же это делают, по моим наблюдениям, вообще единицы.

У варианта со стилями есть один большой (а для всех ли сайтов и вариантов размещения такого инпута большой ли?!) минус, на который я время от времени благополучно не обращаю внимание – это невозможность посмотреть имя файла, указанного в этом инпуте, и, как следствие, невозможность вставить адрес файла copy-paste, что порою очень удобно.

Ладно, хватит разговоров – приступим. Сразу отмечу, что размеры надо будет проверять в каждом отдельном случае, иначе в IE могут быть неприятные моменты.

Пример можно посмотреть на этой страницу – http://absolvo.ru/tmp/17/

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”>
<html xmlns=“http://www.w3.org/1999/xhtml”>
<head>
<style>
div {
overflow:hidden;
width:95px;
height:37px;
cursor:pointer;
background:url(input-file.gif) no-repeat;
}
input {
opacity:0;
filter:alpha(opacity:0);
font-size:199px;
cursor:pointer;
padding:0px;
margin:0px;
border:none;
margin-left:-450px;
}
</style>
</head>
<body>
<div title=“Нажмите на меня, для обзора файла”>
<input type=“file” size=“1″ />
</div>
</body>
</html>

Что делает данный код? Объясню по шагам:

      1. Создаём слой, указываем ему необходимый размер;
      2. Готовим картинку, кладём её фоном к слою;
      3. Указываем большой размер шрифта у input, к примеру 199px;
      4. Указываем input’у отрицательный margin
      5. Выводим прозрачность на ноль;
      6. Оформляем всё это красивыми title;

Кстати, мой коллега тут мозг почесал, и придумал аналогичный изврат, но немного в другом ракурсе – предлагаю ознакомиться на страничке его блога. Может у вас есть мысль, как можно оптимизировать или уменьшить код? Если есть – смело делитесь! :)

Осталось проверить этот способ на мобильниках – у кого есть iPhone – можно скрин-шот в студию?

По поводу подарков участникам конкурса, который я запустил на юбилей моего блога – победители определены, и как только мне привезут две бутылки 18ти-летнего молдавского вина – я сразу анонсирую это :) Извините за задержку.

Так же можно почитать:

# 10 April 2009 в 22:56

dofollow

У коллеги более наглядная иконка, в плане бюзабилити :)

# 10 April 2009 в 23:01

Волотко Дмитрий

@dofollow, это он считерил, уже потом, когда у него было время :)

# 11 April 2009 в 10:58

aedus

Конечно, я не ханжа и понимаю, что речь идет о профессиональных терминах, но “кастомизация инпутов” как-то звучит помесью французского с нижегородским :)
Впрочем, то общая тенденция “нэйминга с клоакингом”…

# 11 April 2009 в 15:09

Волотко Дмитрий

@aedus, как бы ты назвал?

# 12 April 2009 в 14:10

art

отлично. и главное просто. казалось бы любой мог придумать. я бы может и придумал, но пока ниразу дизайнер не озадачивал нестандартным input type=”file”

# 21 April 2009 в 12:17

aedus

стиль/внешний вид и проч. для input – так понятнее :) и не транслитно (имх)

# 21 April 2009 в 13:31

Волотко Дмитрий

@aedus, возможно ты и прав :)

# 25 April 2009 в 23:54

SCORPION

Блин, в начаьную школу разработчиков скрипта этого блога…
Код примера не могу поместить… >:(

<form>
<div id=”fld1″>
<input id=”HIDEN_FILE_NAME” type=”file” size=10 title=”zzzzzzzzzzzzzz” onchange=”document.getElementById(‘FILE_NAME’).value = document.getElementById(‘HIDEN_FILE_NAME’).value;”>
</div>
<input type=”text” id=”FILE_NAME” />
</form>

# 26 April 2009 в 21:41

Волотко Дмитрий

@SCORPION, да, спасибо – это офигенная добавка. Намного более юзабельней становиться. Надо будет на кроссбраузерность проверить.

# 3 May 2009 в 15:16

nikname

@SCORPION, я полностью с тобой согласен

# 6 May 2009 в 14:10

Влад

Народ кто чем css юзает? Просто интересно, что лучше?

# 19 May 2009 в 8:49

Gorgik

Перекинул сейчас этот код себе в движок – работает! Жаль, что только изучаю программирование – половина исходника вообще не понимаю что к чему…

# 23 May 2009 в 16:17

Аббат_Кальне

впринципе в CSS не очень разбираюсь, но вроде статья легкая для чтения, в будущем пригодится для заливания файлов на сайт

# 24 May 2009 в 0:46

дядя Фридрих

Лихо! Вроде просто все написано, а сам не додумался бы ни в жизнь такую прикольную штуку сотворить! Максимум на что сподобился мой умишко так это сделать кнопку отправки из формы в виде картинки. Код беру на заметку!

# 27 May 2009 в 2:53

kontenta

Кстати последнее время наблюдается некоторое веяние в кастомизации многих деталей. Например, тот же Бегун поощряет экспериментаторов, придающий новый вид контекстным объявлениям)

# 28 May 2009 в 13:40

Волька

Тэг <input type=”file”> не закрыт, если учесть что <input type=”text” /> закрыт.

# 28 May 2009 в 13:41

Волька

Это SCORPION-у.

# 2 June 2009 в 2:58

Кодер

Так и быть, убедил)) Кстати, на яве “извращался”, как ни крути – подходящее слово…

# 2 June 2009 в 14:20

Александр

Ох… помню как верстальщики издевались, чтобы оно работало.
В принципе они так и сделали, как тут написано, главная проблема — это у вас есть рисунок этого инпут-файл со своей “красивой” кнопкой. И если она не таких же размеров как кнопка в стандартном инпут-файл, то будет проблематично сопоставить эту видимую “красивую” и невидимую настоящую кнопки, так, чтобы оно работало хорошо (возможно по краям клики не будут работать)

# 27 July 2009 в 6:40

Хентай

2 Александр.
Если “красивую” кнопку под настоящую нормально не подогнать, то клики по краям не возможно, а совершенно точно работать не будут.

# 4 October 2009 в 18:01

Nazar

А как это выглядит? Можно скриншот сделать?

# 5 January 2010 в 12:23

Сатовед

Примеров сильно не хватает.

# 2 February 2010 в 20:46

Nikita

отошлите скриншоты хоть на мыло
bsd_nikitСОБАЧКАmail.ru

# 11 March 2010 в 16:32

Топас

Чета реально пример бы добавили.. что получится?

# 12 March 2010 в 18:23

Владимир

Интересно – надо попробовать.

# 26 March 2010 в 1:31

Сайтопедия

Мне понравилось. Вроде мелочь – а юзеров можно впечатлить до глубины души. Где б только время найти все эти прибамбасы применять!

# 29 March 2010 в 23:44

Олег

Мне тоже понравилось, удобная штука.

# 10 April 2010 в 19:08

DjNON

да, полезный атрибут, надо вообще хорошо каскадные таблицы поучить, что-то я не особо их знаю

# 19 April 2010 в 21:38

Воля

CSS осваиваю уже месяцев шесть и за это время много вопросов возникало ответы на которые нахожу на авторских блогах типа вашего. Верстаю CSS шаблоны в ДримВивере

# 22 May 2010 в 12:46

Олька

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

# 7 Augu 2010 в 21:22

Petrov

Хорошая идея. Сам бы не додумался.

# 16 January 2011 в 6:08

Sunlight

Только что запустил на iPad (кто не знает iPad=большой iPhone). Выглядит также как с компа, только не кликается :)

Правда, обычный input type=file на iPad выглядит СЕРОЙ (т.е. disable) кнопкой “Выбрать файл” без поля ввода. Так что тут дело не в css. Щас рыщу по просторам инета, возможно ли под iPhone/iPad сделать нормальный input type=file (собссно, iOS обычно доступа к файлам не дает, только “Фотографии”, “Музыка” – ну прям как на старых мобилках :)

flash – не катит, iPhone/iPad не поддерживают флеш

# 24 January 2011 в 16:23

Дмитрий Волотко

@Sunlight — iOS не поддерживает аплоад файлов. Не ищите.



* Должны быть заполнены.
Из-за дикого спама, и нежелания ставить капчу оставлять ссылку у комментария вообще нельзя. Точно так же нельзя оставлять ссылки в теле комментария.