Dodam własną odpowiedź, aby zrobić to tak, jak zrobiłem ... ale oto przykład oparty na bootstrapie, który może pomóc .. geniuscarrier.com/
Vishnu Narang
Odpowiedzi:
235
Styl wprowadzania danych wejściowych plików jest niezwykle trudny, ponieważ większość przeglądarek nie zmieni wyglądu zarówno z CSS, jak i javascript.
Nawet rozmiar danych wejściowych nie będzie odpowiadał:
<inputtype="file"style="width:200px">
Zamiast tego musisz użyć atrybutu size:
<inputtype="file"size="60"/>
W przypadku każdego bardziej zaawansowanego stylu (np. Zmiana wyglądu przycisku przeglądania) należy przyjrzeć się podstępnemu podejściu polegającemu na nakładaniu stylowego przycisku i pola wprowadzania na natywny plik wejściowy. Artykuł wspomniany już przez rm na www.quirksmode.org/dom/inputfile.html jest najlepszym, jaki widziałem.
AKTUALIZACJA
Chociaż trudno jest <input>bezpośrednio stylizować znacznik, jest to łatwo możliwe za pomocą <label>znacznika. Zobacz odpowiedź poniżej z @JoshCrozier: https://stackoverflow.com/a/25825731/10128619
@TLK Odpowiedź Ryana nie będzie działać w IE podczas próby przesłania iframe. Daje błąd odmowy dostępu. Zgadzam się, że w przypadku normalnego przesyłania jest to najłatwiejsze!
frostymarvellous
3
Wyjaśniono tutaj znacznie prostsze rozwiązanie niż tryb quirksmode . Po prostu umieszczam ten link tutaj, ponieważ ta odpowiedź i tak jest w zasadzie tylko linkiem.
Joeytje50
10
Wszystkim zainteresowanym nowoczesnym podejściem proponuję przyjrzeć się tej odpowiedzi . Nie wymaga JavaScript, podobnie jak niektóre inne odpowiedzi.
Josh Crozier
3
@JoshCrozier opublikował niesamowicie lepsze rozwiązanie. Nawet bije fałszywe rozwiązania typu klikanie myszką :)
Lodewijk
1012
Nie potrzebujesz do tego JavaScript! Oto rozwiązanie dla różnych przeglądarek:
Najlepszym rozwiązaniem byłoby posiadanie niestandardowego elementu etykiety z foratrybutem dołączonego do ukrytego elementu wejściowego pliku. (Aby foratrybut iddziałał , atrybut etykiety musi pasować do elementu pliku ).
1 - Warto zauważyć, że jeśli ukryjesz element za pomocą display: none, nie będzie działał w IE8 i niższych. Należy również pamiętać, że jQuery nie sprawdza domyślnie ukrytych pól . Jeśli jedna z tych rzeczy jest dla Ciebie problemem, oto dwie różne metody ukrywania danych wejściowych ( 1 , 2 ), które działają w takich okolicznościach.
Mam jednak pytanie dotyczące tego, kiedy wybierając plik, jak byśmy sobie poszli, a następnie wyświetlając nazwę pliku?
Richlewis,
17
Jak wyświetlić nazwę wybranego pliku, jeśli display: nonejest ustawiony na input[type=file]?
Sarthak Singhal,
38
Świetne rozwiązanie, ale tak naprawdę potrzebujesz javascript. Jeśli chcesz wyświetlić nazwę pliku, jak pytają inne osoby, musisz dodać rozpiętość między etykietą a ukrytym wejściem: <span id = "file-selected"> </span>. Następnie zaktualizuj zakres zdarzenia zmiany: $ ('# file-upload'). Bind ('change', function () {var fileName = ''; fileName = $ (this) .val (); $ ('# file-selected '). html (fileName);})
Sam
9
Powinieneś używać position: absolute; left: -99999remzamiast ze względu display: nonena dostępność. Przez większość czasu czytniki ekranu nie będą czytać elementów, jeśli są one ukryte za pomocą display: nonemetody.
Kapsułka
10
Jestem bardzo zaskoczony, że nikt nie wziął pod uwagę dostępności klawiatury. labelelementy nie są dostępne z klawiatury, w przeciwieństwie do buttons i inputs. Dodawanie tabindexnie jest rozwiązaniem, ponieważ labelnadal nie będzie wykonywane, gdy jest ono aktywne i użytkownik naciska klawisz Enter. Rozwiązałem to, wizualnie ukrywając dane wejściowe, dzięki czemu można je nadal skupić , a następnie użyć :focus-withinna elemencielabel macierzystym: jsbin.com/fokexoc/2/edit?html,css,output
Oliver Joseph Ash,
195
wykonaj następujące kroki, aby utworzyć niestandardowe style formularza przesyłania plików:
to jest prosty formularz HTML (proszę przeczytać komentarze HTML, które napisałem tutaj poniżej)
<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>
następnie użyj tego prostego skryptu, aby przekazać zdarzenie click do znacznika wejściowego pliku.
function getFile(){
document.getElementById("upfile").click();}
Teraz możesz używać dowolnego rodzaju stylizacji bez obawy o zmianę domyślnych stylów.
Wiem to bardzo dobrze, ponieważ od półtora miesiąca próbuję zmienić domyślne style. uwierz mi, to bardzo trudne, ponieważ różne przeglądarki mają różne znaczniki wejściowe przesyłania. Użyj tego, aby zbudować niestandardowe formularze przesyłania plików. Oto pełny kod AUTOMATYCZNEGO PRZESYŁANIA.
<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 -> Dzięki za rekomendację .. tutaj użyłem bardzo prostego skryptu Java, nie trzeba używać frameworków takich jak Jquery lub PrototypeJS.
teshguru,
7
Mam problem z przesłaniem formularza w IE9. Otrzymuję błąd „Odmowa dostępu”, który próbuje wysłać formularz za pomocą javascript. Jeśli kliknę przycisk Prześlij za pośrednictwem interfejsu użytkownika, działa. Czy jest na to jakiś sposób?
Kevin
1
@kevin -> Spróbuj event.preventDefault () po document.myForm.submit (), dokonałem zmiany powyższego kodu.
teshguru
1
Działa dobrze w Chrome, Firefox, Safari i Opera - ale nie w IE9. W IE9 pojawia się ten sam błąd „Odmowa dostępu” jak @Kevin - a czasami tylko cicha awaria bez błędu.
daveywc
10
W IE10 (i ewentualnie IE9 itd.) Otrzymasz komunikat „Odmowa dostępu” (lub brak odpowiedzi od jQuery), jeśli spróbujesz automatycznie przesłać formularz po kliknięciu przycisku wprowadzania pliku za pomocą javascript. Tak więc ta metoda działa na stylizację przycisku wprowadzania pliku, o ile użytkownik wciąż przesyła formularz. Zajęło mi to chwilę, aby to znaleźć, i widzę, że inni również mają ten sam problem. Zobacz to, aby uzyskać więcej informacji stackoverflow.com/a/4335390/21579 .
Jeff Widmer
76
Ukryj go za pomocą css i użyj niestandardowego przycisku za pomocą $ (selektor). Kliknij (), aby aktywować przycisk przeglądania. następnie ustaw interwał, aby sprawdzić wartość typu pliku wejściowego. interwał może wyświetlać wartość dla użytkownika, aby użytkownik mógł zobaczyć, co jest przesyłane. interwał zniknie po przesłaniu formularza [EDYCJA] Przepraszam, że byłem bardzo zajęty chciałem zaktualizować ten post, oto przykład
<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;});});
Ciekawe, czy działa w każdej przeglądarce nowej generacji, takiej jak Firefox, IE, Opera, Safari, Chrome itp.?
Wh1T3h4Ck5
To jest dla mnie najprostsze rozwiązanie! Przynajmniej w IE 9, Chrome 23 i FF 16 z jQuery 1.7.2, więc przy zaktualizowanych wersjach powinien działać.
Dani BISKUP
Czy ktoś wie, jak zmienić .new_Btn na wypadek, gdyby użytkownik wybrał obraz. Teraz pokazuje tylko tę samą klasę. Czy ktoś wie, jak to śledzić? Dzięki
Ando
2
@MehdiKaramosly działa nawet na IE 6 - ale to prawda tylko do jQuery 1.x , jQuery 2.x + nie obsługuje starych IE
jave.web
1
@Ando przez Javascript / jQuery => wartość wejściowa pliku jest pusta lub zawiera lokalną ścieżkę pliku => użyj zdarzenia onchange i przetestuj dla val () :) patrz jsfiddle.net/ZrBPF
jave.web
55
Wszystkie silniki renderujące automatycznie generują przycisk po <input type="file">utworzeniu. Historycznie ten przycisk był całkowicie nie do stylizacji. Jednak Trident i WebKit dodały haki do pseudoelementów.
Trójząb
Począwszy od IE10, przycisk wprowadzania pliku może być stylizowany za pomocą ::-ms-browsepseudoelementu. Zasadniczo wszelkie reguły CSS, które stosujesz do zwykłego przycisku, można zastosować do pseudoelementu. Na przykład:
WebKit zapewnia zaczep dla przycisku wprowadzania pliku z ::-webkit-file-upload-buttonpseudoelementem. Ponownie, można zastosować prawie każdą regułę CSS, dlatego też przykład Trident będzie tutaj działał:
Podczas stylizowania wejścia pliku nie należy przerywać żadnej natywnej interakcji, jaką zapewnia wejście .
The display: nonePodejście zrywa rodzimą przeciągnij i upuść.
Aby niczego nie złamać, powinieneś użyć opacity: 0 metodę wprowadzania danych i ustawić ją za pomocą wzorca względnego / bezwzględnego w opakowaniu.
Korzystając z tej techniki, możesz z łatwością stylizować strefę kliknięcia / upuszczenia dla użytkownika i dodać niestandardową klasę w języku JavaScript do dragenterzdarzenia, aby zaktualizować style i przekazać użytkownikowi informację zwrotną, aby mógł zobaczyć, że może upuścić plik.
HTML:
<labelfor="test"><div>Click or drop something here</div><inputtype="file"id="test"></label>
dzięki za post, jak to działa, jeśli dodany jest atrybut multiple = "multiple", przeciągnąłem 2 zdjęcia, ale widziałem ścieżkę tylko do pierwszego
PirateApp
Tutaj brakuje kodu. Jest więcej na skrzypcach. Jaka biblioteka?
ctrl-alt-delor,
Jest tylko javascript na skrzypcach z jQuery, aby pokazać pliki, które zostały upuszczone. To wszystko
kevcha,
Po wdrożeniu tego rozwiązania i przetestowaniu go dalej wydaje się, że nie działa również w Edge.
ChrisA
1
Ach, okej, brakowało mi opakowania z pozycją względną w twojej odpowiedzi - Mój zły. Jeśli dane wejściowe znajdują się poniżej wymiarów ekranu, przeglądarka próbuje je przewinąć i tym samym przesuwa kontener przewijania w górę strony. Oto demonstracja: stackblitz.com/edit/input-file-overflow?file=style.css (po prostu nie do końca pokazujący, w jaki sposób bezwzględna pozycja jest przyczyną zachowania)
Tom
23
Jestem w stanie to zrobić z czystym CSS, używając poniższego kodu. Użyłem bootstrap i niesamowitej czcionki.
Możesz owinąć swój typ wejściowy = „plik” wewnątrz etykiety dla danych wejściowych. Nadaj styl dowolną etykietę i ukryj dane wejściowe za pomocą display: none;
Oto rozwiązanie, które tak naprawdę nie stylizuje <input type="file" />elementu, ale zamiast tego używa <input type="file" />elementu na wierzchu innych elementów (które można stylizować). The<input type="file" />Element nie jest bardzo widoczny stąd, całkowita iluzja jest ładnie stylizowany kontroli przesyłania plików.
Ostatnio natknąłem się na ten problem i pomimo mnóstwa odpowiedzi na Stack Overflow, żadne z nich naprawdę nie pasowało do rachunku. Ostatecznie dostosowałem to tak, aby uzyskać proste i eleganckie rozwiązanie.
Przetestowałem to również na Firefox, IE (11, 10 i 9), Chrome i Opera, iPad i kilka urządzeń z Androidem.
$('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");}});
Pamiętaj, aby ustawić styl na wejściu, gdy będziesz gotowy: opacity: 0
nie możesz ustawić, display: noneponieważ musi być klikalny. Ale możesz ustawić go pod przyciskiem „nowy” lub schować pod czymś innym z indeksem Z, jeśli wolisz.
Skonfiguruj trochę jquery, aby kliknąć prawdziwe wejście po kliknięciu obrazu.
to się nie powiedzie z FF11 - powód: ponieważ nie możesz dokładnie wpływać na rozmiar pola wejściowego (tylko przy użyciu rozmiaru HTML) i przycisku (możesz ustawić wysokość za pomocą css), jeśli twoje widoczne pole wejściowe jest większe niż oryginalne FF zapewnia nam, pozostają z bardzo dużą ślepą strefą - punkt widzenia użytkownika: w większości przypadków narzeka, że przesyłanie nie działa po kliknięciu
Jeffz
2
Dobry pomysł, ale to nie zadziała w IE. $ ('# the_real_file_input'). click () uruchomi otwarte okno dialogowe, ale plik nie zostanie wybrany do formularza i przesyłanie nie powiedzie się.
Tomas
11
Umieść przycisk przesyłania pliku na swoim ładnym przycisku lub elemencie i ukryj go.
style="visibility:hidden"jest za długi, po prostu użyj hidden. click()Działa również w przypadku wszystkich przeglądarek i nie ma obecnie żadnego wiarygodnego powodu bezpieczeństwa, a na dowolnym urządzeniu jest to legalny sposób i @Gianluca do klasycznego użycia jQuerytrigger()
Thielicious
1
To jest właśnie rozwiązanie, które zamierzam do tego dodać! Działa i możesz wyświetlić go dokładnie tak, jak chcesz. Działa z Chrome, spróbuje innych.
markthewizard1234
7
jedynym sposobem, jaki mogę wymyślić, jest znalezienie przycisku z javascript po jego renderowaniu i przypisanie mu stylu
Zwykle używałbym prostego javascript do dostosowania znacznika wejściowego pliku. Ukryte pole wejściowe, po kliknięciu przycisku, wywołanie ukrytego pola javascript, proste rozwiązanie bez żadnego css lub wiązki jquery.
nie można użyć click()metody do wywołania zdarzenia dla pliku typu wejściowego. większość przeglądarki nie pozwala ze względów bezpieczeństwa.
Mahi
6
Tutaj używamy zakresu do wyzwalania danych wejściowych pliku typu i po prostu dostosowujemy ten zakres , abyśmy mogli dodać dowolną stylizację w ten sposób.
Zauważ , że używamy tagu wejściowego z opcją widoczności: ukryty i uruchamiamy go w zakresie.
Nie daj się zwieść „świetnym” rozwiązaniom opartym wyłącznie na CSS, które w rzeczywistości są bardzo specyficzne dla przeglądarki lub które nakładają stylizowany przycisk na prawdziwy przycisk, lub które zmuszają cię do użycia <label>zamiast hakera <button>lub jakiegokolwiek innego takiego hacka . JavaScript jest niezbędny, aby działał do ogólnego użytku. Sprawdź, jak robią to Gmail i DropZone, jeśli mi nie wierzysz.
Wystarczy zaprojektować zwykły przycisk, jak chcesz, a następnie wywołać prostą funkcję JS, aby utworzyć ukryty element wejściowy i połączyć go ze stylizowanym przyciskiem.
Zwróć uwagę, jak powyższy kod ponownie łączy go po każdym wybraniu pliku przez użytkownika. Jest to ważne, ponieważ „onchange” jest wywoływany tylko wtedy, gdy użytkownik zmieni nazwę pliku. Ale prawdopodobnie chcesz pobrać plik za każdym razem, gdy użytkownik go udostępni.
Mówiąc ściślej, labelpodejście działa, ale nie może pokazać wybranej nazwy pliku lub ścieżki. Tak więc, koniecznie, to jedyny problem, który JS musi rozwiązać.
Hassan Baig
4
Rozwiązanie wielu plików ze skonwertowaną nazwą pliku
Jak wyświetlić tylko nazwę pliku, a nie fakepathścieżkę?
Hassan Baig
3
W tym tygodniu musiałem również dostosować przycisk i wyświetlić na bok wybraną nazwę pliku, więc po przeczytaniu niektórych odpowiedzi powyżej (Dzięki BTW) wpadłem na następującą implementację:
Zasadniczo pracuję z biblioteką do przesyłania plików ng, pod kątem kątowym wiążę nazwę pliku z moim $ scope i nadając mu początkową wartość „Nie wybrano pliku”, wiążę również funkcję onFileSelect () z mój zakres, więc kiedy plik zostanie wybrany, otrzymuję nazwę pliku za pomocą interfejsu API ng-upload i przypisuję ją do $ scope.filename.
Po prostu symuluj kliknięcie <input>, używając trigger()funkcji po kliknięciu stylu <div>. Utworzyłem własny przycisk z, <div>a następnie uruchomiłem kliknięcie inputpo kliknięciu mojego <div>. Umożliwia to utworzenie przycisku w dowolny sposób, ponieważ jest to <div>i symuluje kliknięcie pliku <input>. Następnie użyj display: nonena swoim <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");});
Najlepszym sposobem jest użycie pseudoelementu: za lub: przed, jako element nad wejściem de. Następnie styl ten pseudo element, jak chcesz. Zalecam wykonanie ogólnego stylu dla wszystkich plików wejściowych w następujący sposób:
Najlepszym sposobem, jaki znalazłem, jest input type: fileustawienie go na display: none. Daj toid . Utwórz przycisk lub inny element, który chcesz otworzyć wejście pliku.
Następnie dodaj do niego detektor zdarzeń (przycisk), który po kliknięciu symuluje kliknięcie oryginalnego pliku wejściowego. Jak kliknięcie przycisku o nazwie hello, ale otwiera okno pliku.
Przykładowy kod
//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 może tutaj wiele zrobić ... z odrobiną oszustwa ...
<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);
}
Znalazłem bardzo łatwą metodę zmiany przycisku pliku na zdjęcie. Po prostu oznacz zdjęcie i umieść je na przycisku pliku.
<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>
Ukrywa to przycisk pliku wejściowego, ale pod maską klika go inny zwykły przycisk, który można oczywiście stylizować jak każdy inny przycisk. Jest to jedyne rozwiązanie bez wad oprócz bezużytecznego węzła DOM. Dzięki temu display:none;przycisk wejścia nie rezerwuje żadnej widocznej przestrzeni w DOM.
(Nie wiem już, komu dać za to rekwizyty. Ale wpadłem na ten pomysł gdzieś tutaj na Stackoverflow.)
Odpowiedzi:
Styl wprowadzania danych wejściowych plików jest niezwykle trudny, ponieważ większość przeglądarek nie zmieni wyglądu zarówno z CSS, jak i javascript.
Nawet rozmiar danych wejściowych nie będzie odpowiadał:
Zamiast tego musisz użyć atrybutu size:
W przypadku każdego bardziej zaawansowanego stylu (np. Zmiana wyglądu przycisku przeglądania) należy przyjrzeć się podstępnemu podejściu polegającemu na nakładaniu stylowego przycisku i pola wprowadzania na natywny plik wejściowy. Artykuł wspomniany już przez rm na www.quirksmode.org/dom/inputfile.html jest najlepszym, jaki widziałem.
AKTUALIZACJA
Chociaż trudno jest
<input>
bezpośrednio stylizować znacznik, jest to łatwo możliwe za pomocą<label>
znacznika. Zobacz odpowiedź poniżej z @JoshCrozier: https://stackoverflow.com/a/25825731/10128619źródło
Nie potrzebujesz do tego JavaScript! Oto rozwiązanie dla różnych przeglądarek:
Zobacz ten przykład! - Działa w Chrome / FF / IE - (IE10 / 9/8/7)
Najlepszym rozwiązaniem byłoby posiadanie niestandardowego elementu etykiety z
for
atrybutem dołączonego do ukrytego elementu wejściowego pliku. (Abyfor
atrybutid
działał , atrybut etykiety musi pasować do elementu pliku ).Alternatywnie można również po prostu owinąć element wejściowy pliku etykietą bezpośrednio: (przykład)
Jeśli chodzi o styl, po prostu ukryj 1 element wejściowy za pomocą selektora atrybutów .
Następnie wszystko, co musisz zrobić, to styl niestandardowego
label
elementu. (przykład) .1 - Warto zauważyć, że jeśli ukryjesz element za pomocą
display: none
, nie będzie działał w IE8 i niższych. Należy również pamiętać, że jQuery nie sprawdza domyślnie ukrytych pól . Jeśli jedna z tych rzeczy jest dla Ciebie problemem, oto dwie różne metody ukrywania danych wejściowych ( 1 , 2 ), które działają w takich okolicznościach.źródło
display: none
jest ustawiony nainput[type=file]
?position: absolute; left: -99999rem
zamiast ze względudisplay: none
na dostępność. Przez większość czasu czytniki ekranu nie będą czytać elementów, jeśli są one ukryte za pomocądisplay: none
metody.label
elementy nie są dostępne z klawiatury, w przeciwieństwie dobutton
s iinput
s. Dodawanietabindex
nie jest rozwiązaniem, ponieważlabel
nadal nie będzie wykonywane, gdy jest ono aktywne i użytkownik naciska klawisz Enter. Rozwiązałem to, wizualnie ukrywając dane wejściowe, dzięki czemu można je nadal skupić , a następnie użyć:focus-within
na elemencielabel
macierzystym: jsbin.com/fokexoc/2/edit?html,css,outputwykonaj następujące kroki, aby utworzyć niestandardowe style formularza przesyłania plików:
to jest prosty formularz HTML (proszę przeczytać komentarze HTML, które napisałem tutaj poniżej)
następnie użyj tego prostego skryptu, aby przekazać zdarzenie click do znacznika wejściowego pliku.
Teraz możesz używać dowolnego rodzaju stylizacji bez obawy o zmianę domyślnych stylów.
Wiem to bardzo dobrze, ponieważ od półtora miesiąca próbuję zmienić domyślne style. uwierz mi, to bardzo trudne, ponieważ różne przeglądarki mają różne znaczniki wejściowe przesyłania. Użyj tego, aby zbudować niestandardowe formularze przesyłania plików. Oto pełny kod AUTOMATYCZNEGO PRZESYŁANIA.
źródło
Ukryj go za pomocą css i użyj niestandardowego przycisku za pomocą $ (selektor). Kliknij (), aby aktywować przycisk przeglądania. następnie ustaw interwał, aby sprawdzić wartość typu pliku wejściowego. interwał może wyświetlać wartość dla użytkownika, aby użytkownik mógł zobaczyć, co jest przesyłane. interwał zniknie po przesłaniu formularza [EDYCJA] Przepraszam, że byłem bardzo zajęty chciałem zaktualizować ten post, oto przykład
źródło
HTML
CSS
jQuery
Fiddle : http://jsfiddle.net/M7BXC/
Możesz osiągnąć swoje cele również bez jQuery z normalnym JavaScript.
Teraz newBtn łączy się z html_btn i możesz stylizować swój nowy btn tak, jak chcesz: D
źródło
Wszystkie silniki renderujące automatycznie generują przycisk po
<input type="file">
utworzeniu. Historycznie ten przycisk był całkowicie nie do stylizacji. Jednak Trident i WebKit dodały haki do pseudoelementów.Trójząb
Począwszy od IE10, przycisk wprowadzania pliku może być stylizowany za pomocą
::-ms-browse
pseudoelementu. Zasadniczo wszelkie reguły CSS, które stosujesz do zwykłego przycisku, można zastosować do pseudoelementu. Na przykład:W IE10 na Windows 8 wyświetla się to następująco:
WebKit
WebKit zapewnia zaczep dla przycisku wprowadzania pliku z
::-webkit-file-upload-button
pseudoelementem. Ponownie, można zastosować prawie każdą regułę CSS, dlatego też przykład Trident będzie tutaj działał:W Chrome 26 na OS X wyświetla się to w następujący sposób:
źródło
Jeśli używasz Bootstrap 3, działało to dla mnie:
Zobacz http://www.abeautifulsite.net/whipping-file-inputs-into-shape-w--bootstrap-3/
Który tworzy następujący przycisk wprowadzania pliku:
Poważnie, sprawdź http://www.abeautifulsite.net/whipping-file-inputs-into-shape-with-bootstrap-3/
źródło
Przykład działania tutaj z natywną obsługą przeciągania i upuszczania: https://jsfiddle.net/j40xvkb3/
Podczas stylizowania wejścia pliku nie należy przerywać żadnej natywnej interakcji, jaką zapewnia wejście .
The
display: none
Podejście zrywa rodzimą przeciągnij i upuść.Aby niczego nie złamać, powinieneś użyć
opacity: 0
metodę wprowadzania danych i ustawić ją za pomocą wzorca względnego / bezwzględnego w opakowaniu.Korzystając z tej techniki, możesz z łatwością stylizować strefę kliknięcia / upuszczenia dla użytkownika i dodać niestandardową klasę w języku JavaScript do
dragenter
zdarzenia, aby zaktualizować style i przekazać użytkownikowi informację zwrotną, aby mógł zobaczyć, że może upuścić plik.HTML:
CSS:
Oto działający przykład (z dodatkowym JS do obsługi
dragover
zdarzeń i upuszczanych plików).https://jsfiddle.net/j40xvkb3/
Mam nadzieję, że to pomogło!
źródło
Jestem w stanie to zrobić z czystym CSS, używając poniższego kodu. Użyłem bootstrap i niesamowitej czcionki.
źródło
Możesz owinąć swój typ wejściowy = „plik” wewnątrz etykiety dla danych wejściowych. Nadaj styl dowolną etykietę i ukryj dane wejściowe za pomocą display: none;
źródło
Oto rozwiązanie, które tak naprawdę nie stylizuje
<input type="file" />
elementu, ale zamiast tego używa<input type="file" />
elementu na wierzchu innych elementów (które można stylizować). The<input type="file" />
Element nie jest bardzo widoczny stąd, całkowita iluzja jest ładnie stylizowany kontroli przesyłania plików.Ostatnio natknąłem się na ten problem i pomimo mnóstwa odpowiedzi na Stack Overflow, żadne z nich naprawdę nie pasowało do rachunku. Ostatecznie dostosowałem to tak, aby uzyskać proste i eleganckie rozwiązanie.
Przetestowałem to również na Firefox, IE (11, 10 i 9), Chrome i Opera, iPad i kilka urządzeń z Androidem.
Oto link JSFiddle -> http://jsfiddle.net/umhva747/
Mam nadzieję że to pomoże!!!
źródło
Jest to proste dzięki jquery. Aby podać kodowy przykład sugestii Ryana z niewielką modyfikacją.
Podstawowy HTML:
Pamiętaj, aby ustawić styl na wejściu, gdy będziesz gotowy:
opacity: 0
nie możesz ustawić,display: none
ponieważ musi być klikalny. Ale możesz ustawić go pod przyciskiem „nowy” lub schować pod czymś innym z indeksem Z, jeśli wolisz.Skonfiguruj trochę jquery, aby kliknąć prawdziwe wejście po kliknięciu obrazu.
Teraz twój przycisk działa. Po prostu wytnij i wklej wartość po zmianie.
Tah dah! Może być konieczne przetworzenie wartości val () na coś bardziej znaczącego, ale wszystko powinno być ustawione.
źródło
Umieść przycisk przesyłania pliku na swoim ładnym przycisku lub elemencie i ukryj go.
Bardzo prosty i działa na dowolnej przeglądarce
Style
źródło
WIDOCZNOŚĆ: ukryta sztuczka
Zwykle wybieram
visibility:hidden
lewęto jest mój przycisk w stylu
jest to przycisk typu wejściowego = plik. Zwróć uwagę na
visibility:hidden
zasadęjest to bit JavaScript, aby je skleić. To działa
źródło
style="visibility:hidden"
jest za długi, po prostu użyjhidden
.click()
Działa również w przypadku wszystkich przeglądarek i nie ma obecnie żadnego wiarygodnego powodu bezpieczeństwa, a na dowolnym urządzeniu jest to legalny sposób i @Gianluca do klasycznego użycia jQuerytrigger()
jedynym sposobem, jaki mogę wymyślić, jest znalezienie przycisku z javascript po jego renderowaniu i przypisanie mu stylu
możesz także spojrzeć na ten opis
źródło
Zwykle używałbym prostego javascript do dostosowania znacznika wejściowego pliku. Ukryte pole wejściowe, po kliknięciu przycisku, wywołanie ukrytego pola javascript, proste rozwiązanie bez żadnego css lub wiązki jquery.
źródło
click()
metody do wywołania zdarzenia dla pliku typu wejściowego. większość przeglądarki nie pozwala ze względów bezpieczeństwa.Tutaj używamy zakresu do wyzwalania danych wejściowych pliku typu i po prostu dostosowujemy ten zakres , abyśmy mogli dodać dowolną stylizację w ten sposób.
Zauważ , że używamy tagu wejściowego z opcją widoczności: ukryty i uruchamiamy go w zakresie.
Odniesienie
źródło
To dobry sposób na zrobienie tego z przesyłaniem plików / plików kątowych. Możesz zrobić to samo z przyciskiem ładowania początkowego.
Uwaga: Użyłem
<a>
zamiast<button>
tego pozwala, aby zdarzenia kliknięcia się w górę.źródło
TYLKO CSS
Użyj tego bardzo prostego i ŁATWEGO
HTML:
Css:
źródło
Może dużo napowietrzaczy. Ale podoba mi się to w czystym CSS z przyciskami fa:
Fiddle: https://jsfiddle.net/zoutepopcorn/v2zkbpay/1/
źródło
Nie daj się zwieść „świetnym” rozwiązaniom opartym wyłącznie na CSS, które w rzeczywistości są bardzo specyficzne dla przeglądarki lub które nakładają stylizowany przycisk na prawdziwy przycisk, lub które zmuszają cię do użycia
<label>
zamiast hakera<button>
lub jakiegokolwiek innego takiego hacka . JavaScript jest niezbędny, aby działał do ogólnego użytku. Sprawdź, jak robią to Gmail i DropZone, jeśli mi nie wierzysz.Wystarczy zaprojektować zwykły przycisk, jak chcesz, a następnie wywołać prostą funkcję JS, aby utworzyć ukryty element wejściowy i połączyć go ze stylizowanym przyciskiem.
Zwróć uwagę, jak powyższy kod ponownie łączy go po każdym wybraniu pliku przez użytkownika. Jest to ważne, ponieważ „onchange” jest wywoływany tylko wtedy, gdy użytkownik zmieni nazwę pliku. Ale prawdopodobnie chcesz pobrać plik za każdym razem, gdy użytkownik go udostępni.
źródło
label
podejście działa, ale nie może pokazać wybranej nazwy pliku lub ścieżki. Tak więc, koniecznie, to jedyny problem, który JS musi rozwiązać.Rozwiązanie wielu plików ze skonwertowaną nazwą pliku
PRZYKŁAD Bootstrap
HTML:
1. JS z jQuery:
2. JS bez jQuery
źródło
Oto rozwiązanie, które pokazuje również wybraną nazwę pliku: http://jsfiddle.net/raft9pg0/1/
HTML:
JS:
CSS:
źródło
fakepath
ścieżkę?W tym tygodniu musiałem również dostosować przycisk i wyświetlić na bok wybraną nazwę pliku, więc po przeczytaniu niektórych odpowiedzi powyżej (Dzięki BTW) wpadłem na następującą implementację:
HTML:
CSS
JavaScript (kątowy)
Zasadniczo pracuję z biblioteką do przesyłania plików ng, pod kątem kątowym wiążę nazwę pliku z moim $ scope i nadając mu początkową wartość „Nie wybrano pliku”, wiążę również funkcję onFileSelect () z mój zakres, więc kiedy plik zostanie wybrany, otrzymuję nazwę pliku za pomocą interfejsu API ng-upload i przypisuję ją do $ scope.filename.
źródło
Po prostu symuluj kliknięcie
<input>
, używająctrigger()
funkcji po kliknięciu stylu<div>
. Utworzyłem własny przycisk z,<div>
a następnie uruchomiłem kliknięcieinput
po kliknięciu mojego<div>
. Umożliwia to utworzenie przycisku w dowolny sposób, ponieważ jest to<div>
i symuluje kliknięcie pliku<input>
. Następnie użyjdisplay: none
na swoim<input>
.źródło
Najlepszym sposobem jest użycie pseudoelementu: za lub: przed, jako element nad wejściem de. Następnie styl ten pseudo element, jak chcesz. Zalecam wykonanie ogólnego stylu dla wszystkich plików wejściowych w następujący sposób:
źródło
Najlepszym sposobem, jaki znalazłem, jest
input type: file
ustawienie go nadisplay: none
. Daj toid
. Utwórz przycisk lub inny element, który chcesz otworzyć wejście pliku.Następnie dodaj do niego detektor zdarzeń (przycisk), który po kliknięciu symuluje kliknięcie oryginalnego pliku wejściowego. Jak kliknięcie przycisku o nazwie hello, ale otwiera okno pliku.
Przykładowy kod
javascript
źródło
css może tutaj wiele zrobić ... z odrobiną oszustwa ...
:: odniesienie :: http://site-o-matic.net/?viewpost=19
-opactwo
źródło
Znalazłem bardzo łatwą metodę zmiany przycisku pliku na zdjęcie. Po prostu oznacz zdjęcie i umieść je na przycisku pliku.
Klikając oznaczony obraz, wybierasz przycisk pliku.
źródło
Tylko takie podejście zapewnia pełną elastyczność! ES6 / VanillaJS!
HTML:
javascript:
Ukrywa to przycisk pliku wejściowego, ale pod maską klika go inny zwykły przycisk, który można oczywiście stylizować jak każdy inny przycisk. Jest to jedyne rozwiązanie bez wad oprócz bezużytecznego węzła DOM. Dzięki temu
display:none;
przycisk wejścia nie rezerwuje żadnej widocznej przestrzeni w DOM.(Nie wiem już, komu dać za to rekwizyty. Ale wpadłem na ten pomysł gdzieś tutaj na Stackoverflow.)
źródło