Wie kann ich <input type = "file"> anpassen?

164

Ist es möglich, das Aussehen von zu ändern <input type="file">?

Newbie Coder
quelle
Der Grund, warum das Textfeld vorhanden ist, liegt darin, dass es dem Benutzer den Dateipfad anzeigt, nachdem er seine Datei durchsucht und ausgewählt hat.
k bis zum z
Oooppss .. es scheint, dass es die Art ist, wie Firefox damit umgeht ...
Newbie Coder
Damit wir uns darüber im Klaren sind, müssen sie das Formular auch nach dem Durchsuchen der Datei mit einer Schaltfläche zum Senden von Formularen senden.
k bis zum z
2
In dieser Lösung finden Sie eine viel einfachere Möglichkeit.
Joeytje50
1
Es ist etwas seltsam, eine zukünftige Frage als Duplikat einer älteren zu markieren. Wird es den Vorrang haben, dass es in Ordnung ist, Fragen erneut zu stellen und dann die ursprünglichen zu schließen? Duplikate sind hier schon ein großes Problem. Ich sehe den Wert darin, eine Frage erneut zu stellen, bei der vorhandene Antworten veraltet sind , aber es ist immer möglich, die Frage zu bearbeiten und neue Antworten hinzuzufügen / zu bearbeiten.
Alex

Antworten:

235

Sie können nicht viel am input[type=file]Steuerelement selbst ändern .

Da durch Klicken auf ein labelElement, das korrekt mit einer Eingabe gekoppelt ist, diese aktiviert / fokussiert wird, können Sie mit a labeldas Dialogfeld zum Durchsuchen des Betriebssystems auslösen.

Hier ist, wie Sie es tun können ...

label {
   cursor: pointer;
   /* Style as you please, it will become the visible UI component. */
}

#upload-photo {
   opacity: 0;
   position: absolute;
   z-index: -1;
}
<label for="upload-photo">Browse...</label>
<input type="file" name="photo" id="upload-photo" />

Das CSS für das Formularsteuerelement lässt es unsichtbar erscheinen und nimmt keinen Platz im Dokumentlayout ein, ist aber weiterhin vorhanden, sodass es über das aktiviert werden kann label.

Wenn Sie den vom Benutzer ausgewählten Pfad nach der Auswahl anzeigen möchten, können Sie das changeEreignis mit JavaScript abhören und dann den Pfad lesen, den der Browser Ihnen zur Verfügung stellt (aus Sicherheitsgründen kann er Sie über den genauen Pfad belügen ). Eine Möglichkeit, es für den Endbenutzer hübsch zu machen, besteht darin, einfach den Basisnamen des zurückgegebenen Pfads zu verwenden (sodass der Benutzer einfach den ausgewählten Dateinamen sieht).

Es gibt eine großartige Anleitung von Tympanus, um dies zu stylen .

Alex
quelle
2
Ich glaube, dies sind bessere Stile, wenn man bedenkt, dass wir den Dialog zum Auswählen von Dateien öffnen möchten, indem wir auf eine beliebige Stelle im Container klicken:#container { position: relative; width: ...px; height: ...px; overflow: hidden; } #input { position: absolute; right: 0; font-size: <many a>px; opacity: 0; margin: 0; padding: 0; border: none; }
x-yuri
1
Die Verwendung <label>(wie von Tympanus gezeigt) ist weitaus semantischer und weniger hackig. Auch diese Frage wurde einige Jahre später erneut gestellt und hat dort viel bessere Antworten: Browserübergreifendes benutzerdefiniertes Styling für die Schaltfläche zum Hochladen von Dateien .
Dan Dascalescu
1
@DanDascalescu Ich stimme zu, wenn ich mich richtig erinnern kann (im Jahr 2011), hatte es Probleme mit dem IE, wahrscheinlich 6 oder 7. Ich werde diese Antwort bearbeiten, um sie jetzt in die Zukunft zu bringen.
Alex
Warum sollte es besser sein, ein Etikett zu verwenden? Sie können keine Beschriftungen mit Registerkarten versehen. Außerdem ist eine Schaltfläche für mich sinnvoller als eine Beschriftung, um einen Dialog zu aktivieren.
Louis-Marie Matthews
1
@alex, Der Dateiname wird nicht angezeigt.
Naren Verma
33

So etwas vielleicht?

<form>
  <input id="fileinput" type="file" style="display:none;"/>
</form>
<button id="falseinput">El Cucaratcha, for example</button>
<span id="selected_filename">No file selected</span>

<script>
$(document).ready( function() {
  $('#falseinput').click(function(){
    $("#fileinput").click();
  });
});
$('#fileinput').change(function() {
  $('#selected_filename').text($('#fileinput')[0].files[0].name);
});

</script>
Konservin
quelle
1
In diesem Fall, dh 9, kann das Formular nicht an iframe gesendet werden.
X-Yuri
@ x-yuri was meinst du?
Micaël Félix
2
Soweit ich mich erinnere, erlaubt 9 (und wahrscheinlich auch andere) das Senden des Formulars an iframe nicht, da der Benutzer nicht auf die Eingabedatei geklickt hat.
X-Yuri
display: noneentfernt die Eingabe aus der Tabulatorreihenfolge, wodurch die Seite weniger zugänglich wird. Die Verwendung <label>(wie von Tympanus gezeigt) ist weitaus semantischer und weniger hackig. Auch diese Frage wurde einige Jahre später erneut gestellt und hat dort viel bessere Antworten: Browserübergreifendes benutzerdefiniertes Styling für die Schaltfläche zum Hochladen von Dateien .
Dan Dascalescu
Tippfehler in eckiger Klammer in einem Selektor behoben, damit der Code tatsächlich funktioniert
Constantin Groß
23
  <label for="fusk">dsfdsfsd</label>
  <input id="fusk" type="file" name="photo" style="display: none;">

warum nicht? ^ _ ^

Siehe das Beispiel hier

jt3k
quelle
4
@InakiIbarrolaAtxa können Sie Daten bereitstellen, um dies zu unterstützen?
Ben Leggiero
1
Stylen Sie in Chrome 51 nichts. Die Verwendung <label>(wie von Tympanus gezeigt) ist eine semantisch korrekte Lösung. Auch diese Frage wurde einige Jahre später erneut gestellt und hat dort viel bessere Antworten: Browserübergreifendes benutzerdefiniertes Styling für die Schaltfläche zum Hochladen von Dateien .
Dan Dascalescu
12

Wenn Sie Bootstrap verwenden , ist hier eine bessere Lösung:

<label class="btn btn-default btn-file">
    Browse <input type="file" style="display: none;">
</label>

Für IE8 und darunter http://www.abeautifulsite.net/whipping-file-inputs-into-shape-with-bootstrap-3/

Quelle: https://stackoverflow.com/a/18164555/625952

Ouadie
quelle
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - Aus dem Rückblick
Tom
Fertig, ich habe gerade ein Beispiel aufgenommen
Ouadie
10

Einfachster Weg..

<label>
     Upload
    <input type="file" style="visibility: hidden;"/>
</label>
caden311
quelle
Wieso hat das niemand bemerkt?
rootExplorr
1
Ich war zu spät zum Spiel
caden311
6

Im Webkit können Sie dies ausprobieren ...

input[type="file"]::-webkit-file-upload-button{
   /* style goes here */
}
Christopher Reid
quelle
Kennen Sie eine ähnliche Lösung für Firefox? Existiert es ? )
Artem Z.
5

Zuallererst ist es ein Container:

<div class="upload_file_container">
    Select file!
    <input type="file" name="photo" />
</div>

Das zweite ist ein CSS-Stil, wenn Sie wirklich mehr Anpassungen vornehmen möchten, müssen Sie nur die Augen offen halten :)

.upload_file_container{
   width:100px;
   height:40px;
   position:relative;
   background(your img);
}

.upload_file_container input{
   width:100px;
   height:40px;
   position:absolute;
   left:0;
   top:0;
   cursor:pointer;
}

Dieses Beispiel hat keinen Stil für Text innerhalb der Schaltfläche. Es hängt von der Schriftgröße ab. Korrigieren Sie einfach die Höhe und die Füllwerte für den Container

Juri Karasjov
quelle
Ich frage mich, warum schaffst du es nicht right: 0statt left: 0? Auf diese Weise hätten Sie dh das Textfeld aus dem Container. Durch Klicken auf das Textfeld wird das Dialogfeld "Datei auswählen" nicht geöffnet. Außerdem glaube ich, dass font-sizees viel besser ist , die Eingabedatei mit zu vergrößern, als mit widthund height.
X-Yuri
5

Der Trick besteht darin, die Eingabe auszublenden und die Beschriftung anzupassen.

Geben Sie hier die Bildbeschreibung ein

HTML:

<div class="inputfile-box">
  <input type="file" id="file" class="inputfile" onchange='uploadFile(this)'>
  <label for="file">
    <span id="file-name" class="file-box"></span>
    <span class="file-button">
      <i class="fa fa-upload" aria-hidden="true"></i>
      Select File
    </span>
  </label>
</div>

CSS:

.inputfile-box {
  position: relative;
}

.inputfile {
  display: none;
}

.container {
  display: inline-block;
  width: 100%;
}

.file-box {
  display: inline-block;
  width: 100%;
  border: 1px solid;
  padding: 5px 0px 5px 5px;
  box-sizing: border-box;
  height: calc(2rem - 2px);
}

.file-button {
  background: red;
  padding: 5px;
  position: absolute;
  border: 1px solid;
  top: 0px;
  right: 0px;
}

JS:

function uploadFile(target) {
    document.getElementById("file-name").innerHTML = target.files[0].name;
}

Sie können dieses Beispiel überprüfen: https://jsfiddle.net/rjurado/hnf0zhy1/4/

Drinor
quelle
Mir gefällt, wie Sie ein Font Awesome-Symbol verwenden, im Gegensatz zu anderen.
Max Voisard
4

Es ist viel besser, wenn Sie nur a verwenden <label>, das ausblenden <input>und das Etikett anpassen.

HTML:

<input type="file" id="input">
<label for="input" id="label">Choose File</label>

CSS:

input#input{
    display: none;
}
label#label{
    /* Customize your label here */
}
Bogdan M.
quelle
display: noneentfernt das Element aus der Tabulatorreihenfolge. Die Verwendung <label>(wie von Tympanus gezeigt) ist die semantisch korrekte Methode, erfordert jedoch einige Verbesserungen. Auch diese Frage wurde einige Jahre später erneut gestellt und hat dort viel bessere Antworten: Browserübergreifendes benutzerdefiniertes Styling für die Schaltfläche zum Hochladen von Dateien .
Dan Dascalescu
2

Um den Pfad der ausgewählten Datei anzuzeigen, können Sie dies auf HTML versuchen:

<div class="fileinputs">
    <input type="file" class="file">
</div>

und in Javascript:

        var fakeFileUpload = document.createElement('div');
        fakeFileUpload.className = 'fakefile';
        var image = document.createElement('div');
        image.className='fakebtn';
        image.innerHTML = 'browse';
        fakeFileUpload.appendChild(image);
        fakeFileUpload.appendChild(document.createElement('input'));
        var x = document.getElementsByTagName('input');
        for (var i=0;i<x.length;i++) {
            if (x[i].type != 'file') continue;
            if (x[i].parentNode.className != 'fileinputs') continue;
            x[i].className = 'file hidden';
            var clone = fakeFileUpload.cloneNode(true);
            x[i].parentNode.appendChild(clone);
            x[i].relatedElement = clone.getElementsByTagName('input')[0];
            x[i].onchange = x[i].onmouseout = function () {
                this.relatedElement.value = this.value;
            }
        }

und Stil:

div.fileinputs {
    position: relative;
    height: 30px;
    width: 370px;
}
input.file.hidden {
    position: relative;
    text-align: right;
    -moz-opacity: 0;
    filter: alpha(opacity: 0);
    opacity: 0;
    z-index: 2;
}
div.fakefile {
    position: absolute;
    top: 0px;
    left: 0px;
    right: 0;
    width: 370px;
    padding: 0;
    margin: 0;
    z-index: 1;
    line-height: 90%;
}
div.fakefile input {
    margin-bottom: 5px;
    margin-left: 0;
    border: none;
    box-shadow: 0px 0px 2px 1px #ccc;
    padding: 4px;
    width: 241px;
    height: 20px;
}
div.fakefile .fakebtn{
    width: 150px;
    background: #eb5a41;
    z-index: 10;
    font-family: roya-bold;
    border: none;
    padding: 5px 15px;
    font-size: 18px;
    text-align: center;
    cursor: pointer;
    -webkit-transition: all 0.4s ease;
    -moz-transition: all 0.4s ease;
    -o-transition: all 0.4s ease;
    -ms-transition: all 0.4s ease;
    transition: all 0.4s ease;
    display: inline;
    margin-left: 3px;
}
div.fileinputs input[type="file"]:hover + div .fakebtn{
    background: #DA472E;
}

div.fileinputs input[type="file"] {
    opacity: 0;
    position: absolute;
    top: -6px;
    right: 0px;
    z-index: 20;
    width: 102px;
    height: 40px;
    cursor: pointer;
}
saghar.fadaei
quelle
Salam saghar, Dies war die beste Antwort für mich, danke
ucMedia
2

Bootstrap-Beispiel

<label className="btn btn-info btn-lg">
  Upload
  <input type="file" style="display: none" />
</label>
juliankmazo
quelle
1

Ich habe mich für diese Option entschieden, die verdeutlicht, wie die Schaltfläche zum Durchsuchen vollständig angepasst werden kann, indem ein Handler des hochgeladenen Dateinamens hinzugefügt wird, der ebenfalls angepasst wurde. Es werden zusätzliche Felder und clientseitige Steuerelemente hinzugefügt, um zu zeigen, wie das Durchsuchen in einer "echten" Form und nicht nur in einer eigenständigen Form eingeschlossen werden kann.

Hier ist der Codepen: http://codepen.io/emiemi/pen/zxNXWR

JS:

//click on our custom btn triggers a click on the hidden actual file input 
$("#btnup").click(function(){
   $("#fileup").click();    
});


//changes on the three fields (input, tit,and name) trigger a control which checks if the 3 fields are all filled and if file field is valid (an image is uploaded)
$('#fileup').change(function(){
    var formDOMObj = document.upload;
//here we assign tu our text field #fileup the name of the selected file  
    var res=$('#fileup').val();
    var arr = res.split("\\");
//if file is not valid we show the error icon and the red alert
    if (formDOMObj.fileup.value.indexOf(".jpg") == -1 && formDOMObj.fileup.value.indexOf(".png") == -1 &&  formDOMObj.fileup.value.indexOf(".jpeg") == -1 && formDOMObj.fileup.value.indexOf(".bmp") == -1 && formDOMObj.fileup.value.indexOf(".JPG") == -1 && formDOMObj.fileup.value.indexOf(".PNG") == -1 &&  formDOMObj.fileup.value.indexOf(".JPEG") == -1 && formDOMObj.fileup.value.indexOf(".BMP") == -1){
        $( ".imgupload" ).hide("slow"); 
        $( ".imguploadok" ).hide("slow");   
        $( ".imguploadstop" ).show("slow");
        $('#nomefile').css({"color":"red","font-weight":700});
        $('#nomefile').html("The file "+arr.slice(-1)[0]+" is not an image!");
        $( "#bottone" ).hide();
        $( "#fakebtn" ).show();
    }else{
 //if file is valid we show the green alert
    $( ".imgupload" ).hide("slow");
    $( ".imguploadstop" ).hide("slow");
    $( ".imguploadok" ).show("slow");
    $('#nomefile').html(arr.slice(-1)[0]);
    $('#nomefile').css({"color":"green","font-weight":700});
    if (formDOMObj.nome.value!=""&&formDOMObj.tit.value!=""&&formDOMObj.fileup.value!=""){
  //if all three fields are valid the fake input btn is hidden and the actual one i s finally hown
        $( "#fakebtn" ).hide();
        $( "#bottone" ).show();
    }
    }
});


$('#nome').change(function(){
//same as file change but on name field
    var formDOMObj = document.upload;
    if (formDOMObj.nome.value!=""&&formDOMObj.tit.value!=""&&formDOMObj.fileup.value!=""){
        $( "#fakebtn" ).hide();
        $( "#bottone" ).show();
    }else{
        $( "#bottone" ).hide();
        $( "#fakebtn" ).show();
    }
});
$('#tit').change(function(){
 //same as file change but on tit field
    var formDOMObj = document.upload;
    if (formDOMObj.nome.value!=""&&formDOMObj.tit.value!=""&&formDOMObj.fileup.value!=""){
        $( "#fakebtn" ).hide();
        $( "#bottone" ).show();
    }else{
        $( "#bottone" ).hide();
        $( "#fakebtn" ).show();
    }
});

HTML:

<form name="upload" method="post" action="/" enctype="multipart/form-data" accept-charset="utf-8">
<div class="row">
  <div class="col-md-6 center">
<!--this is the actual file input, s hidden beacause we wanna use our custom one-->
    <input type="file" value="" class="hidden" name="fileup" id="fileup">
    <div class="btn-container">
<!--the three icons: default, ok file (img), error file (not an img)-->
      <h1 class="imgupload"><i class="fa fa-file-image-o"></i></h1>
      <h1 class="imguploadok"><i class="fa fa-check"></i></h1>
      <h1 class="imguploadstop"><i class="fa fa-times"></i></h1>
<!--this field changes dinamically displaying the filename we are trying to upload-->
      <p id="nomefile">Only pics allowed! (jpg,jpeg,bmp,png)</p>
<!--our custom btn which triggers the actual hidden one-->
      <button type="button" id="btnup" class="btn btn-primary btn-lg">Browse for your pic!</button>
    </div>
  </div>
<!--additional fields-->
  <div class="col-md-6">
    <div class="row">
      <div class="form-group" id="top">
        <div class="col-md-12">
          <input type="text" maxlength="100" class="form-control" name="nome" id="nome" placeholder="Your Name">
        </div>
      </div>
    </div>
    <div class="row">
      <div class="form-group">
        <div class="col-md-12">
          <input type="text" maxlength="50" class="form-control" name="tit" id="tit" placeholder="I am rubber, you are glue">
        </div>
      </div>
    </div>

    <div class="row">
      <div class="col-md-8">
        <p class="white">All fields are mandatory</p>
      </div>
      <div class="col-md-4">
<!--the defauld disabled btn and the actual one shown only if the three fields are valid-->
        <input type="submit" value="Submit!" class="btn btn-primary" id="bottone" style="padding-left:50px; padding-right:50px; display:none;">
        <button type="button" class="btn btn-default" disabled="disabled" id="fakebtn"  style="padding-left:40px; padding-right:40px;">Submit! <i class="fa fa-minus-circle"></i></button>
      </div>
    </div>
  </div>
</div>

Emi-C
quelle
0

Hier ist eine Möglichkeit, die mir gefällt, weil dadurch die Eingabe den gesamten Container ausfüllt. Der Trick ist die "Schriftgröße: 100px" und muss mit dem "Überlauf: versteckt" und der relativen Position übereinstimmen.

<div id="upload-file-container" >
   <input type="file" />
</div>

#upload-file-container {
   width: 200px;
   height: 50px;
   position: relative;
   border: dashed 1px black;
   overflow: hidden;
}

#upload-file-container input[type="file"]
{
   margin: 0;
   opacity: 0;   
   font-size: 100px;
}
Vanja
quelle
Es macht Sinn, es zu machenposition: absolute; right: 0; font-size: <many>px;
x-yuri
0

Sie können sie formatieren, aber die bereits vorhandenen Elemente nicht entfernen. Wenn Sie kreativ sind, können Sie damit arbeiten und so etwas tun:

input[type=file] {
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    background: #EEE;
    background: linear-gradient(to top, #FFF, #DDD);
    border: thin solid rgba(0,0,0, .5);
    border-radius: .25em;
    box-shadow: inset .25em .25em .25em rgba(255,255,255, .5), inset -.1em -.1em .1em rgba(0,0,0, 0.1);
    cursor: text;
    padding: .25em;
}

http://jsfiddle.net/zr1x1m2b/1/

Ich schlage vor, Sie spielen mit diesem Code herum, entfernen Zeilen, fügen Ihre eigenen hinzu und tun alles, bis Sie etwas bekommen, das so aussieht, wie Sie es mögen!

Ben Leggiero
quelle
1
Stylen Sie nicht die Wörter "Wählen Sie eine Datei". Die Verwendung <label>(wie von Tympanus gezeigt) ist semantisch und bietet vollständige Anpassbarkeit. Auch diese Frage wurde einige Jahre später erneut gestellt und hat dort viel bessere Antworten: Browserübergreifendes benutzerdefiniertes Styling für die Schaltfläche zum Hochladen von Dateien .
Dan Dascalescu
1
@ DanDascalescu Du hast recht! Ich biete nur eine reine CSS-Lösung an, falls Sie den HTML-Code mit Ihrem Setup nicht ändern können.
Ben Leggiero
0

Gestalten Sie einfach eine normale Schaltfläche mit Ihrem bevorzugten CSS, wie Sie möchten.

Rufen Sie dann eine einfache JS-Funktion auf, um ein verstecktes Eingabeelement zu erstellen und mit Ihrer gestalteten Schaltfläche zu verknüpfen. Fügen Sie kein browserspezifisches CSS hinzu, um den Teil auszublenden.

<!DOCTYPE html>
<meta charset="utf-8">

<style>
    button {
        width            : 160px;
        height           : 30px;
        font-size        : 13px;
        border           : none;
        text-align       : center;
        background-color : #444;
        color            : #6f0;
    }
    button:active {
        background-color : #779;
    }
</style>

<button id="upload">Styled upload button!</button>

<script>

function Upload_On_Click(id, handler) {
    var hidden_input = null;
    document.getElementById(id).onclick = function() {hidden_input.click();}
    function setup_hidden_input() {
        hidden_input && hidden_input.parentNode.removeChild(hidden_input);
        hidden_input = document.createElement("input");
        hidden_input.setAttribute("type", "file");
        hidden_input.style.visibility = "hidden";
        document.querySelector("body").appendChild(hidden_input);
        hidden_input.onchange = function() {
            handler(hidden_input.files[0]);
            setup_hidden_input();
        };
    }
    setup_hidden_input();
}

Upload_On_Click("upload", function(file) {
    console.log("GOT FILE: " + file.name);
});

</script>

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.

Weitere Informationen finden Sie in DropZone- und Google Mail-Uploads.

personal_cloud
quelle
0

 $(document).ready(function () {
        $(document).mousemove(function () {
        $('#myList').css('display', 'block');
        $("#seebtn").css('display', 'none');
        $("#hidebtn").css('display', 'none');
        $('#displayFileNames').html('');
        $("#myList").html('');
        var fileArray1 = document.getElementsByClassName('file-input');
        for (var i = 0; i < fileArray1.length; i++) {
            var files = fileArray1[i].files;
            for (var j = 0; j < files.length; j++) {
                $("#myList").append("<li style='color:black'>" + files[j].name + "</li>");
            }
        };

        if (($("#myList").html()) != '') {
            $('#unselect').css('display', 'block');
            $('#divforfile').css('color', 'green');
            $('#attach').css('color', 'green');
            $('#displayFileNames').html($("#myList").children().length + ' ' + 'files selezionato');

        };

        if (($("#myList").html()) == '') {
            $('#divforfile').css('color', 'black');
            $('#attach').css('color', 'black');
            $('#displayFileNames').append('Nessun File Selezionato');
        };
    });

  });

  function choosefiles(obj) {
        $(obj).hide();
        $('#myList').css('display', 'none');
        $('#hidebtn').css('display', 'none');
        $("#seebtn").css('display', 'none');
        $('#unselect').css('display', 'none');
        $("#upload-form").append("<input class='file-input inputs' type='file' onclick='choosefiles(this)' name='file[]' multiple='multiple' />");
        $('#displayFileNames').html('');
    }

  $(document).ready(function () {
        $('#unselect').click(function () {
            $('#hidebtn').css('display', 'none');
            $("#seebtn").css('display', 'none');
            $('#displayFileNames').html('');
            $("#myList").html('');
            $('#myFileInput').val('');
            document.getElementById('upload-form').reset();         
            $('#unselect').css('display', 'none');
            $('#divforfile').css('color', 'black');
            $('#attach').css('color', 'black');

        });
    });
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<style>
  .divs {
        position: absolute;
        display: inline-block;
        background-color: #fff;
    }

    .inputs {
        position: absolute;
        left: 0px;
        height: 2%;
        width: 15%;
        opacity: 0;
        background: #00f;
        z-index: 100;
    }

    .icons {
        position: absolute;
    }

 </style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
            <div>
                <form id='upload-form' action='' method='post' enctype='multipart/form-data'>
                   
                    <div class="divs" id="divforfile" style="color:black">
                        <input id='myFileInput' class='file-input inputs' type='file' name='file[]' onclick="choosefiles(this)" multiple='multiple' />
                        <i class="material-icons" id="attach" style="font-size:21px;color:black">attach_file</i><label>Allegati</label>
                    </div>
                </form>
                <br />
            </div>
            <br />  
            <div>
                <button style="border:none; background-color:white; color:black; display:none" id="seebtn"><p>Files &#9660;</p></button>
                <button style="border:none; background-color:white; color:black; display:none" id="hidebtn"><p>Files &#9650;</p></button>
                <button type="button" class="close" aria-label="Close" id="unselect" style="display:none;float:left">
                    <span style="color:red">&times;</span>
                </button>
                <div id="displayFileNames">
                </div>
                <ul id="myList"></ul>
            </div>

Dies ist mein voll funktionsfähiges kundenspezifisches Hochladen / Anhängen von Dateien mit jquery & javascript (Visual Studio). Das wird nützlich sein!

Code wird im Kommentarbereich verfügbar sein!

Link: https://youtu.be/It38OzMAeig

Genießen :)

 $(document).ready(function () {
        $(document).mousemove(function () {
        $('#myList').css('display', 'block');
        $("#seebtn").css('display', 'none');
        $("#hidebtn").css('display', 'none');
        $('#displayFileNames').html('');
        $("#myList").html('');
        var fileArray1 = document.getElementsByClassName('file-input');
        for (var i = 0; i < fileArray1.length; i++) {
            var files = fileArray1[i].files;
            for (var j = 0; j < files.length; j++) {
                $("#myList").append("<li style='color:black'>" + files[j].name + "</li>");
            }
        };

        if (($("#myList").html()) != '') {
            $('#unselect').css('display', 'block');
            $('#divforfile').css('color', 'green');
            $('#attach').css('color', 'green');
            $('#displayFileNames').html($("#myList").children().length + ' ' + 'files selezionato');

        };

        if (($("#myList").html()) == '') {
            $('#divforfile').css('color', 'black');
            $('#attach').css('color', 'black');
            $('#displayFileNames').append('Nessun File Selezionato');
        };
    });

  });

  function choosefiles(obj) {
        $(obj).hide();
        $('#myList').css('display', 'none');
        $('#hidebtn').css('display', 'none');
        $("#seebtn").css('display', 'none');
        $('#unselect').css('display', 'none');
        $("#upload-form").append("<input class='file-input inputs' type='file' onclick='choosefiles(this)' name='file[]' multiple='multiple' />");
        $('#displayFileNames').html('');
    }

  $(document).ready(function () {
        $('#unselect').click(function () {
            $('#hidebtn').css('display', 'none');
            $("#seebtn").css('display', 'none');
            $('#displayFileNames').html('');
            $("#myList").html('');
            $('#myFileInput').val('');
            document.getElementById('upload-form').reset();         
            $('#unselect').css('display', 'none');
            $('#divforfile').css('color', 'black');
            $('#attach').css('color', 'black');

        });
    });
<style>
  .divs {
        position: absolute;
        display: inline-block;
        background-color: #fff;
    }

    .inputs {
        position: absolute;
        left: 0px;
        height: 2%;
        width: 15%;
        opacity: 0;
        background: #00f;
        z-index: 100;
    }

    .icons {
        position: absolute;
    }

 </style>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
   <div>
                <form id='upload-form' action='' method='post' enctype='multipart/form-data'>
                   
                    <div class="divs" id="divforfile" style="color:black">
                        <input id='myFileInput' class='file-input inputs' type='file' name='file[]' onclick="choosefiles(this)" multiple='multiple' />
                        <i class="material-icons" id="attach" style="font-size:21px;color:black">attach_file</i><label>Allegati</label>
                    </div>
                </form>
                <br />
            </div>
            <br />  
            <div>
                <button style="border:none; background-color:white; color:black; display:none" id="seebtn"><p>Files &#9660;</p></button>
                <button style="border:none; background-color:white; color:black; display:none" id="hidebtn"><p>Files &#9650;</p></button>
                <button type="button" class="close" aria-label="Close" id="unselect" style="display:none;float:left">
                    <span style="color:red">&times;</span>
                </button>
                <div id="displayFileNames">
                </div>
                <ul id="myList"></ul>
            </div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
 $(document).ready(function () {
        $(document).mousemove(function () {
        $('#myList').css('display', 'block');
        $("#seebtn").css('display', 'none');
        $("#hidebtn").css('display', 'none');
        $('#displayFileNames').html('');
        $("#myList").html('');
        var fileArray1 = document.getElementsByClassName('file-input');
        for (var i = 0; i < fileArray1.length; i++) {
            var files = fileArray1[i].files;
            for (var j = 0; j < files.length; j++) {
                $("#myList").append("<li style='color:black'>" + files[j].name + "</li>");
            }
        };

        if (($("#myList").html()) != '') {
            $('#unselect').css('display', 'block');
            $('#divforfile').css('color', 'green');
            $('#attach').css('color', 'green');
            $('#displayFileNames').html($("#myList").children().length + ' ' + 'files selezionato');

        };

        if (($("#myList").html()) == '') {
            $('#divforfile').css('color', 'black');
            $('#attach').css('color', 'black');
            $('#displayFileNames').append('Nessun File Selezionato');
        };
    });

  });

  function choosefiles(obj) {
        $(obj).hide();
        $('#myList').css('display', 'none');
        $('#hidebtn').css('display', 'none');
        $("#seebtn").css('display', 'none');
        $('#unselect').css('display', 'none');
        $("#upload-form").append("<input class='file-input inputs' type='file' onclick='choosefiles(this)' name='file[]' multiple='multiple' />");
        $('#displayFileNames').html('');
    }

  $(document).ready(function () {
        $('#unselect').click(function () {
            $('#hidebtn').css('display', 'none');
            $("#seebtn").css('display', 'none');
            $('#displayFileNames').html('');
            $("#myList").html('');
            $('#myFileInput').val('');
            document.getElementById('upload-form').reset();         
            $('#unselect').css('display', 'none');
            $('#divforfile').css('color', 'black');
            $('#attach').css('color', 'black');

        });
    });
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<style>
  .divs {
        position: absolute;
        display: inline-block;
        background-color: #fff;
    }

    .inputs {
        position: absolute;
        left: 0px;
        height: 2%;
        width: 15%;
        opacity: 0;
        background: #00f;
        z-index: 100;
    }

    .icons {
        position: absolute;
    }

 </style>
 <div>
                <form id='upload-form' action='' method='post' enctype='multipart/form-data'>
                   
                    <div class="divs" id="divforfile" style="color:black">
                        <input id='myFileInput' class='file-input inputs' type='file' name='file[]' onclick="choosefiles(this)" multiple='multiple' />
                        <i class="material-icons" id="attach" style="font-size:21px;color:black">attach_file</i><label>Allegati</label>
                    </div>
                </form>
                <br />
            </div>
            <br />  
            <div>
                <button style="border:none; background-color:white; color:black; display:none" id="seebtn"><p>Files &#9660;</p></button>
                <button style="border:none; background-color:white; color:black; display:none" id="hidebtn"><p>Files &#9650;</p></button>
                <button type="button" class="close" aria-label="Close" id="unselect" style="display:none;float:left">
                    <span style="color:red">&times;</span>
                </button>
                <div id="displayFileNames">
                </div>
                <ul id="myList"></ul>
            </div>

Milan Madubasha
quelle
0

Hier ist eine schnelle, reine CSS-Problemumgehung (funktioniert auf Chrome und enthält einen FireFox-Fallback), einschließlich des Dateinamens, einer Beschriftung und einer benutzerdefinierten Upload-Schaltfläche, die genau das tut, was sie sollte - JavaScript wird überhaupt nicht benötigt! 🎉

Hinweis: ☝ Dies funktioniert unter Chrome und hat einen FireFox-Fallback - auf jeden Fall würde ich es nicht auf einer realen Website verwenden - wenn die Browserkompatibilität für Sie von Bedeutung ist (was es sein sollte). Es ist also eher experimentell.

.fileUploadInput {
  display: grid;
  grid-gap: 10px;
  position: relative;
  z-index: 1; }
  
  .fileUploadInput label {
    display: flex;
    align-items: center;
    color: setColor(primary, 0.5);
    background: setColor(white);
    transition: .4s ease;
    font-family: arial, sans-serif;
    font-size: .75em;
    font-weight: regular; }
    
  .fileUploadInput input {
    position: relative;
    z-index: 1;
    padding: 0 gap(m);
    width: 100%;
    height: 50px;
    border: 1px solid #323262;
    border-radius: 3px;
    font-family: arial, sans-serif;
    font-size: 1rem;
    font-weight: regular; }
    .fileUploadInput input[type="file"] {
      padding: 0 gap(m); }
      .fileUploadInput input[type="file"]::-webkit-file-upload-button {
        visibility: hidden;
        margin-left: 10px;
        padding: 0;
        height: 50px;
        width: 0; }
        
  .fileUploadInput button {
    position: absolute;
    right: 0;
    bottom: 0;
    width: 50px;
    height: 50px;
    line-height: 0;
    user-select: none;
    color: white;
    background-color: #323262;
    border-radius: 0 3px 3px 0;
    font-family: arial, sans-serif;
    font-size: 1rem;
    font-weight: 800; }
    .fileUploadInput button svg {
      width: auto;
      height: 50%; }

* {
  margin: 0px;
  padding: 0px;
  box-sizing: border-box;
  border: 0px;
  outline: 0;
  background-repeat: no-repeat;
  appearance: none;
  border-radius: 0;
  vertical-align: middle;
  font-weight: inherit;
  font-style: inherit;
  font-family: inherit;
  text-decoration: none;
  list-style: none;
  user-select: text;
  line-height: 1.333em; }

body {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 100vh;
  background: rgba(66, 50, 98, 0.05); }

.container {
  padding: 25px;
  box-shadow: 0 0 20px rgba(66, 50, 98, 0.35);
  border: 1px solid #eaeaea;
  border-radius: 3px;
  background: white; }

@-moz-document url-prefix() {
.fileUploadInput button{
    display: none
}
}
<!-- Author: Ali Soueidan-->
<!-- Author URI: https//: www.alisoueidan.com-->

<div class="container">
    <div class="fileUploadInput">
    <label>✨ Upload File</label>
    <input type="file" />
    <button>+</button></div>
</div>

Lazercaveman
quelle
-2

Hier ist eine Möglichkeit, die ich kürzlich mit ein bisschen jQuery entdeckt habe

HTML Quelltext:

<form action="">
    <input type="file" name="file_upload" style="display:none" id="myFile">

    <a onclick="fileUpload()"> Upload a file </a>
</form>

Für den Javascript / jQuery-Teil:

<script>
function fileUpload() {
    $("#myFile").click();
}
</script>

In diesem Beispiel habe ich ein "Anker" -Tag eingefügt, um den Datei-Upload auszulösen. Sie können durch alles ersetzen, was Sie wollen. Denken Sie daran, das Attribut "onclick" mit der richtigen Funktion zu versehen.

Hoffe das hilft!

PS: Vergessen Sie nicht, jQuery von CDN oder einer anderen Quelle einzuschließen

Aakash
quelle
display: noneentfernt die Eingabe aus der Tabulatorreihenfolge. Die Verwendung <label>(wie von Tympanus gezeigt) ist weitaus semantischer und weniger hackig. Auch diese Frage wurde einige Jahre später erneut gestellt und hat dort viel bessere Antworten: Browserübergreifendes benutzerdefiniertes Styling für die Schaltfläche zum Hochladen von Dateien .
Dan Dascalescu