Главная Верстка Стилизация input file

Верстка


Стилизация input file

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

Пример опубликованный здесь демонстрирует как вариант один из решений, который позволяет стилизовать поле выбора файла. Делается это таким образом, в форме мы размещаем input file, а вместе с ним добавляем label. Input file мы скрываем, а вместо него делаем из label стилизованную кнопку (благо есть такая возможность). После чего, немного магии на javascript, и наш label будет уметь открывать форму выбора файла при клике. Далее по порядку.

Поля для стилизации input file:

<input type="file" name="file" id="file" class="inputfile" />

<label for="file">Выберите файлlabel>

Теперь, нам предстоит скрыть input file, чтобы в поле зрения оставался только label, который мы и будем стилизовать.

Скрываем input file:


.inputfile {

    width: 0.1px;

    height: 0.1px;

    opacity: 0;

    overflow: hidden;

    position: absolute;

    z-index: -1;

}

После этого, как на странице остался только label, приступаем к его стилизации.

Стилизуем label:

.inputfile + label {    
    font-size: 1.25em;    
    font-weight: 700;    
    color: white;
    background-color: black;
    display: inline-block;
}
.inputfile:focus + label,.inputfile + label:hover {
    background-color: red;
}

Есть моменты, которые следовало бы отметить, что мы и сделаем. По умолчанию элемент label не кликабельный, а это значит, что курсор у него будет в виде стандартного указателя «стрелочки». Чтобы обозначить курсор кликабельным, добавляем так же параметр cursor со значением pointer.

.inputfile + label {

    cursor: pointer;

}

Так же элемент label не выделяется клавиатурой tab, что привычно для обычных полей ввода на форме. Сделаем так, чтобы его можно было выделять посредством клавиатуры, таким же образом, как это можно сделать для стандартных полей ввода.

.inputfile:focus + label {

    outline: 1px dotted #000;

    outline: -webkit-focus-ring-color auto 5px;

}

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

Подготовим скрытое поле, для работы с ним:


<input type="file" name="file" id="file" class="inputfile" data-multiple-caption="{count} files selected" multiple />

Код Javascript:

var inputs = document.querySelectorAll( '.inputfile' );
Array.prototype.forEach.call( inputs, function( input ){
    var label    = input.nextElementSibling,
        labelVal = label.innerHTML;
    input.addEventListener( 'change', function( e )    {
        var fileName = '';
        if( this.files && this.files.length > 1 )
            fileName = ( this.getAttribute( 'data-multiple-caption' ) || '' ).replace( '{count}', this.files.length );
        else
            fileName = e.target.value.split( '\\' ).pop();
        if( fileName )
            label.querySelector( 'span' ).innerHTML = fileName;
        else
            label.innerHTML = labelVal;
    });
});

Что делать, если javasvript отключен в браузере?
Редко, но случается, что в браузере может быть выключен код javascript, что делать в этом случае? Ничего не остается, кроме того, чтобы вернуть видимость скрытому полю выбора файла.

<html class="no-js">

    <head>

        <script>(function(e,t,n){var r=e.querySelectorAll("html")[0];r.className=r.className.replace(/(^|\s)no-js(\s|$)/,"$1js$2")})(document,window,0);script>

    head>

html>

Дополнительный код в CSS:

.js .inputfile {

    width: 0.1px;

    height: 0.1px;

    opacity: 0;

    overflow: hidden;

    position: absolute;

    z-index: -1;

}



.no-js .inputfile + label {

    display: none;

}

 


Вы можете помочь развитию сайта отправив любую сумму

Комментарии

  1. Антон
    09.06.2018 в 06:44

    Можно сделать, чтобы отображалась миниатюрка файла?

    • Сергей
      12.06.2018 в 05:48

      В следующем посте как раз об этом.

Написать комментарий