Эти ответы хороши, и все они работают для очень конкретных случаев использования. То есть они самоуверенные.
Итак, вот ответ, который ничего не предполагает, но будет работать независимо от того, как вы его измените. Вы можете изменить дизайн с помощью css, добавить javascript, чтобы, возможно, отображать имя файла при изменении, и т. Д., Это все равно всегда будет работать.
Код:
Вот ядро css
.file-input{
pointer-events: none;
position: relative;
overflow: hidden;
}
.file-input > * {
pointer-events: none;
}
.file-input > input[type="file"]{
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
opacity: 0;
pointer-events: all;
cursor: pointer;
height: 100%;
width: 100%;
}
и основной html:
<div class="file-input">
<input type="file"/>
</div>
Как видите, мы заставляем любое событие указателя (щелчок), которое происходит с элементом .file-input или любым из его дочерних элементов, проксировать на вход файла. Это связано с тем, что входной файл расположен абсолютно и всегда будет использовать ширину / высоту контейнера. Поэтому вы можете настроить в соответствии с вашими потребностями. вставьте оболочку в кнопку, используйте js, чтобы отобразить имя файла при выборе, и т. д. ничто не сломается до тех пор, пока вышеуказанный основной код останется без изменений.
Как вы увидите в демонстрации, я добавил span
с текстом «Выбрать файл» и класс с дополнительными стилями для стиля .file-input
div. Это должно стать канонической отправной точкой для всех, кто собирается создать пользовательский элемент для загрузки файлов.
Демо-версия: JSFIDDLE