clear:both;

Всё о xHTML, CSS и JavaScript

CSS стили для тэга <input type="file">

Комментариев: 2

Вызов такси

Тег input type="file" наверное сложнее всего видоизменять. В основном это связано с тем, что из-за ограничений безопасности браузеры не позволяют их сильно видоизменять.

Конечно же есть несколько способов, но для каждого браузера он свой, и все эти способы практически не документированы. И самое сложное заключается в нахождении способа, который будет работать для всех браузеров.

Если вы поищите в интернете, то вы найдете множество статей о том, как можно это сделать. Но большинство из них вовсю используют jQuery, CSS и JavaScript.

Я нашел способ, который позволяет решить эту проблему достаточно просто. Итак, всего 4 шага.

Шаг первый. Создаем textbox и input type="file".

Начинаем с textbox и div'а с input type="file" внутри. Div должен быть размером с кнопку "Выбрать...", которую вы будете использовать.

Единственный трюк здесь в том, что свойство overflow в css-классе div'а должно иметь значение hidden. После чего всё содержимое div'а, которое выходит за его рамки, будет скрыто (см. скриншот).

html:

<input id="fileName" class="file_input_textbox" readonly />

<div class="file_input_div">
    <input type="file" />
</div>

CSS

.file_input_textbox
{
float: left
}

.file_input_div
{
    position: relative; 
    width: 100px; 
    height: 23px; 
    overflow: hidden;
}

Скриншот

CSS стили для тэга input type=file

Второй шаг. Веселая часть: чрезмерное увеличение input type="file".

Теперь нам надо, чтобы кнопка, которая является input type="file", занимала весь div. Выравнивания по правому краю будет достаточно, потому что разные браузеры отображают кнопку по-разному.

Итак, мы подходим к самому главному трюку — чрезмерному увеличению кнопки. Достаточно просто указать шрифт абсурдного размера. Например, 30px.

html:

<input id="fileName" class="file_input_textbox" readonly />

<div class="file_input_div">
    <input type="file" class="file_input_hidden" />
</div>

CSS

.file_input_hidden
{
    font-size: 23px; 
    position: absolute; 
    right: 0px; 
    top: 0px; 
    opacity: 0; 
}

Скриншот

CSS стили для тэга input type=file

Шаг третий. Делаем input type="file" невидимым и кладем под него нашу кнопку.

Если мы сделаем кнопку тэга input type="file" невидимой, то это совсем не будет значить, что мы не сможем её нажать. Так что, как уже говорилось, делаем ее невидимой и кладем под неё нашу кнопку.

Теперь мы видим нашу кнопку, но когда мы нажимаем на неё, то на самом деле мы нажимаем на невидимую кнопку input type="file" (ту, что чрезмерно увеличена и со стилем overflow, помните?)

Мы можем стилизовать нашу кнопку как угодно, для этого нужно изменить css-класс "file_input_button".

html:

<input type="text" id="fileName" class="file_input_textbox" readonly="readonly">

<div class="file_input_div">
    <input type="button" value="Search files" class="file_input_button" />
    <input type="file" class="file_input_hidden" />
</div>

CSS

.file_input_button
{
    width: 100px; 
    position: absolute; 
    top: 0px;
    background-color: #33BB00;
    color: #FFFFFF;
    border-style: solid;
}

.file_input_hidden
{
    font-size: 45px; 
    position: absolute; 
    right: 0px; 
    top: 0px; 
    opacity: 0; 

    filter: alpha(opacity=0); 
    -ms-filter: "alpha(opacity=0)"; 
    -khtml-opacity: 0; 
    -moz-opacity: 0;
}

Скриншот

CSS стили для тэга input type=file

Четвертый шаг. Заполняем textbox именем выбранного файла.

Если вы выполнили все шаги этого учебника, вы наверное заметили, что если выбрать файл, то в textbox'е ничего не будет. Всё это происходит потому, что название файла пишется в спрятанный input type="file".

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

html:

<input type="text" id="fileName" class="file_input_textbox" readonly="readonly">

<div class="file_input_div">
    <input type="button" value="Search files" class="file_input_button" />
    <input type="file" class="file_input_hidden" onchange="javascript: document.getElementById('fileName').value = this.value"/>
</div>

Вуаля! Всё работает! Я протестировал это решение в Firefox 3, IE6, IE7, IE8, Opera 10 и Chrome 3. Везде оно работает отлично.

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

Итак, весь исходный код этой статьи:

//css
.file_input_textbox
{
     float: left
}

.file_input_div
{
    position: relative; 
    width: 100px; 
    height: 23px; 
    overflow: hidden;
}

.file_input_button
{
    width: 100px; 
    position: absolute; 
    top: 0px;
    background-color: #33BB00;
    color: #FFFFFF;
    border-style: solid;
}

.file_input_hidden
{
    font-size: 45px; 
    position: absolute; 
    right: 0px; 
    top: 0px; 
    opacity: 0; 

    filter: alpha(opacity=0); 
    -ms-filter: "alpha(opacity=0)"; 
    -khtml-opacity: 0; 
    -moz-opacity: 0;
 }

 //html
 <input type="text" id="fileName" class="file_input_textbox" readonly="readonly">

 <div class="file_input_div">
      <input type="button" value="Search files" class="file_input_button" />
      <input type="file" class="file_input_hidden" onchange="javascript: document.getElementById('fileName').value = this.value" />
 </div>

Всё. Надеюсь это поможет вам в ваших проектах!

Источник

Перевод Яша Плюшев

20 февраля 2011 19:41

Из разделов: HTML , CSS


Комментариев: 2

  1. нужно проверить :)

    gravatar

    Petrorachprax

    28 сентября 2011 в 15:29

  2. А почему скрин самой кнопки не выложили?

    gravatar

    anele

    23 ноября 2011 в 00:18

Оставьте комментарий