Я добавлю свой собственный ответ, чтобы сделать это так, как я сделал ... но вот пример, основанный на начальной загрузке, который может помочь .. geniuscarrier.com/…
Вишну Наранг
Ответы:
235
Обработка файловых вводов общеизвестно сложна, так как большинство браузеров не изменят внешний вид ни CSS, ни Javascript.
Даже размер ввода не будет реагировать на подобные:
<inputtype="file"style="width:200px">
Вместо этого вам нужно будет использовать атрибут размера:
<inputtype="file"size="60"/>
Для любого более сложного стиля (например, изменение внешнего вида кнопки обзора) вам необходимо рассмотреть хитрый подход к наложению стилизованной кнопки и поля ввода поверх ввода исходного файла. Статья, уже упомянутая rm на www.quirksmode.org/dom/inputfile.html, является лучшей, которую я видел.
ОБНОВИТЬ
Несмотря на то, что сложно <input>напрямую оформить тег, это легко сделать с помощью <label>тега. Смотрите ответ ниже от @JoshCrozier: https://stackoverflow.com/a/25825731/10128619
@TLK Ответ Райана не будет работать в IE при попытке загрузки iframe. Это дает вам ошибку «Отказано в доступе». Для обычных загрузок я согласен, что это самый простой способ!
морозное чудо
3
Гораздо более простое решение , чем QuirksMode объяснил здесь . Просто разместите эту ссылку здесь, так как этот ответ в любом случае является ответом только на ссылку.
Joeytje50
10
Для тех, кто интересуется современным подходом, я бы посоветовал взглянуть на этот ответ . Он не требует JavaScript, как и некоторые другие ответы.
Джош Крозье
3
@JoshCrozier опубликовал безумно лучшее решение. Даже превосходит фальшивые мышиные решения :)
Lodewijk
1022
Вам не нужен JavaScript для этого! Вот кросс-браузерное решение:
Наилучшим подходом было бы иметь пользовательский элемент метки с forатрибутом, прикрепленным к скрытому элементу ввода файла. ( forАтрибут метки должен соответствовать элементу файла, idчтобы это работало).
1 - Стоит отметить, что если вы скрываете элемент с помощью display: none, он не будет работать в IE8 и ниже. Также следует учитывать тот факт, что jQuery validate не проверяет скрытые поля по умолчанию. Если любая из этих вещей является проблемой для вас, вот два разных способа скрыть ввод ( 1 , 2 ), который работает в этих обстоятельствах.
У меня действительно есть вопрос с этим, хотя, при выборе файла, как бы мы поступили, затем отобразив имя файла?
Ричлвис
17
Как отобразить имя выбранного файла, если display: noneзадано значение input[type=file]?
Сартак Сингхал
38
Отличное решение, но на самом деле вам нужен JavaScript. Если вы хотите отобразить имя файла, как просили другие люди, вам нужно добавить интервал между меткой и скрытым вводом: <span id = "file-selected"> </ span>. Затем обновите диапазон для события изменения: $ ('# file-upload'). Bind ('change', function () {var fileName = ''; fileName = $ (this) .val (); $ ('#) file-selected '). html (fileName);})
Сэм
9
Вы должны использовать position: absolute; left: -99999remвместо того, чтобы display: noneпо причинам доступности. Чаще всего программы чтения с экрана не читают элементы, если они скрыты с использованием display: noneметода.
Капсула
10
Я очень удивлен, обнаружив, что никто, похоже, не задумывался о доступности клавиатуры. labelэлементы не доступны buttonс клавиатуры, в отличие от s и inputs. Добавление tabindexне является решением, потому что оно labelвсе равно не будет действовать, когда оно имеет фокус и пользователь нажимает ввод. Я решил эту проблему, визуально скрыв ввод, чтобы его можно было сфокусировать, а затем применил:focus-within к labelродителю: jsbin.com/fokexoc/2/edit?html,css,output
Оливер Джозеф Эш,
195
следуйте этим шагам, чтобы создать собственные стили для формы загрузки файлов:
это простая форма HTML (пожалуйста, прочитайте комментарии HTML, которые я написал здесь ниже)
<formaction="#type your action here"method="POST"enctype="multipart/form-data"><divid="yourBtn"style="height:50px;width:100px;border:1px dashed #BBB;cursor:pointer;"onclick="getFile()">Click to upload!</div><!-- this is your file input tag, so i hide it!--><divstyle='height:0px;width:0px;overflow:hidden;'><inputid="upfile"type="file"value="upload"/></div><!-- here you can have file submit button or you can write a simple script to upload the file automatically--><inputtype="submit"value='submit'></form>
затем используйте этот простой скрипт для передачи события click в тег ввода файла.
function getFile(){
document.getElementById("upfile").click();}
Теперь вы можете использовать любой тип стилей, не беспокоясь о том, как изменить стили по умолчанию.
Я знаю это очень хорошо, потому что я пытался изменить стили по умолчанию в течение полутора месяцев. поверьте мне, это очень сложно, потому что разные браузеры имеют разные теги ввода загрузки. Так что используйте этот для создания ваших пользовательских форм загрузки файлов. Вот полный код автоматической загрузки.
<formaction="#type your action here"method="POST"enctype="multipart/form-data"name="myForm"><divid="yourBtn"onclick="getFile()">click to upload a file</div><!-- this is your file input tag, so i hide it!--><!-- i used the onchange event to fire the form submission--><divstyle='height:0px;width:0px;overflow:hidden;'><inputid="upfile"type="file"value="upload"onchange="sub(this)"/></div><!-- here you can have file submit button or you can write a simple script to upload the file automatically--><!-- <input type="submit" value='submit' > --></form>
@ user1053263 -> Спасибо за рекомендацию .. здесь я использовал очень простой java-скрипт, не нужно использовать фреймворки, такие как Jquery или PrototypeJS.
teshguru
7
У меня проблемы с отправкой формы в IE9. Я получаю сообщение об ошибке «Доступ запрещен», который пытается отправить форму через JavaScript. Если я нажимаю кнопку отправки через интерфейс, это работает. Есть ли обходной путь для этого?
Кевин
1
@kevin -> Пожалуйста, попробуйте event.preventDefault () после document.myForm.submit (), я внес изменения в приведенный выше код.
Тешгуру
1
Хорошо работает в Chrome, Firefox, Safari & Opera - но не в IE9. В IE9 я получаю ту же ошибку «Доступ запрещен», что и @Kevin - и иногда просто тихий сбой без ошибок.
daveywc
10
В IE10 (и, возможно, IE9 и т. Д.) Вы получите «Доступ запрещен» (или нет ответа от jQuery), если вы попытаетесь автоматически отправить форму после нажатия кнопки ввода файла через javascript. Таким образом, этот метод работает для стилизации кнопки ввода файла, пока пользователь все еще отправляет форму. Мне потребовалось время, чтобы найти это, и я вижу, что другие тоже имеют такую же проблему. См. Это для получения дополнительной информации stackoverflow.com/a/4335390/21579 .
Джефф Видмер
76
Скройте его с помощью css и используйте пользовательскую кнопку с $ (селектор) .click (), чтобы активировать кнопку обзора. затем установите интервал для проверки значения типа ввода файла. интервал может отображать значение для пользователя, чтобы пользователь мог видеть, что загружается. интервал будет очищаться при отправке формы [ПРАВИТЬ] Извините, я был очень занят, намеревался обновить этот пост, вот пример
<formaction="uploadScript.php"method="post"enctype="multipart/form-data"><div><!-- filename to display to the user --><pid="file-name"class="margin-10 bold-10"></p><!-- Hide this from the users view with css display:none; --><inputclass="display-none"id="file-type"type="file"size="4"name="file"/><!-- Style this button with type image or css whatever you wish --><inputid="browse-click"type="button"class="button"value="Browse for files"/><!-- submit button --><inputtype="submit"class="button"value="Change"/></div>
$(window).load(function(){var intervalFunc =function(){
$('#file-name').html($('#file-type').val());};
$('#browse-click').on('click',function(){// use .live() for older versions of jQuery
$('#file-type').click();
setInterval(intervalFunc,1);returnfalse;});});
Просто любопытно, работает ли он в каждом браузере нового поколения, таком как Firefox, IE, Opera, Safari, Chrome и т. Д.?
Wh1T3h4Ck5
Это самое простое решение для меня! По крайней мере, в IE 9, Chrome 23 и FF 16 с jQuery 1.7.2, поэтому с обновленными версиями он должен работать.
Дани Бишоп
Кто-нибудь знает, как изменить .new_Btn, если пользователь выбрал изображение. Теперь это просто показывает тот же класс. Кто-нибудь знает, как это отследить? Спасибо
Андо
2
@MehdiKaramosly это работает даже в IE 6 - но это верно только для jQuery 1.x , jQuery 2.x + не поддерживает старые IE
jave.web
1
@Ando via Javascript / jQuery => значение входного файла пустое или содержит локальный путь к файлу => использовать событие onchange и проверить на val () :) см. Jsfiddle.net/ZrBPF
jave.web
55
Все движки рендеринга автоматически генерируют кнопку при <input type="file">создании. Исторически эта кнопка была совершенно непригодна для стиля. Тем не менее, Trident и WebKit добавили хуки через псевдоэлементы.
Трезубец
Начиная с IE10, кнопка ввода файла может быть стилизована с использованием ::-ms-browseпсевдоэлемента. По сути, любые правила CSS, которые вы применяете к обычной кнопке, могут быть применены к псевдоэлементу. Например:
Это отображается следующим образом в IE10 в Windows 8:
WebKit
WebKit предоставляет хук для своей кнопки ввода файла с ::-webkit-file-upload-buttonпсевдоэлементом. Опять же, почти любое правило CSS может быть применено, поэтому пример Trident будет работать и здесь:
Стилизируя ввод файла, вы не должны нарушать любые нативные взаимодействия, которые обеспечивает ввод .
display: noneПодход разрушает нативную поддержку перетаскивания.
Чтобы ничего не нарушать, вы должны использовать opacity: 0подход для ввода и расположить его, используя относительный / абсолютный шаблон в оболочке.
Используя эту технику, вы можете легко стилизовать зону щелчка / отбрасывания для пользователя и добавить собственный класс в javascript для dragenterсобытия, чтобы обновить стили и дать пользователю обратную связь, чтобы он мог видеть, что он может удалить файл.
HTML:
<labelfor="test"><div>Click or drop something here</div><inputtype="file"id="test"></label>
спасибо за пост, как это работает, если добавлен атрибут множественного = "несколько", я перетащил 2 изображения, но видел путь только для 1-го
PirateApp
Вы пропустили код здесь. На скрипке больше. Какая библиотека?
Ctrl-Alt-Delor
На скрипке есть только какой-то javascript с jQuery, чтобы показать файлы, которые были отброшены. Вот и все
кевча
Внедрив это решение и протестировав его, оно, похоже, не работает и в Edge.
ChrisA
1
Ах, хорошо, я пропустил упаковщик с положением родственника в вашем ответе - Мой плохой. Если ввод ниже размеров экрана, браузер пытается прокрутить до него и при этом перемещает контейнер прокрутки вверх по странице. Вот демонстрация: stackblitz.com/edit/input-file-overflow?file=style.css (просто не совсем демонстрирует, как абсолютное положение является причиной поведения)
Том
23
Я могу сделать это с помощью чистого CSS с использованием приведенного ниже кода. Я использовал bootstrap и font-awesome.
Вот решение, которое на самом деле не стилизует <input type="file" />элемент, а вместо этого использует <input type="file" />элемент поверх других элементов (которые можно стилизовать). <input type="file" />Элемент не очень видно , следовательно, общая иллюзия имеет красиво стилизованное управление загрузкой файлов.
Недавно я столкнулся с этой проблемой, и, несмотря на множество ответов о переполнении стека, ни один из них, похоже, не отвечал всем требованиям. В итоге я настроил это так, чтобы получить простое и элегантное решение.
Я также проверил это на Firefox, IE (11, 10 и 9), Chrome и Opera, iPad и некоторых устройствах Android.
$('input[type=file]').change(function(e){
$in = $(this);
$in.next().html($in.val());});
$('.uploadButton').click(function(){var fileName = $("#fileUpload").val();if(fileName){
alert(fileName +" can be uploaded.");}else{
alert("Please select a file to upload");}});
Не забудьте установить стили для ввода, когда вы будете готовы: opacity: 0
вы не можете установить, display: noneпотому что он должен быть кликабельным. Но вы можете расположить его под «новой» кнопкой или заправить под что-то еще с помощью z-index, если хотите.
Установите некоторые jquery, чтобы щелкнуть по реальному вводу, когда вы щелкнете по изображению.
это не удастся с FF11 - причина: поскольку вы не можете точно влиять на размер поля ввода (только с помощью размера HTML) и кнопки (вы можете установить высоту с помощью CSS), если видимое поле ввода больше, чем нам предоставляет исходный FF, вы остаются с очень большой слепой зоной - точка зрения пользователя: в большинстве случаев он будет жаловаться, что загрузка не работает при нажатии
Jeffz
2
Хорошая идея, но это не будет работать на IE. $ ('# the_real_file_input'). click () вызовет открытое диалоговое окно, но файл не будет выбран в форме и загрузка не удастся.
Томас
11
Поместите кнопку загрузки файла поверх красивой кнопки или элемента и скройте ее.
style="visibility:hidden"слишком долго, просто используйте hidden. Кроме того, click()он работает для любых браузеров, и на данный момент нет очень надежной причины безопасности, и на любых устройствах это законный способ и @Gianluca для классического использования jQuerytrigger()
Thielicious
1
Это именно то решение, которое я собирался добавить к этому! Это работает, и вы можете отобразить его именно так, как вы хотите. Работает с Chrome, попробую другие.
markthewizard1234
7
я могу думать только о том, чтобы найти кнопку с javascript после ее рендеринга и назначить ей стиль
Я бы обычно использовал простой javascript для настройки тега ввода файла. Скрытое поле ввода, по нажатию кнопки, вызов javascript скрытого поля, простое решение без использования css или связок jquery.
Вы не можете использовать click()метод для запуска события для файла ввода типа. большая часть браузера не позволяет по соображениям безопасности.
Махи
6
Здесь мы используем диапазон для запуска ввода файла типа и просто настраиваем этот диапазон , поэтому мы можем добавить любой стиль, используя этот способ.
Запись что мы используем входной тег с параметром visibility: hidden и запускаем его в диапазоне.
Не дайте себя одурачить «великолепными» решениями только для CSS, которые на самом деле очень специфичны для браузера, или которые накладываются на стилизованную кнопку поверх реальной кнопки, или которые заставляют вас использовать <label>вместо <button>или любой другой подобный хак , JavaScript необходим, чтобы заставить его работать для общего пользования. Пожалуйста, изучите, как это делают gmail и DropZone, если вы мне не верите.
Просто создайте обычную кнопку по своему усмотрению, затем вызовите простую функцию JS, чтобы создать и связать скрытый элемент ввода с вашей стилизованной кнопкой.
Обратите внимание, как приведенный выше код пересылает его после каждого выбора пользователем файла. Это важно, потому что «onchange» вызывается, только если пользователь меняет имя файла. Но вы, вероятно, хотите получить файл каждый раз, когда пользователь предоставляет его.
Чтобы быть точным, labelподход работает, за исключением того, что он не может показать выбранное имя файла или путь. Итак, обязательно говоря, это единственная проблема, которую нужно решить JS.
Хасан
4
Многофайловое решение с преобразованным именем файла
Как отображать только имя файла, а не fakepathпуть?
Хасан
3
На этой неделе мне также потребовалось настроить кнопку и отобразить выбранное имя файла в стороне от нее, поэтому после прочтения некоторых из ответов выше (спасибо BTW) я придумал следующую реализацию:
По сути, я работаю с библиотекой ng-file-upload, в угловом плане я привязываю имя файла к своему $ scope и присваиваю ему начальное значение «Файл не выбран», я также привязываю функцию onFileSelect () к моя область видимости, поэтому, когда файл выбран, я получаю имя файла с помощью API ng-upload и присваиваю его $ scope.filename.
Просто смоделируйте щелчок мышью <input>с помощью trigger()функции при нажатии на стиль <div>. Я создал свою собственную кнопку из <div>и затем нажал на кнопку inputпри нажатии моей <div>. Это позволяет вам создать свою кнопку так, как вы хотите, потому что она <div>и имитирует нажатие на ваш файл <input>. Тогда используйте display: noneна своем <input>.
// div styled as my load file button<div id="simClick">Loadfrom backup</div><input type="file" id="readFile"/>// Click function for input
$("#readFile").click(function(){
readFile();});// Simulate click on the input when clicking div
$("#simClick").click(function(){
$("#readFile").trigger("click");});
Наилучшим способом является использование псевдоэлемента: after или: before в качестве элемента, перекрывающего ввод de. Затем стилизуйте этот псевдоэлемент по своему желанию. Я рекомендую вам в качестве общего стиля для всех входных файлов сделать следующее:
Лучший способ, который я нашел, это input type: fileустановить его на display: none. Дайте это id. Создайте кнопку или любой другой элемент, который вы хотите открыть файл ввода.
Затем добавьте прослушиватель событий (кнопка), который при нажатии моделирует щелчок по исходному входному файлу. Как нажатие на кнопку с именем «привет», но она открывает окно файла.
Пример кода
//i am using semantic ui<button class="ui circular icon button purple send-button" id="send-btn"><i class="paper plane icon"></i></button><input type="file" id="file"class="input-file"/>
Javascript
var attachButton=document.querySelector('.attach-button');
attachButton.addEventListener('click', e=>{
$('#file').trigger("click")})
CSS может многое сделать здесь ... с небольшим обманом ...
<divid='wrapper'><inputtype='file'id='browse'></div>
#wrapper {
width: 93px; /*play with this value */
height: 28px; /*play with this value */
background: url('browseBtn.png') 0 0 no-repeat;
border:none;
overflow:hidden;
}
#browse{
margin-left:-145px; /*play with this value */
opacity:0; /* set to .5 or something so you can better position it as an overlay then back to zero again after you're done */
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
}
Я нашел очень простой способ переключить кнопку файла на картинку. Вы просто помечаете картинку и помещаете ее поверх кнопки файла.
<html><divid="File button"><divstyle="position:absolute;"><!--This is your labeled image--><labelfor="fileButton"><imgsrc="ImageURL"></label></div><div><inputtype="file"id="fileButton"/></div></div></html>
При нажатии на помеченное изображение, вы выбираете кнопку файла.
Это скрывает кнопку входного файла, но под капотом нажимает ее от другой обычной кнопки, которую вы, очевидно, можете стилизовать как любую другую кнопку. Это единственное решение без недостатков, кроме бесполезного DOM-узла. Благодаря display:none;, кнопка ввода не резервирует видимое пространство в DOM.
(Я больше не знаю, кому дать реквизит для этого. Но я получил эту идею где-то здесь, на Stackoverflow.)
Ответы:
Обработка файловых вводов общеизвестно сложна, так как большинство браузеров не изменят внешний вид ни CSS, ни Javascript.
Даже размер ввода не будет реагировать на подобные:
Вместо этого вам нужно будет использовать атрибут размера:
Для любого более сложного стиля (например, изменение внешнего вида кнопки обзора) вам необходимо рассмотреть хитрый подход к наложению стилизованной кнопки и поля ввода поверх ввода исходного файла. Статья, уже упомянутая rm на www.quirksmode.org/dom/inputfile.html, является лучшей, которую я видел.
ОБНОВИТЬ
Несмотря на то, что сложно
<input>
напрямую оформить тег, это легко сделать с помощью<label>
тега. Смотрите ответ ниже от @JoshCrozier: https://stackoverflow.com/a/25825731/10128619источник
Вам не нужен JavaScript для этого! Вот кросс-браузерное решение:
Смотрите этот пример! - Работает в Chrome / FF / IE - (IE10 / 9/8/7)
Наилучшим подходом было бы иметь пользовательский элемент метки с
for
атрибутом, прикрепленным к скрытому элементу ввода файла. (for
Атрибут метки должен соответствовать элементу файла,id
чтобы это работало).В качестве альтернативы вы можете просто обернуть элемент ввода файла меткой напрямую: (пример)
С точки зрения стиля, просто скройте 1 элемент ввода, используя селектор атрибута .
Тогда все, что вам нужно сделать, это стилизовать пользовательский
label
элемент. (пример) .1 - Стоит отметить, что если вы скрываете элемент с помощью
display: none
, он не будет работать в IE8 и ниже. Также следует учитывать тот факт, что jQuery validate не проверяет скрытые поля по умолчанию. Если любая из этих вещей является проблемой для вас, вот два разных способа скрыть ввод ( 1 , 2 ), который работает в этих обстоятельствах.источник
display: none
задано значениеinput[type=file]
?position: absolute; left: -99999rem
вместо того, чтобыdisplay: none
по причинам доступности. Чаще всего программы чтения с экрана не читают элементы, если они скрыты с использованиемdisplay: none
метода.label
элементы не доступныbutton
с клавиатуры, в отличие от s иinput
s. Добавлениеtabindex
не является решением, потому что оноlabel
все равно не будет действовать, когда оно имеет фокус и пользователь нажимает ввод. Я решил эту проблему, визуально скрыв ввод, чтобы его можно было сфокусировать, а затем применил:focus-within
кlabel
родителю: jsbin.com/fokexoc/2/edit?html,css,outputследуйте этим шагам, чтобы создать собственные стили для формы загрузки файлов:
это простая форма HTML (пожалуйста, прочитайте комментарии HTML, которые я написал здесь ниже)
затем используйте этот простой скрипт для передачи события click в тег ввода файла.
Теперь вы можете использовать любой тип стилей, не беспокоясь о том, как изменить стили по умолчанию.
Я знаю это очень хорошо, потому что я пытался изменить стили по умолчанию в течение полутора месяцев. поверьте мне, это очень сложно, потому что разные браузеры имеют разные теги ввода загрузки. Так что используйте этот для создания ваших пользовательских форм загрузки файлов. Вот полный код автоматической загрузки.
источник
Скройте его с помощью css и используйте пользовательскую кнопку с $ (селектор) .click (), чтобы активировать кнопку обзора. затем установите интервал для проверки значения типа ввода файла. интервал может отображать значение для пользователя, чтобы пользователь мог видеть, что загружается. интервал будет очищаться при отправке формы [ПРАВИТЬ] Извините, я был очень занят, намеревался обновить этот пост, вот пример
источник
HTML
CSS
JQuery
Скрипка : http://jsfiddle.net/M7BXC/
Вы также можете достичь своих целей без jQuery с обычным JavaScript.
Теперь newBtn связан с html_btn, и вы можете оформить новый btn так, как вам хочется: D
источник
Все движки рендеринга автоматически генерируют кнопку при
<input type="file">
создании. Исторически эта кнопка была совершенно непригодна для стиля. Тем не менее, Trident и WebKit добавили хуки через псевдоэлементы.Трезубец
Начиная с IE10, кнопка ввода файла может быть стилизована с использованием
::-ms-browse
псевдоэлемента. По сути, любые правила CSS, которые вы применяете к обычной кнопке, могут быть применены к псевдоэлементу. Например:Это отображается следующим образом в IE10 в Windows 8:
WebKit
WebKit предоставляет хук для своей кнопки ввода файла с
::-webkit-file-upload-button
псевдоэлементом. Опять же, почти любое правило CSS может быть применено, поэтому пример Trident будет работать и здесь:Это отображается следующим образом в Chrome 26 на OS X:
источник
Если вы используете Bootstrap 3, это работает для меня:
См. Http://www.abeautifulsite.net/whipping-file-inputs-into-shape-with-bootstrap-3/
Который производит следующую кнопку ввода файла:
Серьезно, проверьте http://www.abeautifulsite.net/whipping-file-inputs-into-shape-with-bootstrap-3/
источник
Рабочий пример здесь с собственной поддержкой Drag and drop: https://jsfiddle.net/j40xvkb3/
Стилизируя ввод файла, вы не должны нарушать любые нативные взаимодействия, которые обеспечивает ввод .
display: none
Подход разрушает нативную поддержку перетаскивания.Чтобы ничего не нарушать, вы должны использовать
opacity: 0
подход для ввода и расположить его, используя относительный / абсолютный шаблон в оболочке.Используя эту технику, вы можете легко стилизовать зону щелчка / отбрасывания для пользователя и добавить собственный класс в javascript для
dragenter
события, чтобы обновить стили и дать пользователю обратную связь, чтобы он мог видеть, что он может удалить файл.HTML:
CSS:
Вот рабочий пример (с дополнительным JS для обработки
dragover
событий и удаленных файлов).https://jsfiddle.net/j40xvkb3/
Надеюсь, это помогло!
источник
Я могу сделать это с помощью чистого CSS с использованием приведенного ниже кода. Я использовал bootstrap и font-awesome.
источник
Вы можете обернуть свой ввод type = "file" внутри метки для ввода. Стилизуйте метку так, как вам нравится, и скройте ввод с помощью display: none;
источник
Вот решение, которое на самом деле не стилизует
<input type="file" />
элемент, а вместо этого использует<input type="file" />
элемент поверх других элементов (которые можно стилизовать).<input type="file" />
Элемент не очень видно , следовательно, общая иллюзия имеет красиво стилизованное управление загрузкой файлов.Недавно я столкнулся с этой проблемой, и, несмотря на множество ответов о переполнении стека, ни один из них, похоже, не отвечал всем требованиям. В итоге я настроил это так, чтобы получить простое и элегантное решение.
Я также проверил это на Firefox, IE (11, 10 и 9), Chrome и Opera, iPad и некоторых устройствах Android.
Вот ссылка на JSFiddle -> http://jsfiddle.net/umhva747/
Надеюсь это поможет!!!
источник
Это просто с jquery. Дать пример кода предложения Райана с небольшой модификацией.
Основной HTML:
Не забудьте установить стили для ввода, когда вы будете готовы:
opacity: 0
вы не можете установить,display: none
потому что он должен быть кликабельным. Но вы можете расположить его под «новой» кнопкой или заправить под что-то еще с помощью z-index, если хотите.Установите некоторые jquery, чтобы щелкнуть по реальному вводу, когда вы щелкнете по изображению.
Теперь ваша кнопка работает. Просто измените и вставьте значение при изменении.
Тах да! Возможно, вам придется проанализировать val () на что-то более значимое, но вы должны быть готовы.
источник
Поместите кнопку загрузки файла поверх красивой кнопки или элемента и скройте ее.
Очень просто и будет работать в любом браузере
Стили
источник
ВИДИМОСТЬ: скрытый трюк
Я обычно иду на
visibility:hidden
хитростьэто моя стилизованная кнопка
это тип ввода = кнопка файла. Обратите внимание на
visibility:hidden
правилоэто бит JavaScript, чтобы склеить их вместе. Оно работает
источник
style="visibility:hidden"
слишком долго, просто используйтеhidden
. Кроме того,click()
он работает для любых браузеров, и на данный момент нет очень надежной причины безопасности, и на любых устройствах это законный способ и @Gianluca для классического использования jQuerytrigger()
я могу думать только о том, чтобы найти кнопку с javascript после ее рендеринга и назначить ей стиль
Вы также можете посмотреть на эту рецензию
источник
Я бы обычно использовал простой javascript для настройки тега ввода файла. Скрытое поле ввода, по нажатию кнопки, вызов javascript скрытого поля, простое решение без использования css или связок jquery.
источник
click()
метод для запуска события для файла ввода типа. большая часть браузера не позволяет по соображениям безопасности.Здесь мы используем диапазон для запуска ввода файла типа и просто настраиваем этот диапазон , поэтому мы можем добавить любой стиль, используя этот способ.
Запись что мы используем входной тег с параметром visibility: hidden и запускаем его в диапазоне.
Ссылка
источник
Это хороший способ сделать это с помощью загрузки материала / угловых файлов. Вы можете сделать то же самое с кнопкой начальной загрузки.
Примечание, которое я использовал
<a>
вместо<button>
этого, позволяет всплывать событиям клика.источник
ТОЛЬКО CSS
Используйте это очень просто и легко
Html:
Css:
источник
Может быть, много awnsers. Но мне нравится это в чистом CSS с fa-кнопками:
Скрипка: https://jsfiddle.net/zoutepopcorn/v2zkbpay/1/
источник
Не дайте себя одурачить «великолепными» решениями только для CSS, которые на самом деле очень специфичны для браузера, или которые накладываются на стилизованную кнопку поверх реальной кнопки, или которые заставляют вас использовать
<label>
вместо<button>
или любой другой подобный хак , JavaScript необходим, чтобы заставить его работать для общего пользования. Пожалуйста, изучите, как это делают gmail и DropZone, если вы мне не верите.Просто создайте обычную кнопку по своему усмотрению, затем вызовите простую функцию JS, чтобы создать и связать скрытый элемент ввода с вашей стилизованной кнопкой.
Обратите внимание, как приведенный выше код пересылает его после каждого выбора пользователем файла. Это важно, потому что «onchange» вызывается, только если пользователь меняет имя файла. Но вы, вероятно, хотите получить файл каждый раз, когда пользователь предоставляет его.
источник
label
подход работает, за исключением того, что он не может показать выбранное имя файла или путь. Итак, обязательно говоря, это единственная проблема, которую нужно решить JS.Многофайловое решение с преобразованным именем файла
Пример начальной загрузки
HTML:
1. JS с JQuery:
2. JS без jQuery
источник
Вот решение, которое также показывает выбранное имя файла: http://jsfiddle.net/raft9pg0/1/
HTML:
JS:
CSS:
источник
fakepath
путь?На этой неделе мне также потребовалось настроить кнопку и отобразить выбранное имя файла в стороне от нее, поэтому после прочтения некоторых из ответов выше (спасибо BTW) я придумал следующую реализацию:
HTML:
CSS
Javascript (угловой)
По сути, я работаю с библиотекой ng-file-upload, в угловом плане я привязываю имя файла к своему $ scope и присваиваю ему начальное значение «Файл не выбран», я также привязываю функцию onFileSelect () к моя область видимости, поэтому, когда файл выбран, я получаю имя файла с помощью API ng-upload и присваиваю его $ scope.filename.
источник
Просто смоделируйте щелчок мышью
<input>
с помощьюtrigger()
функции при нажатии на стиль<div>
. Я создал свою собственную кнопку из<div>
и затем нажал на кнопкуinput
при нажатии моей<div>
. Это позволяет вам создать свою кнопку так, как вы хотите, потому что она<div>
и имитирует нажатие на ваш файл<input>
. Тогда используйтеdisplay: none
на своем<input>
.источник
Наилучшим способом является использование псевдоэлемента: after или: before в качестве элемента, перекрывающего ввод de. Затем стилизуйте этот псевдоэлемент по своему желанию. Я рекомендую вам в качестве общего стиля для всех входных файлов сделать следующее:
источник
Лучший способ, который я нашел, это
input type: file
установить его наdisplay: none
. Дайте этоid
. Создайте кнопку или любой другой элемент, который вы хотите открыть файл ввода.Затем добавьте прослушиватель событий (кнопка), который при нажатии моделирует щелчок по исходному входному файлу. Как нажатие на кнопку с именем «привет», но она открывает окно файла.
Пример кода
Javascript
источник
CSS может многое сделать здесь ... с небольшим обманом ...
:: ссылка :: http://site-o-matic.net/?viewpost=19
-abbey
источник
Я нашел очень простой способ переключить кнопку файла на картинку. Вы просто помечаете картинку и помещаете ее поверх кнопки файла.
При нажатии на помеченное изображение, вы выбираете кнопку файла.
источник
Только такой подход дает вам всю гибкость! ES6 / VanillaJS!
HTML:
JavaScript:
Это скрывает кнопку входного файла, но под капотом нажимает ее от другой обычной кнопки, которую вы, очевидно, можете стилизовать как любую другую кнопку. Это единственное решение без недостатков, кроме бесполезного DOM-узла. Благодаря
display:none;
, кнопка ввода не резервирует видимое пространство в DOM.(Я больше не знаю, кому дать реквизит для этого. Но я получил эту идею где-то здесь, на Stackoverflow.)
источник