Ich werde meine eigene Antwort hinzufügen, um es so zu machen, wie ich es getan habe ... aber hier ist ein Beispiel basierend auf Bootstrap, das helfen könnte. Geniuscarrier.com/…
Vishnu Narang
Antworten:
235
Das Stylen von Dateieingaben ist bekanntermaßen schwierig, da die meisten Browser das Erscheinungsbild von CSS oder Javascript nicht ändern.
Selbst die Größe der Eingabe reagiert nicht auf Folgendes:
<inputtype="file"style="width:200px">
Stattdessen müssen Sie das Größenattribut verwenden:
<inputtype="file"size="60"/>
Für jedes anspruchsvollere Styling (z. B. Ändern des Aussehens der Schaltfläche "Durchsuchen") müssen Sie sich den kniffligen Ansatz ansehen, eine gestaltete Schaltfläche und ein Eingabefeld über die native Dateieingabe zu legen. Der Artikel, den rm bereits unter www.quirksmode.org/dom/inputfile.html erwähnt hat, ist der beste, den ich je gesehen habe.
AKTUALISIEREN
Obwohl es schwierig ist, ein <input>Tag direkt zu formatieren, ist dies mit Hilfe eines <label>Tags leicht möglich . Siehe Antwort unten von @JoshCrozier: https://stackoverflow.com/a/25825731/10128619
Die Antwort von @TLK Ryan funktioniert im IE nicht, wenn versucht wird, Iframe-Uploads durchzuführen. Es gibt Ihnen einen Fehler bei der Zugriffsverweigerung. Für normale Uploads stimme ich jedoch zu, dass dies am einfachsten ist!
frostymarvelous
3
Eine viel einfachere Lösung als die von Quirksmode wird hier erklärt . Setzen Sie einfach diesen Link hierher, da diese Antwort im Grunde genommen sowieso nur eine Link-Antwort ist.
Joeytje50
10
Für alle, die an einem modernen Ansatz interessiert sind, würde ich empfehlen, diese Antwort zu prüfen . Es erfordert auch kein JavaScript wie einige der anderen Antworten.
Josh Crozier
3
@JoshCrozier hat eine wahnsinnig viel bessere Lösung gepostet. Sogar besser als Fake-Mouseclicking-Lösungen :)
Lodewijk
1017
Dafür benötigen Sie kein JavaScript! Hier ist eine browserübergreifende Lösung:
Der beste Ansatz wäre, ein benutzerdefiniertes Beschriftungselement mit einem forAttribut an ein verstecktes Dateieingabeelement anzuhängen. (Das forAttribut des Labels muss mit dem des Dateielements übereinstimmen id, damit dies funktioniert.)
1 - Wenn Sie das Element mit ausblenden display: none, funktioniert es in IE8 und darunter nicht. Beachten Sie auch, dass die jQuery- Validierung versteckte Felder standardmäßig nicht validiert . Wenn eines dieser Dinge für Sie ein Problem darstellt, gibt es zwei verschiedene Methoden, um die Eingabe ( 1 , 2 ) auszublenden, die unter diesen Umständen funktioniert.
Ich habe jedoch eine Frage zu dieser Frage: Wie würden wir bei der Auswahl einer Datei vorgehen und dann den Dateinamen anzeigen?
Richlewis
17
Wie wird der Name der ausgewählten Datei angezeigt, wenn dies festgelegt display: noneist input[type=file]?
Sarthak Singhal
38
Tolle Lösung, aber Sie brauchen tatsächlich Javascript. Wenn Sie den Dateinamen anzeigen möchten, wie andere gefragt haben, müssen Sie einen Bereich zwischen der Beschriftung und der ausgeblendeten Eingabe hinzufügen: <span id = "file-selected"> </ span>. Aktualisieren Sie dann die Spanne des Änderungsereignisses: $ ('# file-upload'). Bind ('change', function () {var fileName = ''; fileName = $ (this) .val (); $ ('# Datei ausgewählt '). html (Dateiname);})
Sam
9
Sie sollten position: absolute; left: -99999remanstelle von display: noneaus Gründen der Barrierefreiheit verwenden. In den meisten Fällen lesen Screenreader keine Elemente, wenn sie mit der display: noneMethode ausgeblendet werden .
Kapsel
10
Ich bin sehr überrascht, dass niemand die Zugänglichkeit der Tastatur in Betracht gezogen hat. labelElemente sind im Gegensatz zu buttons und inputs nicht über die Tastatur zugänglich . Das Hinzufügen tabindexist keine Lösung, da der labelWille immer noch nicht ausgeführt wird, wenn er den Fokus hat und der Benutzer die Eingabetaste drückt. Ich habe dieses Problem gelöst, indem ich die Eingabe visuell ausgeblendet habe , damit sie weiterhin fokussiert werden kann, und sie dann :focus-withinauf dem labelübergeordneten Element verwendet habe
Oliver Joseph Ash
195
Befolgen Sie diese Schritte, um benutzerdefinierte Stile für Ihr Formular zum Hochladen von Dateien zu erstellen:
Dies ist das einfache HTML-Formular (bitte lesen Sie die HTML-Kommentare, die ich hier unten geschrieben habe)
<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>
Verwenden Sie dann dieses einfache Skript, um das Klickereignis an das Dateieingabe-Tag zu übergeben.
function getFile(){
document.getElementById("upfile").click();}
Jetzt können Sie jede Art von Stil verwenden, ohne sich Gedanken darüber machen zu müssen, wie Standardstile geändert werden.
Ich weiß das sehr gut, weil ich anderthalb Monate lang versucht habe, die Standardstile zu ändern. Glauben Sie mir, es ist sehr schwierig, weil verschiedene Browser unterschiedliche Upload-Eingabe-Tags haben. Verwenden Sie dieses, um Ihre benutzerdefinierten Formulare zum Hochladen von Dateien zu erstellen. Hier ist der vollständige AUTOMATED UPLOAD-Code.
<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 -> Danke für die Empfehlung. Hier habe ich ein sehr einfaches Java-Skript verwendet, ohne dass Frameworks wie Jquery oder PrototypeJS verwendet werden müssen.
Teshguru
7
Ich habe Probleme beim Senden des Formulars in IE9. Ich erhalte die Fehlermeldung "Zugriff verweigert", bei der versucht wird, das Formular über Javascript zu senden. Wenn ich über die Benutzeroberfläche auf die Schaltfläche "Senden" klicke, funktioniert es. Gibt es dafür eine Lösung?
Kevin
1
@kevin -> Bitte versuchen Sie event.preventDefault () nach document.myForm.submit (), ich habe die Änderung am obigen Code vorgenommen.
Teshguru
1
Funktioniert gut in Chrome, Firefox, Safari & Opera - aber nicht in IE9. In IE9 erhalte ich den gleichen Fehler "Zugriff wird verweigert" wie bei @Kevin - und manchmal nur einen stillen Fehler ohne Fehler.
Daveywc
10
In IE10 (und möglicherweise IE9 usw.) erhalten Sie "Zugriff verweigert" (oder keine Antwort von jQuery), wenn Sie versuchen, das Formular automatisch zu senden, nachdem Sie über Javascript auf die Schaltfläche zur Dateieingabe geklickt haben. Diese Methode dient also zum Stylen der Dateieingabeschaltfläche, solange der Benutzer noch das Formular sendet. Ich habe eine Weile gebraucht, um das zu finden, und ich sehe, dass andere das gleiche Problem haben. Weitere Informationen finden Sie unter stackoverflow.com/a/4335390/21579 .
Jeff Widmer
76
Blenden Sie es mit CSS aus und verwenden Sie eine benutzerdefinierte Schaltfläche mit $ (Selektor) .click (), um die Schaltfläche zum Durchsuchen zu aktivieren. Legen Sie dann ein Intervall fest, um den Wert des Dateieingabetyps zu überprüfen. Das Intervall kann den Wert für den Benutzer anzeigen, sodass der Benutzer sehen kann, was hochgeladen wird. Das Intervall wird gelöscht, wenn das Formular gesendet wird. [BEARBEITEN] Entschuldigung, ich war sehr beschäftigt, um diesen Beitrag zu aktualisieren. Hier ist ein Beispiel
<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;});});
Nur neugierig, funktioniert es in jedem Browser der neuen Generation wie Firefox, IE, Opera, Safari, Chrome usw.?
Wh1T3h4Ck5
Dies ist die einfachste Lösung für mich! Zumindest in IE 9, Chrome 23 und FF 16 mit jQuery 1.7.2, also sollte es mit aktualisierten Versionen funktionieren.
Dani Bischof
Weiß jemand, wie man die .new_Btn ändert, falls der Benutzer ein Bild ausgewählt hat. Jetzt zeigt es nur die gleiche Klasse. Weiß jemand, wie man das verfolgt? Danke
Ando
2
@MehdiKaramosly funktioniert es sogar auf IE 6 - aber das gilt nur bis zu jQuery 1.x , jQuery 2.x + unterstützt keine alten IEs
jave.web
1
@Ando via Javascript / jQuery => der Wert der Dateieingabe ist leer oder enthält den lokalen Dateipfad => benutze das Ereignis change und teste auf val () :) siehe jsfiddle.net/ZrBPF
jave.web
55
Alle Rendering-Engines generieren automatisch eine Schaltfläche, wenn eine <input type="file">erstellt wird. In der Vergangenheit war diese Schaltfläche nicht stilisierbar. Trident und WebKit haben jedoch Hooks durch Pseudoelemente hinzugefügt.
Dreizack
Ab IE10 kann die Dateieingabeschaltfläche mit dem Pseudoelement gestaltet werden ::-ms-browse. Grundsätzlich können alle CSS-Regeln, die Sie auf eine reguläre Schaltfläche anwenden, auf das Pseudoelement angewendet werden. Zum Beispiel:
Dies wird in IE10 unter Windows 8 wie folgt angezeigt:
WebKit
WebKit bietet einen Hook für seine Dateieingabeschaltfläche mit dem ::-webkit-file-upload-buttonPseudoelement. Auch hier kann so ziemlich jede CSS-Regel angewendet werden, daher funktioniert das Trident-Beispiel auch hier:
Für Gecko-basierte Programme wie Firefox gibt es keine speziellen Styling-Möglichkeiten.
Anselm
2
In Ihrer Antwort antworten Sie mit CSS, wie Sie das Wort "Keine Datei ausgewählt" im Tag <input type = file> ausblenden können. Bitte kommentieren Sie mich.
Wenn Sie eine Dateieingabe gestalten, sollten Sie keine der nativen Interaktionen unterbrechen, die die Eingabe bietet .
Der display: noneAnsatz unterbricht die native Drag & Drop-Unterstützung.
Um nichts zu beschädigen, sollten Sie den opacity: 0Ansatz für die Eingabe verwenden und ihn mit einem relativen / absoluten Muster in einem Wrapper positionieren.
Mit dieser Technik können Sie einfach eine Klick- / Ablagezone für den Benutzer formatieren und eine benutzerdefinierte Klasse in Javascript für dragenterEreignisse hinzufügen , um Stile zu aktualisieren und dem Benutzer ein Feedback zu geben, damit er sehen kann, dass er eine Datei löschen kann.
HTML:
<labelfor="test"><div>Click or drop something here</div><inputtype="file"id="test"></label>
danke für den Beitrag, wie funktioniert das, wenn multiple = "multiple" Attribut hinzugefügt wird, ich habe 2 Bilder gezogen, aber den Pfad nur für das erste gesehen
PirateApp
Sie haben hier Code verpasst. Es gibt mehr auf der Geige. Welche Bibliothek?
Strg-Alt-Delor
Es gibt nur etwas Javascript in der Geige mit jQuery, um Dateien anzuzeigen, die gelöscht wurden. Das ist alles
Kevcha
Nachdem diese Lösung implementiert und weiter getestet wurde, scheint sie auch in Edge nicht zu funktionieren.
ChrisA
1
Ah ok, ich habe den Wrapper mit der relativen Position in Ihrer Antwort verpasst - Mein schlechtes. Wenn die Eingabe unterhalb der Bildschirmabmessungen liegt, versucht der Browser, einen Bildlauf durchzuführen, und verschiebt dabei den Bildlaufcontainer auf der Seite nach oben. Hier ist eine Demonstration: stackblitz.com/edit/input-file-overflow?file=style.css (nur nicht genau, wie Position absolut die Ursache des Verhaltens ist)
Tom
23
Ich kann es mit reinem CSS unter Verwendung des folgenden Codes tun . Ich habe Bootstrap und Font-Awesome verwendet.
Sie können Ihren Eingabetyp = "Datei" in eine Beschriftung für die Eingabe einschließen. Gestalten Sie das Etikett nach Ihren Wünschen und verbergen Sie die Eingabe mit Anzeige: keine;
Hier ist eine Lösung, die das <input type="file" />Element nicht wirklich formatiert, sondern ein <input type="file" />Element über anderen Elementen verwendet (die gestylt werden können). Das <input type="file" />Element ist daher nicht wirklich sichtbar, daher besteht die allgemeine Illusion in einem gut gestalteten Steuerelement zum Hochladen von Dateien.
Ich bin kürzlich auf dieses Problem gestoßen, und trotz der Fülle von Antworten auf Stack Overflow schien keine wirklich zu passen. Am Ende habe ich dies angepasst, um eine einfache und elegante Lösung zu erhalten.
Ich habe dies auch auf Firefox, IE (11, 10 & 9), Chrome und Opera, iPad und einigen Android-Geräten getestet.
$('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");}});
Stellen Sie sicher, dass Sie das Styling für die Eingabe festlegen, wenn Sie bereit sind: opacity: 0
Sie können es nicht festlegen, display: noneda es anklickbar sein muss. Sie können es aber auch unter der Schaltfläche "Neu" positionieren oder unter etwas anderem mit Z-Index einfügen, wenn Sie dies bevorzugen.
Richten Sie eine Abfrage ein, um auf die reale Eingabe zu klicken, wenn Sie auf das Bild klicken.
Dies schlägt mit FF11 fehl - Grund: Da Sie die Größe des Eingabefelds (nur mithilfe der HTML-Größe) und der Schaltfläche (Sie können die Höhe mithilfe von CSS festlegen) nicht genau beeinflussen können, können Sie das sichtbare Eingabefeld, das größer ist als das ursprüngliche FF, uns zur Verfügung stellen Sie haben einen sehr großen blinden Bereich - Standpunkt des Benutzers: In den meisten Fällen wird er sich beschweren, dass das Hochladen nicht funktioniert, wenn er darauf
klickt
2
Gute Idee, aber das funktioniert nicht im IE. $ ('# the_real_file_input'). click () löst einen geöffneten Dialog aus, aber die Datei wird nicht in ein Formular ausgewählt und der Upload schlägt fehl.
Tomas
11
Legen Sie die Schaltfläche zum Hochladen von Dateien über Ihre nette Schaltfläche oder Ihr Element und verstecken Sie sie.
Sie können die click () -Methode nicht verwenden, um ein Ereignis für eine Eingabetypdatei auszulösen. Die meisten Browser erlauben aus Sicherheitsgründen keine
Mahi
sogar mit jquery? Ist das korrekt? wie würdest du es stattdessen machen
style="visibility:hidden"ist zu lang, einfach benutzen hidden. Funktioniert auch click()für alle Browser und es gibt derzeit keinen sehr zuverlässigen Sicherheitsgrund. Auf allen Geräten ist dies der legitime Weg und @Gianluca für die klassische Verwendung von jQuerytrigger()
Thielicious
1
Dies ist genau die Lösung, die ich hinzufügen wollte! Es funktioniert und Sie können es genau so anzeigen, wie Sie möchten. Funktioniert mit Chrome, wird andere ausprobieren.
markthewizard1234
7
Die einzige Möglichkeit, die ich mir vorstellen kann, besteht darin, die Schaltfläche mit Javascript zu finden, nachdem sie gerendert wurde, und ihr einen Stil zuzuweisen
Normalerweise würde ich einfaches Javascript verwenden, um das Dateieingabe-Tag anzupassen. Ein verstecktes Eingabefeld, auf Knopfdruck, Javascript ruft das versteckte Feld auf, einfache Lösung ohne CSS oder JQuery.
Sie können die click()Methode nicht verwenden , um ein Ereignis für eine Eingabetypdatei auszulösen. Die meisten Browser lassen aus Sicherheitsgründen keine zu.
Mahi
6
Hier verwenden wir eine Spanne, um die Eingabe einer Typdatei auszulösen, und haben diese Spanne einfach angepasst , damit wir auf diese Weise jedes Styling hinzufügen können.
Beachten Sie, dass wir ein Eingabe-Tag mit der Option Sichtbarkeit: versteckt verwenden und es in der Spanne auslösen.
Dies funktioniert hervorragend in Winkel 2+. Ich bin mir nicht sicher, warum es nicht gewählt wurde. Wenn Sie Angular verwenden, ist dies die einfachste verfügbare Lösung.
AndrewWhalan
4
NUR CSS
Verwenden Sie dies sehr einfach und EINFACH
Html:
<label>Attach your screenshort</label><inputtype="file"multipleclass="choose">
Lassen Sie sich nicht von "großartigen" Nur-CSS-Lösungen täuschen, die tatsächlich sehr browserspezifisch sind oder die die gestaltete Schaltfläche über der realen Schaltfläche überlagern oder die Sie dazu zwingen, einen <label>anstelle eines <button>oder eines anderen solchen Hacks zu verwenden . JavaScript ist erforderlich, damit es für den allgemeinen Gebrauch funktioniert. Bitte studieren Sie, wie Google Mail und DropZone es tun, wenn Sie mir nicht glauben.
Gestalten Sie einfach eine normale Schaltfläche, wie Sie möchten, und rufen Sie dann eine einfache JS-Funktion auf, um ein verstecktes Eingabeelement zu erstellen und mit Ihrer gestalteten Schaltfläche zu verknüpfen.
Beachten Sie, wie der obige Code ihn jedes Mal neu verknüpft, wenn der Benutzer eine Datei auswählt. Dies ist wichtig, da "onchange" nur aufgerufen wird, wenn der Benutzer den Dateinamen ändert. Aber Sie möchten die Datei wahrscheinlich jedes Mal abrufen, wenn der Benutzer sie bereitstellt.
Um genau zu sein, labelfunktioniert der Ansatz, außer dass der ausgewählte Dateiname oder Pfad nicht angezeigt werden kann. Das ist also notwendigerweise das einzige Problem, das JS lösen muss.
Hassan Baig
4
Lösung für mehrere Dateien mit konvertiertem Dateinamen
Wie wird nur der Dateiname und nicht der fakepathPfad angezeigt ?
Hassan Baig
3
Diese Woche musste ich auch die Schaltfläche anpassen und den ausgewählten Dateinamen daneben anzeigen. Nachdem ich einige der obigen Antworten gelesen hatte (danke übrigens), kam ich auf die folgende Implementierung:
Grundsätzlich arbeite ich mit ng-file-upload lib. Angular-weise binde ich den Dateinamen an meinen $ scope und gebe ihm den Anfangswert 'Keine Datei ausgewählt'. Außerdem binde ich die Funktion onFileSelect () an Wenn eine Datei ausgewählt wird, erhalte ich den Dateinamen mithilfe der ng-upload-API und weise ihn der Datei $ scope.filename zu.
Simulieren Sie einfach einen Klick auf die, <input>indem Sie die trigger()Funktion verwenden, wenn Sie auf einen Stil klicken <div>. Ich habe meine eigene Schaltfläche aus a erstellt <div>und dann inputbeim Klicken auf meine einen Klick auf ausgelöst <div>. Auf diese Weise können Sie Ihre Schaltfläche beliebig erstellen, da es sich um eine Schaltfläche handelt, <div>die einen Klick auf Ihre Datei simuliert <input>. Dann verwenden Sie display: noneauf Ihrem <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");});
Der beste Weg ist, das Pseudoelement: after oder: before als Element über der de-Eingabe zu verwenden. Gestalten Sie dann dieses Pseudoelement nach Ihren Wünschen. Ich empfehle Ihnen, als allgemeinen Stil für alle Eingabedateien Folgendes zu tun:
Der beste Weg, den ich gefunden habe, ist, ihn input type: filedann einzustellen display: none. Gib es ein id. Erstellen Sie eine Schaltfläche oder ein anderes Element, mit dem Sie die Dateieingabe öffnen möchten.
Fügen Sie dann einen Ereignis-Listener hinzu (Schaltfläche), der beim Klicken einen Klick auf die ursprüngliche Dateieingabe simuliert. Klicken Sie auf eine Schaltfläche mit dem Namen "Hallo", um ein Dateifenster zu öffnen.
Beispielcode
//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")})
<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);
}
Ich habe eine sehr einfache Methode gefunden, um die Datei-Schaltfläche auf ein Bild umzustellen. Sie beschriften einfach ein Bild und platzieren es oben auf der Datei-Schaltfläche.
<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>
Wenn Sie auf das beschriftete Bild klicken, wählen Sie die Schaltfläche Datei.
Dadurch wird die Schaltfläche für die Eingabedatei ausgeblendet, aber unter der Haube wird auf eine andere normale Schaltfläche geklickt, die Sie offensichtlich wie jede andere Schaltfläche gestalten können. Dies ist die einzige Lösung ohne Nachteile, abgesehen von einem nutzlosen DOM-Knoten. Dank display:none;der Eingabetaste wird kein sichtbarer Platz im DOM reserviert.
(Ich weiß nicht mehr, wem ich dafür Requisiten geben soll. Aber ich habe diese Idee von irgendwo hier auf Stackoverflow.)
Antworten:
Das Stylen von Dateieingaben ist bekanntermaßen schwierig, da die meisten Browser das Erscheinungsbild von CSS oder Javascript nicht ändern.
Selbst die Größe der Eingabe reagiert nicht auf Folgendes:
Stattdessen müssen Sie das Größenattribut verwenden:
Für jedes anspruchsvollere Styling (z. B. Ändern des Aussehens der Schaltfläche "Durchsuchen") müssen Sie sich den kniffligen Ansatz ansehen, eine gestaltete Schaltfläche und ein Eingabefeld über die native Dateieingabe zu legen. Der Artikel, den rm bereits unter www.quirksmode.org/dom/inputfile.html erwähnt hat, ist der beste, den ich je gesehen habe.
AKTUALISIEREN
Obwohl es schwierig ist, ein
<input>
Tag direkt zu formatieren, ist dies mit Hilfe eines<label>
Tags leicht möglich . Siehe Antwort unten von @JoshCrozier: https://stackoverflow.com/a/25825731/10128619quelle
Dafür benötigen Sie kein JavaScript! Hier ist eine browserübergreifende Lösung:
Siehe dieses Beispiel! - Es funktioniert in Chrome / FF / IE - (IE10 / 9/8/7)
Der beste Ansatz wäre, ein benutzerdefiniertes Beschriftungselement mit einem
for
Attribut an ein verstecktes Dateieingabeelement anzuhängen. (Dasfor
Attribut des Labels muss mit dem des Dateielements übereinstimmenid
, damit dies funktioniert.)Alternativ können Sie das Dateieingabeelement auch direkt mit einer Beschriftung versehen: (Beispiel)
In Bezug auf das Styling verstecken Sie einfach 1 das Eingabeelement mit der Attributauswahl .
Dann müssen Sie nur noch das benutzerdefinierte
label
Element formatieren. (Beispiel) .1 - Wenn Sie das Element mit ausblenden
display: none
, funktioniert es in IE8 und darunter nicht. Beachten Sie auch, dass die jQuery- Validierung versteckte Felder standardmäßig nicht validiert . Wenn eines dieser Dinge für Sie ein Problem darstellt, gibt es zwei verschiedene Methoden, um die Eingabe ( 1 , 2 ) auszublenden, die unter diesen Umständen funktioniert.quelle
display: none
istinput[type=file]
?position: absolute; left: -99999rem
anstelle vondisplay: none
aus Gründen der Barrierefreiheit verwenden. In den meisten Fällen lesen Screenreader keine Elemente, wenn sie mit derdisplay: none
Methode ausgeblendet werden .label
Elemente sind im Gegensatz zubutton
s undinput
s nicht über die Tastatur zugänglich . Das Hinzufügentabindex
ist keine Lösung, da derlabel
Wille immer noch nicht ausgeführt wird, wenn er den Fokus hat und der Benutzer die Eingabetaste drückt. Ich habe dieses Problem gelöst, indem ich die Eingabe visuell ausgeblendet habe , damit sie weiterhin fokussiert werden kann, und sie dann:focus-within
auf demlabel
übergeordneten Element verwendet habeBefolgen Sie diese Schritte, um benutzerdefinierte Stile für Ihr Formular zum Hochladen von Dateien zu erstellen:
Dies ist das einfache HTML-Formular (bitte lesen Sie die HTML-Kommentare, die ich hier unten geschrieben habe)
Verwenden Sie dann dieses einfache Skript, um das Klickereignis an das Dateieingabe-Tag zu übergeben.
Jetzt können Sie jede Art von Stil verwenden, ohne sich Gedanken darüber machen zu müssen, wie Standardstile geändert werden.
Ich weiß das sehr gut, weil ich anderthalb Monate lang versucht habe, die Standardstile zu ändern. Glauben Sie mir, es ist sehr schwierig, weil verschiedene Browser unterschiedliche Upload-Eingabe-Tags haben. Verwenden Sie dieses, um Ihre benutzerdefinierten Formulare zum Hochladen von Dateien zu erstellen. Hier ist der vollständige AUTOMATED UPLOAD-Code.
quelle
Blenden Sie es mit CSS aus und verwenden Sie eine benutzerdefinierte Schaltfläche mit $ (Selektor) .click (), um die Schaltfläche zum Durchsuchen zu aktivieren. Legen Sie dann ein Intervall fest, um den Wert des Dateieingabetyps zu überprüfen. Das Intervall kann den Wert für den Benutzer anzeigen, sodass der Benutzer sehen kann, was hochgeladen wird. Das Intervall wird gelöscht, wenn das Formular gesendet wird. [BEARBEITEN] Entschuldigung, ich war sehr beschäftigt, um diesen Beitrag zu aktualisieren. Hier ist ein Beispiel
quelle
HTML
CSS
jQuery
Geige : http://jsfiddle.net/M7BXC/
Sie können Ihre Ziele auch ohne jQuery mit normalem JavaScript erreichen.
Jetzt ist das newBtn mit dem html_btn verknüpft und Sie können Ihr neues btn wie gewünscht gestalten: D.
quelle
Alle Rendering-Engines generieren automatisch eine Schaltfläche, wenn eine
<input type="file">
erstellt wird. In der Vergangenheit war diese Schaltfläche nicht stilisierbar. Trident und WebKit haben jedoch Hooks durch Pseudoelemente hinzugefügt.Dreizack
Ab IE10 kann die Dateieingabeschaltfläche mit dem Pseudoelement gestaltet werden
::-ms-browse
. Grundsätzlich können alle CSS-Regeln, die Sie auf eine reguläre Schaltfläche anwenden, auf das Pseudoelement angewendet werden. Zum Beispiel:Dies wird in IE10 unter Windows 8 wie folgt angezeigt:
WebKit
WebKit bietet einen Hook für seine Dateieingabeschaltfläche mit dem
::-webkit-file-upload-button
Pseudoelement. Auch hier kann so ziemlich jede CSS-Regel angewendet werden, daher funktioniert das Trident-Beispiel auch hier:Dies wird in Chrome 26 unter OS X wie folgt angezeigt:
quelle
Wenn Sie Bootstrap 3 verwenden, hat dies bei mir funktioniert:
Siehe http://www.abeautifulsite.net/whipping-file-inputs-into-shape-with-bootstrap-3/
Welches erzeugt die folgende Datei-Eingabe-Schaltfläche:
Im Ernst, besuchen Sie http://www.abeautifulsite.net/whipping-file-inputs-into-shape-with-bootstrap-3/
quelle
Arbeitsbeispiel hier mit nativer Drag & Drop-Unterstützung: https://jsfiddle.net/j40xvkb3/
Wenn Sie eine Dateieingabe gestalten, sollten Sie keine der nativen Interaktionen unterbrechen, die die Eingabe bietet .
Der
display: none
Ansatz unterbricht die native Drag & Drop-Unterstützung.Um nichts zu beschädigen, sollten Sie den
opacity: 0
Ansatz für die Eingabe verwenden und ihn mit einem relativen / absoluten Muster in einem Wrapper positionieren.Mit dieser Technik können Sie einfach eine Klick- / Ablagezone für den Benutzer formatieren und eine benutzerdefinierte Klasse in Javascript für
dragenter
Ereignisse hinzufügen , um Stile zu aktualisieren und dem Benutzer ein Feedback zu geben, damit er sehen kann, dass er eine Datei löschen kann.HTML:
CSS:
Hier ist ein Arbeitsbeispiel (mit zusätzlichem JS zur Behandlung von
dragover
Ereignissen und abgelegten Dateien).https://jsfiddle.net/j40xvkb3/
Hoffe das hat geholfen!
quelle
Ich kann es mit reinem CSS unter Verwendung des folgenden Codes tun . Ich habe Bootstrap und Font-Awesome verwendet.
quelle
Sie können Ihren Eingabetyp = "Datei" in eine Beschriftung für die Eingabe einschließen. Gestalten Sie das Etikett nach Ihren Wünschen und verbergen Sie die Eingabe mit Anzeige: keine;
quelle
Hier ist eine Lösung, die das
<input type="file" />
Element nicht wirklich formatiert, sondern ein<input type="file" />
Element über anderen Elementen verwendet (die gestylt werden können). Das<input type="file" />
Element ist daher nicht wirklich sichtbar, daher besteht die allgemeine Illusion in einem gut gestalteten Steuerelement zum Hochladen von Dateien.Ich bin kürzlich auf dieses Problem gestoßen, und trotz der Fülle von Antworten auf Stack Overflow schien keine wirklich zu passen. Am Ende habe ich dies angepasst, um eine einfache und elegante Lösung zu erhalten.
Ich habe dies auch auf Firefox, IE (11, 10 & 9), Chrome und Opera, iPad und einigen Android-Geräten getestet.
Hier ist der JSFiddle-Link -> http://jsfiddle.net/umhva747/
Hoffe das hilft!!!
quelle
Dies ist mit jquery einfach. Um ein Codebeispiel für Ryans Vorschlag mit einer geringfügigen Änderung zu geben.
Grundlegendes HTML:
Stellen Sie sicher, dass Sie das Styling für die Eingabe festlegen, wenn Sie bereit sind:
opacity: 0
Sie können es nicht festlegen,display: none
da es anklickbar sein muss. Sie können es aber auch unter der Schaltfläche "Neu" positionieren oder unter etwas anderem mit Z-Index einfügen, wenn Sie dies bevorzugen.Richten Sie eine Abfrage ein, um auf die reale Eingabe zu klicken, wenn Sie auf das Bild klicken.
Jetzt funktioniert Ihre Schaltfläche. Schneiden Sie den Wert einfach aus und fügen Sie ihn ein, wenn Sie ihn ändern.
Tah dah! Möglicherweise müssen Sie val () auf etwas Bedeutenderes analysieren, aber Sie sollten fertig sein.
quelle
Legen Sie die Schaltfläche zum Hochladen von Dateien über Ihre nette Schaltfläche oder Ihr Element und verstecken Sie sie.
Sehr einfach und funktioniert in jedem Browser
Stile
quelle
SICHTBARKEIT: versteckter Trick
Normalerweise mache ich den
visibility:hidden
TrickDas ist mein gestylter Knopf
Dies ist die Schaltfläche Eingabetyp = Datei. Beachten Sie die
visibility:hidden
RegelDies ist das JavaScript-Bit, um sie zusammenzukleben. Es klappt
quelle
style="visibility:hidden"
ist zu lang, einfach benutzenhidden
. Funktioniert auchclick()
für alle Browser und es gibt derzeit keinen sehr zuverlässigen Sicherheitsgrund. Auf allen Geräten ist dies der legitime Weg und @Gianluca für die klassische Verwendung von jQuerytrigger()
Die einzige Möglichkeit, die ich mir vorstellen kann, besteht darin, die Schaltfläche mit Javascript zu finden, nachdem sie gerendert wurde, und ihr einen Stil zuzuweisen
Sie können sich auch diesen Artikel ansehen
quelle
Normalerweise würde ich einfaches Javascript verwenden, um das Dateieingabe-Tag anzupassen. Ein verstecktes Eingabefeld, auf Knopfdruck, Javascript ruft das versteckte Feld auf, einfache Lösung ohne CSS oder JQuery.
quelle
click()
Methode nicht verwenden , um ein Ereignis für eine Eingabetypdatei auszulösen. Die meisten Browser lassen aus Sicherheitsgründen keine zu.Hier verwenden wir eine Spanne, um die Eingabe einer Typdatei auszulösen, und haben diese Spanne einfach angepasst , damit wir auf diese Weise jedes Styling hinzufügen können.
Beachten Sie, dass wir ein Eingabe-Tag mit der Option Sichtbarkeit: versteckt verwenden und es in der Spanne auslösen.
Referenz
quelle
Dies ist eine gute Möglichkeit, dies beim Hochladen von Material- / Winkeldateien zu tun. Sie können dasselbe mit einer Bootstrap-Schaltfläche tun.
Hinweis: Ich habe
<a>
stattdessen verwendet,<button>
damit die Klickereignisse in die Luft sprudeln.quelle
NUR CSS
Verwenden Sie dies sehr einfach und EINFACH
Html:
CSS:
quelle
Vielleicht viele Markisen. Aber ich mag das in reinem CSS mit Fa-Buttons:
Geige: https://jsfiddle.net/zoutepopcorn/v2zkbpay/1/
quelle
Lassen Sie sich nicht von "großartigen" Nur-CSS-Lösungen täuschen, die tatsächlich sehr browserspezifisch sind oder die die gestaltete Schaltfläche über der realen Schaltfläche überlagern oder die Sie dazu zwingen, einen
<label>
anstelle eines<button>
oder eines anderen solchen Hacks zu verwenden . JavaScript ist erforderlich, damit es für den allgemeinen Gebrauch funktioniert. Bitte studieren Sie, wie Google Mail und DropZone es tun, wenn Sie mir nicht glauben.Gestalten Sie einfach eine normale Schaltfläche, wie Sie möchten, und rufen Sie dann eine einfache JS-Funktion auf, um ein verstecktes Eingabeelement zu erstellen und mit Ihrer gestalteten Schaltfläche zu verknüpfen.
Beachten Sie, wie der obige Code ihn jedes Mal neu verknüpft, wenn der Benutzer eine Datei auswählt. Dies ist wichtig, da "onchange" nur aufgerufen wird, wenn der Benutzer den Dateinamen ändert. Aber Sie möchten die Datei wahrscheinlich jedes Mal abrufen, wenn der Benutzer sie bereitstellt.
quelle
label
funktioniert der Ansatz, außer dass der ausgewählte Dateiname oder Pfad nicht angezeigt werden kann. Das ist also notwendigerweise das einzige Problem, das JS lösen muss.Lösung für mehrere Dateien mit konvertiertem Dateinamen
Bootstrap BEISPIEL
HTML:
1. JS mit jQuery:
2. JS ohne jQuery
quelle
Hier ist eine Lösung, die auch den ausgewählten Dateinamen anzeigt: http://jsfiddle.net/raft9pg0/1/
HTML:
JS:
CSS:
quelle
fakepath
Pfad angezeigt ?Diese Woche musste ich auch die Schaltfläche anpassen und den ausgewählten Dateinamen daneben anzeigen. Nachdem ich einige der obigen Antworten gelesen hatte (danke übrigens), kam ich auf die folgende Implementierung:
HTML:
CSS
Javascript (eckig)
Grundsätzlich arbeite ich mit ng-file-upload lib. Angular-weise binde ich den Dateinamen an meinen $ scope und gebe ihm den Anfangswert 'Keine Datei ausgewählt'. Außerdem binde ich die Funktion onFileSelect () an Wenn eine Datei ausgewählt wird, erhalte ich den Dateinamen mithilfe der ng-upload-API und weise ihn der Datei $ scope.filename zu.
quelle
Simulieren Sie einfach einen Klick auf die,
<input>
indem Sie dietrigger()
Funktion verwenden, wenn Sie auf einen Stil klicken<div>
. Ich habe meine eigene Schaltfläche aus a erstellt<div>
und danninput
beim Klicken auf meine einen Klick auf ausgelöst<div>
. Auf diese Weise können Sie Ihre Schaltfläche beliebig erstellen, da es sich um eine Schaltfläche handelt,<div>
die einen Klick auf Ihre Datei simuliert<input>
. Dann verwenden Siedisplay: none
auf Ihrem<input>
.quelle
Der beste Weg ist, das Pseudoelement: after oder: before als Element über der de-Eingabe zu verwenden. Gestalten Sie dann dieses Pseudoelement nach Ihren Wünschen. Ich empfehle Ihnen, als allgemeinen Stil für alle Eingabedateien Folgendes zu tun:
quelle
Der beste Weg, den ich gefunden habe, ist, ihn
input type: file
dann einzustellendisplay: none
. Gib es einid
. Erstellen Sie eine Schaltfläche oder ein anderes Element, mit dem Sie die Dateieingabe öffnen möchten.Fügen Sie dann einen Ereignis-Listener hinzu (Schaltfläche), der beim Klicken einen Klick auf die ursprüngliche Dateieingabe simuliert. Klicken Sie auf eine Schaltfläche mit dem Namen "Hallo", um ein Dateifenster zu öffnen.
Beispielcode
Javascript
quelle
CSS kann hier viel ... mit ein wenig Trick ...
:: reference :: http://site-o-matic.net/?viewpost=19
-Abtei
quelle
Ich habe eine sehr einfache Methode gefunden, um die Datei-Schaltfläche auf ein Bild umzustellen. Sie beschriften einfach ein Bild und platzieren es oben auf der Datei-Schaltfläche.
Wenn Sie auf das beschriftete Bild klicken, wählen Sie die Schaltfläche Datei.
quelle
Nur dieser Ansatz bietet Ihnen die gesamte Flexibilität! ES6 / VanillaJS!
html:
Javascript:
Dadurch wird die Schaltfläche für die Eingabedatei ausgeblendet, aber unter der Haube wird auf eine andere normale Schaltfläche geklickt, die Sie offensichtlich wie jede andere Schaltfläche gestalten können. Dies ist die einzige Lösung ohne Nachteile, abgesehen von einem nutzlosen DOM-Knoten. Dank
display:none;
der Eingabetaste wird kein sichtbarer Platz im DOM reserviert.(Ich weiß nicht mehr, wem ich dafür Requisiten geben soll. Aber ich habe diese Idee von irgendwo hier auf Stackoverflow.)
quelle