Как стать автором
Обновить

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

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

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

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

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

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

Пример можно посмотреть на этой страницу — 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;

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

Осталось проверить этот способ на мобильниках — у кого есть iPhone — можно скрин-шот в студию?
Теги:
Хабы:
Всего голосов 60: ↑40 и ↓20+20
Комментарии57

Публикации

Истории

Ближайшие события