Designazione di un tipo di input = pulsante "file"


Risposte:


235

Lo styling degli input dei file è notoriamente difficile, poiché la maggior parte dei browser non cambierà l'aspetto né da CSS né da JavaScript.

Anche la dimensione dell'input non risponderà a simili di:

<input type="file" style="width:200px">

Invece, dovrai usare l'attributo size:

<input type="file" size="60" />

Per uno stile più sofisticato di quello (ad esempio cambiando l'aspetto del pulsante Sfoglia) dovrai guardare l'approccio complicato di sovrapporre un pulsante con stile e una casella di input sopra l'input del file nativo. L'articolo già citato da rm su www.quirksmode.org/dom/inputfile.html è il migliore che abbia mai visto.

AGGIORNARE

Sebbene sia difficile <input>definire direttamente un tag, questo è facilmente possibile con l'aiuto di un <label>tag. Vedi la risposta di seguito da @JoshCrozier: https://stackoverflow.com/a/25825731/10128619


7
Ho appena trovato una soluzione jquery basata su questo script qui: blog.vworld.at/2008/08/21/…
mtness

1
@TLK La risposta di Ryan non funzionerà in IE quando si tenta di eseguire upload iframe. Ti dà un errore di accesso negato. Per i normali caricamenti, sono d'accordo che sia il più semplice!
frostymarvelous

3
Una soluzione molto più semplice di quirksmode è spiegata qui . Basta inserire quel link qui, poiché questa risposta è sostanzialmente una risposta solo al link comunque.
Joeytje50

10
Per chiunque sia interessato ad un approccio moderno, suggerirei di guardare questa risposta . Non richiede JavaScript come alcune delle altre risposte.
Josh Crozier,

3
@JoshCrozier ha pubblicato una soluzione follemente molto migliore. Perfino batte soluzioni fasulle del mouse :)
Lodewijk,

1019

Non hai bisogno di JavaScript per questo! Ecco una soluzione cross-browser:

Vedi questo esempio!- Funziona in Chrome / FF / IE - (IE10 / 9/8/7)

L'approccio migliore sarebbe quello di avere un elemento etichetta personalizzato con un forattributo collegato a un elemento di input di file nascosto . ( Per poter funzionare, l' forattributo dell'etichetta deve corrispondere a quello dell'elemento file id).

<label for="file-upload" class="custom-file-upload">
    Custom Upload
</label>
<input id="file-upload" type="file"/>

In alternativa, puoi anche avvolgere direttamente l'elemento di input del file con un'etichetta: (esempio)

<label class="custom-file-upload">
    <input type="file"/>
    Custom Upload
</label>

In termini di stile, basta nascondere 1 l'elemento di input usando il selettore di attributi .

input[type="file"] {
    display: none;
}

Quindi tutto ciò che devi fare è dare uno stile labelall'elemento personalizzato . (esempio) .

.custom-file-upload {
    border: 1px solid #ccc;
    display: inline-block;
    padding: 6px 12px;
    cursor: pointer;
}

1 - Vale la pena notare che se si nasconde l'elemento usando display: none, non funzionerà in IE8 e sotto. Inoltre, tieni presente che jQuery validate non convalida i campi nascosti per impostazione predefinita. Se una di queste cose è un problema per te, qui ci sono due diversi metodi per nascondere l'input ( 1 , 2 ) che funziona in queste circostanze.


43
Ho una domanda con questo, tuttavia, quando si seleziona un file come procedere e visualizzare il nome del file?
Richlewis

17
Come visualizzare il nome del file selezionato se display: noneè impostato per input[type=file]?
Sarthak Singhal,

38
Ottima soluzione, ma in realtà hai bisogno di JavaScript. Se si desidera visualizzare il nome del file, come è stato chiesto da altre persone, è necessario aggiungere un intervallo tra l'etichetta e l'input nascosto: <span id = "file-selected"> </span>. Quindi aggiorna l'intervallo sull'evento change: $ ('# file-upload'). Bind ('change', function () {var fileName = ''; fileName = $ (this) .val (); $ ('# file-selected '). html (fileName);})
Sam

9
È necessario utilizzare position: absolute; left: -99999remanziché display: noneper motivi di accessibilità. Il più delle volte, gli screen reader non leggono gli elementi se sono nascosti usando il display: nonemetodo.
Capsula

10
Sono molto sorpreso di scoprire che nessuno sembra aver considerato l'accessibilità della tastiera. labelelementi non sono accessibili dalla tastiera, a differenza buttons e inputs. L'aggiunta tabindexnon è una soluzione perché labelnon verrà ancora eseguita l'azione quando è attiva e l'utente preme invio. Ho risolto questo nascondendo visivamente l'input, in modo che possa ancora essere focalizzato, e quindi usando :focus-withinsul labelgenitore: jsbin.com/fokexoc/2/edit?html,css,output
Oliver Joseph Ash

195

segui questi passaggi quindi puoi creare stili personalizzati per il tuo modulo di caricamento file:

  1. questo è il semplice modulo HTML (leggi i commenti HTML che ho scritto qui sotto)

    <form action="#type your action here" method="POST" enctype="multipart/form-data">
      <div id="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!-->
      <div style='height: 0px;width:0px; overflow:hidden;'><input id="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-->
      <input type="submit" value='submit' >
    </form>
  2. quindi utilizza questo semplice script per passare l'evento click al file tag di input.

    function getFile(){
         document.getElementById("upfile").click();
    }

    Ora puoi utilizzare qualsiasi tipo di stile senza preoccuparti di come modificare gli stili predefiniti.

Lo so molto bene perché ho cercato di cambiare gli stili predefiniti per un mese e mezzo. credimi, è molto difficile perché browser diversi hanno tag di input di caricamento diversi. Quindi usa questo per creare i tuoi moduli di caricamento file personalizzati. Ecco il codice di CARICAMENTO AUTOMATICO completo.

function getFile() {
  document.getElementById("upfile").click();
}

function sub(obj) {
  var file = obj.value;
  var fileName = file.split("\\");
  document.getElementById("yourBtn").innerHTML = fileName[fileName.length - 1];
  document.myForm.submit();
  event.preventDefault();
}
#yourBtn {
  position: relative;
  top: 150px;
  font-family: calibri;
  width: 150px;
  padding: 10px;
  -webkit-border-radius: 5px;
  -moz-border-radius: 5px;
  border: 1px dashed #BBB;
  text-align: center;
  background-color: #DDD;
  cursor: pointer;
}
<form action="#type your action here" method="POST" enctype="multipart/form-data" name="myForm">
  <div id="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-->
  <div style='height: 0px;width: 0px; overflow:hidden;'><input id="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>


6
@ user1053263 -> Grazie per la raccomandazione .. qui ho usato uno script java molto semplice, non c'è bisogno di usare framework come Jquery o PrototypeJS.
teshguru,

7
Ho problemi a inviare il modulo in IE9. Ricevo un errore "Accesso negato" che tenta di inviare il modulo tramite javascript. Se faccio clic sul pulsante Invia tramite l'interfaccia utente, funziona. C'è un lavoro in giro per questo?
Kevin,

1
@kevin -> Prova event.preventDefault () dopo document.myForm.submit (), ho apportato la modifica al codice sopra.
teshguru,

1
Funziona bene su Chrome, Firefox, Safari e Opera, ma non su IE9. In IE9 ricevo lo stesso errore "Accesso negato" di @Kevin - e talvolta solo un errore silenzioso senza errori.
daveywc,

10
In IE10 (e possibilmente IE9, ecc.) Otterrai "Accesso negato" (o nessuna risposta da jQuery) se provi e invia automaticamente il modulo dopo aver fatto clic sul pulsante di input del file tramite javascript. Quindi questo metodo funziona per lo styling del pulsante di input del file, purché l'utente sia ancora quello che invia il modulo. Mi ci è voluto un po 'per trovarlo e vedo che anche altri hanno lo stesso problema. Vedi questo per maggiori informazioni stackoverflow.com/a/4335390/21579 .
Jeff Widmer,

76

Nascondilo con CSS e usa un pulsante personalizzato con $ (selettore) .click () per attivare il pulsante Sfoglia. quindi impostare un intervallo per verificare il valore del tipo di input del file. l'intervallo può visualizzare il valore per l'utente in modo che l'utente possa vedere cosa viene caricato. l'intervallo verrà cancellato quando viene inviato il modulo [EDIT] Spiacente, sono stato molto impegnato, intendevo aggiornare questo post, ecco un esempio

<form action="uploadScript.php" method="post" enctype="multipart/form-data">
<div>
    <!-- filename to display to the user -->
    <p id="file-name" class="margin-10 bold-10"></p>

    <!-- Hide this from the users view with css display:none; -->
    <input class="display-none" id="file-type" type="file" size="4" name="file"/>

    <!-- Style this button with type image or css whatever you wish -->
    <input id="browse-click" type="button" class="button" value="Browse for files"/>

    <!-- submit button -->
    <input type="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);
        return false;
    });
});

7
Si noti che se si utilizza in questo modo si romperà in Internet Explorer perché è un'eccezione di sicurezza ..
Rejinderi

1
grazie il suggerimento. Quando uso IE di solito ha un layout separato da tutto il resto. ODIO IE. ma semplifico tutto in IE.
Ryan,

1
Con FF20, $ ('# file-type'). Click () non sembra far apparire il dialg "Scegli il file", in effetti non succede nulla. Qualche idea?
Andig

2
Prova a utilizzare il metodo di trigger in jquery. Anche .live è cambiato in .on () nel nuovo jquery
Ryan il

1
una volta impostato l'intervallo a che punto posso cancellarlo? altrimenti sparerà costantemente
Dave Haigh il

60

HTML

<div class="new_Btn">SelectPicture</div><br>
<input id="html_btn" type='file'" /><br>

CSS

.new_Btn {
// your css propterties
}

#html_btn {
 display:none;
}

jQuery

$('.new_Btn').bind("click" , function () {
        $('#html_btn').click();
    });
//edit: 6/20/2014: Be sure to use ".on" not ".bind" for newer versions of jQuery

Fiddle : http://jsfiddle.net/M7BXC/

Puoi raggiungere anche i tuoi obiettivi senza jQuery con JavaScript normale.

Ora newBtn è collegato a html_btn e puoi modellare il tuo nuovo btn come desideri: D


1
Solo curioso, funziona in tutti i browser di nuova generazione come Firefox, IE, Opera, Safari, Chrome, ecc?
Wh1T3h4Ck5

Questa è la soluzione più semplice per me! Almeno in IE 9, Chrome 23 e FF 16 con jQuery 1.7.2, quindi con le versioni aggiornate dovrebbe funzionare.
Dani VESCOVO

Qualcuno sa come modificare il .new_Btn nel caso in cui l'utente abbia scelto un'immagine. Ora mostra solo la stessa classe. Qualcuno sa come rintracciarlo? Grazie
Ando,

2
@MehdiKaramosly funziona anche su IE 6 - ma questo è vero solo fino a jQuery 1.x , jQuery 2.x + non supporta i vecchi IE
jave.web

1
@Ando tramite Javascript / jQuery => il valore dell'input del file è vuoto o contiene il percorso del file locale => usa l'evento onchange e prova per val () :) vedi jsfiddle.net/ZrBPF
jave.web

55

Tutti i motori di rendering generano automaticamente un pulsante quando <input type="file">viene creato. Storicamente, quel pulsante è stato completamente fuori moda. Tuttavia, Trident e WebKit hanno aggiunto hook tramite pseudo-elementi.

Tridente

A partire da IE10, il pulsante di input del file può essere disegnato usando lo ::-ms-browsepseudo-elemento. Fondamentalmente, qualsiasi regola CSS che si applica a un pulsante normale può essere applicata allo pseudo-elemento. Per esempio:

::-ms-browse {
  background: black;
  color: red;
  padding: 1em;
}
<input type="file">

Viene visualizzato come segue in IE10 su Windows 8:

Viene visualizzato come segue in IE10 su Windows 8:

WebKit

WebKit fornisce un hook per il pulsante di input del file con lo ::-webkit-file-upload-buttonpseudo-elemento. Ancora una volta, è possibile applicare praticamente qualsiasi regola CSS, quindi l'esempio Trident funzionerà anche qui:

::-webkit-file-upload-button {
  background: black;
  color: red;
  padding: 1em;
}
<input type="file">

Viene visualizzato come segue in Chrome 26 su OS X:

Viene visualizzato come segue in Chrome 26 su OS X:


Non ci sono possibilità di styling speciali per i programmi basati su Gecko come Firefox.
Rispondi il

2
Nella tua risposta, usando css, come nascondere la parola "Nessun file scelto" nel tag <input type = file>. Per favore, commentami.
user2086641

Non ho idea, scusa
Anselm


1
Nel caso in cui qualcuno volesse giocare con gli stili, ho aggiunto un jsfidde qui: jsfiddle.net/peter_drinnan/r0gq6kw2
Peter Drinnan,

26

Se stai usando Bootstrap 3, questo ha funzionato per me:

Vedi http://www.abeautifulsite.net/whipping-file-inputs-into-shape-with-bootstrap-3/

.btn-file {
  position: relative;
  overflow: hidden;
}
.btn-file input[type=file] {
  position: absolute;
  top: 0;
  right: 0;
  min-width: 100%;
  min-height: 100%;
  font-size: 100px;
  text-align: right;
  filter: alpha(opacity=0);
  opacity: 0;
  outline: none;
  background: white;
  cursor: inherit;
  display: block;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />

<span class="btn btn-primary btn-file">
    Browse...<input type="file">
</span>

Che produce il seguente pulsante di input del file:

Pulsante di esempio

Seriamente, controlla http://www.abeautifulsite.net/whipping-file-inputs-into-shape-with-bootstrap-3/


2
Ciò preserva la funzionalità di trascinamento della selezione che è eccezionale :), la maggior parte delle risposte non accetta i file rilasciati.
A1rPun

25

Esempio di lavoro qui con supporto nativo per trascinamento della selezione: https://jsfiddle.net/j40xvkb3/

Durante lo styling di un input di file, non è necessario interrompere alcuna interazione nativa fornita dall'input .

L' display: noneapproccio interrompe il supporto nativo di trascinamento della selezione.

Per non rompere nulla, dovresti usare il opacity: 0 approccio per l'input e posizionarlo utilizzando il modello relativo / assoluto in un wrapper.

Usando questa tecnica, puoi facilmente definire una zona click / drop per l'utente e aggiungere una classe personalizzata in javascript su dragenterevento per aggiornare gli stili e fornire all'utente un feedback per fargli vedere che può rilasciare un file.

HTML:

<label for="test">
  <div>Click or drop something here</div>
  <input type="file" id="test">
</label>

CSS:

input[type="file"] {
  position: absolute;
  left: 0;
  opacity: 0;
  top: 0;
  bottom: 0;
  width: 100%;
}

div {
  position: absolute;
  left: 0;
  top: 0;
  bottom: 0;
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  background: #ccc;
  border: 3px dotted #bebebe;
  border-radius: 10px;
}

label {
  display: inline-block;
  position: relative;
  height: 100px;
  width: 400px;
}

Ecco un esempio funzionante (con JS aggiuntivo per gestire i dragoverfile di eventi e eliminati).

https://jsfiddle.net/j40xvkb3/

Spero che questo abbia aiutato!


grazie per il post, come funziona se viene aggiunto l'attributo multiple = "multiple", ho trascinato 2 immagini ma ho visto il percorso solo per il 1 °
PirateApp il

Hai perso il codice qui. C'è di più sul violino. Quale biblioteca?
ctrl-alt-delor,

C'è solo un po 'di javascript sul violino con jQuery per mostrare i file che sono stati eliminati. Questo è tutto
kevcha il

Dopo aver implementato questa soluzione e testata ulteriormente, non sembra funzionare neanche in Edge.
ChrisA

1
Ah ok, mi mancava il wrapper con la posizione relativa nella tua risposta - Mio male. Se l'input è al di sotto delle dimensioni dello schermo, il browser tenta di scorrere fino ad esso e, facendo ciò, sposta il contenitore di scorrimento nella pagina. Ecco una dimostrazione: stackblitz.com/edit/input-file-overflow?file=style.css (semplicemente non dimostrando esattamente come l'assoluta posizione sia la causa del comportamento)
Tom

23

Sono in grado di farlo con CSS puro utilizzando il codice seguente. Ho usato bootstrap e font-awesome.

<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css" rel="stylesheet" />

<label class="btn btn-default btn-sm center-block btn-file">
  <i class="fa fa-upload fa-2x" aria-hidden="true"></i>
  <input type="file" style="display: none;">
</label>



12

Ecco una soluzione che non disegna realmente l' <input type="file" />elemento, ma usa invece un <input type="file" />elemento sopra altri elementi (che può essere disegnato). Il<input type="file" /> elemento non è realmente visibile, quindi, l'illusione generale è di un controllo del caricamento dei file ben disegnato.

Ho riscontrato questo problema di recente e nonostante la pletora di risposte su Stack Overflow, nessuno sembrava davvero adatto al conto. Alla fine, ho finito per personalizzare questo in modo da avere una soluzione semplice ed elegante.

Ho anche testato questo su Firefox, IE (11, 10 e 9), Chrome e Opera, iPad e alcuni dispositivi Android.

Ecco il link JSFiddle -> http://jsfiddle.net/umhva747/

$('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");
    }
});
body {
    background-color:Black;
}

div.upload {
    background-color:#fff;
    border: 1px solid #ddd;
    border-radius:5px;
    display:inline-block;
    height: 30px;
    padding:3px 40px 3px 3px;
    position:relative;
    width: auto;
}

div.upload:hover {
    opacity:0.95;
}

div.upload input[type="file"] {
    display: input-block;
    width: 100%;
    height: 30px;
    opacity: 0;
    cursor:pointer;
    position:absolute;
    left:0;
}
.uploadButton {
    background-color: #425F9C;
    border: none;
    border-radius: 3px;
    color: #FFF;
    cursor:pointer;
    display: inline-block;
    height: 30px;
    margin-right:15px;
    width: auto;
    padding:0 20px;
    box-sizing: content-box;
}

.fileName {
    font-family: Arial;
    font-size:14px;
}

.upload + .uploadButton {
    height:38px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<form action="" method="post" enctype="multipart/form-data">
    <div class="upload">
        <input type="button" class="uploadButton" value="Browse" />
        <input type="file" name="upload" accept="image/*" id="fileUpload" />
        <span class="fileName">Select file..</span>
    </div>
    <input type="button" class="uploadButton" value="Upload File" />
</form>

Spero che sia di aiuto!!!


2
Una soluzione ingegnosamente intelligente a questo malvagio file shenanigans di stile per il caricamento di file.
rmcsharry,

Il meglio di tutto. Perfetto!!
Karra,

11

Questo è semplice con jquery. Per dare un esempio di codice di Ryan suggerimento con una leggera modifica.

HTML di base:

<div id="image_icon"></div>
<div id="filename"></div>
<input id="the_real_file_input" name="foobar" type="file">

Assicurati di impostare lo stile sull'input quando sei pronto: opacity: 0 non puoi impostaredisplay: none perché deve essere selezionabile. Ma puoi posizionarlo sotto il pulsante "nuovo" o infilare sotto qualcos'altro con z-index se preferisci.

Imposta alcuni jquery per fare clic sull'input reale quando fai clic sull'immagine.

$('#image_icon').click(function() {
    $('#the_real_file_input').click();
});

Ora il tuo pulsante funziona. Basta tagliare e incollare il valore quando viene modificato.

$('input[type=file]').bind('change', function() {
    var str = "";
    str = $(this).val();
    $("#filename").text(str);
}).change();

Tah dah! Potrebbe essere necessario analizzare val () in qualcosa di più significativo, ma dovresti essere pronto.


1
questo fallirà con FF11 - motivo: poiché non puoi influenzare con precisione la dimensione del campo di input (solo usando la dimensione html) e il pulsante (puoi impostare l'altezza usando css), se il tuo campo di input visibile è più grande di quello che ci fornisce l'FF originale, tu sono lasciati con un'area cieca molto grande - punto di vista dell'utente: nella maggior parte dei casi si lamenterà che il caricamento non funziona, quando si fa clic
Jeffz

2
Buona idea ma questo non funzionerà su IE. $ ('# the_real_file_input'). click () attiverà la finestra di dialogo aperta ma il file non verrà selezionato in un modulo e il caricamento fallirà.
Tomas,

11

Metti il ​​pulsante di caricamento del file sul tuo bel pulsante o elemento e nascondilo.

Molto semplice e funzionerà su qualsiasi browser

<div class="upload-wrap">
    <button type="button" class="nice-button">upload_file</button>
    <input type="file" name="file" class="upload-btn">
</div>

stili

.upload-wrap {
    position: relative;
}

.upload-btn {
    position: absolute;
    left: 0;
    opacity: 0;
}

8

VISIBILITÀ: TRUCCO nascosto

Di solito vado per il visibility:hiddentrucco

questo è il mio pulsante in stile

<div id="uploadbutton" class="btn btn-success btn-block">Upload</div>

questo è il tipo di input = pulsante file. Nota la visibility:hiddenregola

<input type="file" id="upload" style="visibility:hidden;">

questo è il bit JavaScript per incollarli insieme. Funziona

<script>
 $('#uploadbutton').click(function(){
    $('input[type=file]').click();
 });
 </script>

1
non è possibile utilizzare il metodo click () per generare l'evento per il file del tipo di input. la maggior parte del browser non consente motivi di sicurezza
Mahi,

anche usando jquery? è corretto? come lo faresti invece?
Gianluca Ghettini,


style="visibility:hidden"è troppo lungo, basta usare hidden. Inoltre, click()funziona con qualsiasi browser e non esiste un motivo di sicurezza molto affidabile per ora e su qualsiasi dispositivo è il modo legittimo e @Gianluca per il classico uso di jQuerytrigger()
Thielicious

1
Questa è precisamente la soluzione che stavo per aggiungere a questo! Funziona e puoi visualizzarlo esattamente come vuoi. Funziona con Chrome, ne proverò altri.
markthewizard1234,

7

l'unico modo a cui riesco a pensare è trovare il pulsante con javascript dopo che è stato reso e assegnargli uno stile

potresti anche dare un'occhiata a questo commento


CSS puro, senza JavaScript, funziona su tutti i browser fino a ie7 - fantastico!
Simon Steinberger,

7
<input type="file" name="media" style="display-none" onchange="document.media.submit()">

Normalmente userei javascript semplice per personalizzare il tag di input del file. Un campo di input nascosto, facendo clic sul pulsante, javascript chiama il campo nascosto, soluzione semplice senza alcun CSS o mazzo di jquery.

<button id="file" onclick="$('#file').click()">Upload File</button>

1
non è possibile utilizzare il click()metodo per generare l'evento per il file del tipo di input. la maggior parte del browser non consente per motivi di sicurezza.
Mahi,

6

Qui usiamo un intervallo per attivare l'input del file di tipo e semplicemente lo abbiamo personalizzato , in modo da poter aggiungere qualsiasi stile in questo modo.

Si noti che utilizziamo il tag di input con visibilità: opzione nascosta e attiviamolo nell'intervallo.

.attachFileSpan{
color:#2b6dad;
cursor:pointer;
}
.attachFileSpan:hover{
text-decoration: underline;
}
<h3> Customized input of type file </h3>
<input id="myInput" type="file" style="visibility:hidden"/>

        <span title="attach file" class="attachFileSpan" onclick="document.getElementById('myInput').click()">
        Attach file
        </span>

Riferimento


5

Questo è un bel modo per farlo con il caricamento di file materiale / angolare. Puoi fare lo stesso con un pulsante bootstrap.

Nota che ho usato <a>invece di <button>questo consente agli eventi di clic di fare il bubble up.

<label>
    <input type="file" (change)="setFile($event)" style="display:none" />

    <a mat-raised-button color="primary">
      <mat-icon>file_upload</mat-icon>
      Upload Document
    </a>

  </label>

1
Funziona alla grande in angolare 2+. Non sono sicuro del perché sia ​​stato votato in ribasso. Se stai usando angolare questa è la soluzione più semplice disponibile.
AndrewWhalan,

4

SOLO CSS

Usa questo molto semplice e FACILE

html:

<label>Attach your screenshort</label>
                <input type="file" multiple class="choose">

Css:

.choose::-webkit-file-upload-button {
    color: white;
    display: inline-block;
    background: #1CB6E0;
    border: none;
    padding: 7px 15px;
    font-weight: 700;
    border-radius: 3px;
    white-space: nowrap;
    cursor: pointer;
    font-size: 10pt;
}

4

Forse un sacco di tendalini. Ma mi piace questo in puro CSS con pulsanti fa:

.divs {
    position: relative;
    display: inline-block;
    background-color: #fcc;
}

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

.icons {
    position:relative;
}
<div class="divs">
<input type='file' id='image' class="inputs">
<i class="fa fa-image fa-2x icons"></i>
</div>

<div class="divs">
<input type='file' id='book' class="inputs">
<i class="fa fa-book fa-5x icons"></i>
</div>
<br><br><br>
<div class="divs">
<input type='file' id='data' class="inputs">
<i class="fa fa-id-card fa-3x icons"></i>
</div>





<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"/>

Fiddle: https://jsfiddle.net/zoutepopcorn/v2zkbpay/1/


4

Non lasciarti ingannare da "grandi" soluzioni solo CSS che sono in realtà molto specifiche per browser, o che sovrappongono il pulsante con stile sopra il pulsante reale, o che ti costringono a usare un <label>invece di un <button>, o qualsiasi altro simile hack . JavaScript è necessario per farlo funzionare per uso generale. Per favore studia come lo fanno gmail e DropZone se non mi credi.

Disegna semplicemente un pulsante normale come preferisci, quindi chiama una semplice funzione JS per creare e collegare un elemento di input nascosto al tuo pulsante con stile.

<!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>

Nota come il codice sopra riportato lo ricollega ogni volta che l'utente sceglie un file. Questo è importante perché "onchange" viene chiamato solo se l'utente cambia il nome file. Ma probabilmente vuoi ottenere il file ogni volta che l'utente lo fornisce.


1
Per l'esattezza, l' labelapproccio funziona, tranne per il fatto che non può mostrare il nome o il percorso del file selezionato. Quindi, necessariamente parlando, questo è l'unico problema che uno ha bisogno di JS per risolvere.
Hassan Baig,

4

Soluzione a più file con nome file convertito

Bootstrap ESEMPIO

HTML:

<div>
  <label class="btn btn-primary search-file-btn">
    <input name="file1" type="file" style="display:None;"> <span>Choose file</span>
  </label>
  <span>No file selected</span>
</div>

<div>
  <label class="btn btn-primary search-file-btn">
    <input name="file2" type="file" style="display:None;"> <span>Choose file</span>
  </label>
  <span>No file selected</span>
</div>

1. JS con jQuery:

$().ready(function($){
    $('.search-file-btn').children("input").bind('change', function() {
    var fileName = '';
    fileName = $(this).val().split("\\").slice(-1)[0];
    $(this).parent().next("span").html(fileName);
  })
});

2. JS senza jQuery

Array.prototype.forEach.call(document.getElementsByTagName('input'), function(item) {
  item.addEventListener("change", function() {
    var fileName = '';
    fileName = this.value.split("\\").slice(-1)[0];
    this.parentNode.nextElementSibling.innerHTML = fileName;
  });
});

3

Ecco una soluzione che mostra anche il nome del file scelto: http://jsfiddle.net/raft9pg0/1/

HTML:

<label for="file-upload" class="custom-file-upload">Chose file</label>
<input id="file-upload" type="file"/>
File: <span id="file-upload-value">-</span>

JS:

$(function() {
    $("input:file[id=file-upload]").change(function() {
        $("#file-upload-value").html( $(this).val() );
    });
});

CSS:

input[type="file"] {
    display: none;
}

.custom-file-upload {
      background: #ddd;
      border: 1px solid #aaa;
      border-top: 1px solid #ccc;
      border-left: 1px solid #ccc;
      -moz-border-radius: 3px;
      -webkit-border-radius: 3px;
      border-radius: 3px;
      color: #444;
      display: inline-block;
      font-size: 11px;
      font-weight: bold;
      text-decoration: none;
      text-shadow: 0 1px rgba(255, 255, 255, .75);
      cursor: pointer;
      margin-bottom: 20px;
      line-height: normal;
      padding: 8px 10px; }

Come visualizzare solo il nome del file e non il fakepathpercorso?
Hassan Baig,

3

Questa settimana ho anche dovuto personalizzare il pulsante e visualizzare il nome del file selezionato a parte, quindi dopo aver letto alcune delle risposte sopra (Grazie BTW) ho trovato la seguente implementazione:

HTML:

<div class="browse">
<label id="uploadBtn" class="custom-file-upload">Choose file
<input type="file" name="fileInput" id="fileInput" accept=".yaml" ngf-select ngf-change="onFileSelect($files)" />
</label>
<span>{{fileName}}</span>
</div>

CSS

   input[type='file'] {
    color: #a1bbd5;
    display: none;

}

.custom-file-upload {
    border: 1px solid #a1bbd5;
    display: inline-block;
    padding: 2px 8px;
    cursor: pointer;
}

label{
    color: #a1bbd5;
    border-radius: 3px;
}

Javascript (angolare)

app.controller('MainCtrl', function($scope) {

        $scope.fileName = 'No file chosen';

          $scope.onFileSelect = function ($files) {
          $scope.selectedFile = $files;
          $scope.fileName = $files[0].name;
    };
});

Fondamentalmente sto lavorando con lib di ng-file-upload, angolarmente-saggio sto legando il nome del file al mio $ scope e dandogli il valore iniziale di 'Nessun file scelto', sto anche legando la funzione onFileSelect () a il mio ambito quindi quando un file viene selezionato ottengo il nome file usando l'API ng-upload e lo assegno al $ scope.filename.


3

Simula semplicemente un clic sul <input>usando la trigger()funzione quando fai clic su uno stile <div>. Ho creato il mio pulsante da un <div>e quindi attivato un clic sul inputquando si fa clic su my <div>. Ciò ti consente di creare il tuo pulsante come preferisci perché è a <div>e simula un clic sul tuo file <input>. Quindi utilizzare display: nonesul tuo <input>.

// div styled as my load file button
<div id="simClick">Load from 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");
});

3

Il modo migliore è usare lo pseudo elemento: after o: before come elemento overt il de input. Quindi disegna lo pseudo elemento come desideri. Ti consiglio di fare come stile generale per tutti i file di input come segue:

input {
  height: 0px;
  outline: none;
}

input[type="file"]:before {
  content: "Browse";
  background: #fff;
  width: 100%;
  height: 35px;
  display: block;
  text-align: left;
  position: relative;
  margin: 0;
  margin: 0 5px;
  left: -6px;
  border: 1px solid #e0e0e0;
  top: -1px;
  line-height: 35px;
  color: #b6b6b6;
  padding-left: 5px;
  display: block;
}

3

Il modo migliore che ho trovato è di input type: fileimpostarlo su display: none. Dagli unid . Crea un pulsante o qualsiasi altro elemento che desideri aprire l'input del file.

Quindi aggiungere un listener di eventi su di esso (pulsante) che, quando si fa clic, simula un clic sull'input del file originale. Come fare clic su un pulsante chiamato ciao ma si apre una finestra di file.

Codice di esempio

//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")
    })

2

css può fare molto qui ... con un po 'di inganno ...

<div id='wrapper'>
  <input type='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);
}

:: riferimento :: http://site-o-matic.net/?viewpost=19

-abbazia


2

Ho trovato un metodo molto semplice per cambiare il pulsante file in un'immagine. Basta etichettare un'immagine e posizionarla sopra il pulsante file.

<html>
<div id="File button">
    <div style="position:absolute;">
        <!--This is your labeled image-->
        <label for="fileButton"><img src="ImageURL"></label>
    </div>
    <div>
        <input type="file" id="fileButton"/>
    </div>
</div>
</html>

Quando si fa clic sull'immagine etichettata, si seleziona il pulsante file.


2

Solo questo approccio ti dà tutta la flessibilità! ES6 / VanillaJS!

html:

<input type="file" style="display:none;"></input>
<button>Upload file</button>

javascript:

document.querySelector('button').addEventListener('click', () => {
  document.querySelector('input[type="file"]').click();
});

Ciò nasconde il pulsante del file di input, ma sotto il cofano lo fa clic da un altro pulsante normale, che puoi ovviamente stile come qualsiasi altro pulsante. Questa è l'unica soluzione senza svantaggio a parte un inutile nodo DOM. Grazie a display:none;, il pulsante di input non riserva spazio visibile nel DOM.

(Non so più a chi dare oggetti per questo. Ma ho avuto quell'idea da qualche parte qui su StackOverflow.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.