210 votes

Comment personnaliser <input type="file"> ?

Est-il possible de modifier l'apparence de <input type="file"> ?

0 votes

La raison pour laquelle le champ de texte est présent est qu'il montre à l'utilisateur le chemin d'accès au fichier après qu'il l'ait parcouru et sélectionné.

0 votes

Oooppss... il semble que ce soit la façon dont Firefox le gère...

0 votes

Pour que les choses soient claires, même après avoir recherché le fichier, ils doivent encore soumettre le formulaire à l'aide d'un bouton d'envoi.

317voto

alex Points 186293

On ne peut pas modifier grand-chose sur le input[type=file] le contrôle lui-même.

Puisque le fait de cliquer sur un label correctement apparié avec une entrée l'activera/focusera, nous pouvons utiliser un élément label pour déclencher la boîte de dialogue de navigation du système d'exploitation.

Voici comment vous pouvez le faire

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

La feuille de style en cascade (CSS) du contrôle de formulaire le rendra invisible et ne prendra pas de place dans la mise en page du document, mais il sera tout de même existe afin qu'elle puisse être activée par l'intermédiaire du label .

Si vous voulez afficher le chemin choisi par l'utilisateur après la sélection, vous pouvez écouter la commande change avec JavaScript et ensuite lire le chemin que le navigateur met à votre disposition (pour des raisons de sécurité, il peut mentir pour vous indiquer le chemin exact). Une façon de rendre la chose plus agréable pour l'utilisateur final est d'utiliser simplement le nom de base du chemin d'accès qui est renvoyé (de sorte que l'utilisateur voit simplement le nom de fichier choisi).

Il existe un grand guide par Tympanus pour avoir coiffé ça.

2 votes

Je pense que ces styles sont meilleurs, étant donné que nous souhaitons que la boîte de dialogue de sélection de fichier s'ouvre en cliquant n'importe où sur le conteneur : #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; }

2 votes

Utilisation de <label> (comme l'a montré Tympanus) est beaucoup plus sémantique et moins bricolé. En outre, cette question a été posée à nouveau quelques années plus tard et les réponses y sont bien meilleures : personnalisation du style du bouton de téléchargement de fichiers pour tous les navigateurs .

1 votes

@DanDascalescu Je suis d'accord, si je me souviens bien (en 2011), il avait des problèmes avec IE, probablement 6 ou 7. Je vais modifier cette réponse pour l'amener dans le futur maintenant.

39voto

Konservin Points 242

Quelque chose comme ça peut-être ?

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

1 votes

Dans ce cas, ie 9 ne permet pas d'envoyer le formulaire dans une iframe.

0 votes

@x-yuri que voulez-vous dire ?

2 votes

Autant que je me souvienne, ie 9 (et probablement d'autres) ne permet pas d'envoyer le formulaire à iframe, parce que l'utilisateur n'a pas cliqué sur le fichier d'entrée.

33voto

Uyntx Xyntu Points 61
  <label for="fusk">dsfdsfsd</label>
  <input id="fusk" type="file" name="photo" style="display: none;">

pourquoi pas ? ^_^

Voir l'exemple aquí

4 votes

@InakiIbarrolaAtxa pouvez-vous fournir des données à l'appui de cette affirmation ?

3 votes

Il n'y a pas de style dans Chrome 51. Utilisation de <label> (comme l'a montré Tympanus) est une solution sémantiquement correcte. En outre, cette question a été posée à nouveau quelques années plus tard et les réponses y sont bien meilleures : personnalisation du style du bouton de téléchargement de fichiers pour tous les navigateurs .

10voto

AllTheTime Points 438

Dans webkit, vous pouvez essayer ceci...

input[type="file"]::-webkit-file-upload-button{
   /* style goes here */
}

0 votes

Connaissez-vous une solution similaire pour firefox ? Existe-t-elle ? )

7voto

Juri Karasjov Points 51

Tout d'abord, c'est un conteneur :

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

Le second, c'est un style CSS, si vous voulez réaliser plus de personnalisation, il suffit de garder les yeux ouverts :)

.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;
}

Cet exemple n'a pas de style pour le texte à l'intérieur du bouton, il dépend de la taille de la police, il suffit de corriger les valeurs de hauteur et de padding-top pour le conteneur.

0 votes

Je me demande pourquoi tu ne le fais pas right: 0 au lieu de left: 0 ? De cette façon, vous auriez la zone de texte de ie hors du conteneur. Cliquer sur la zone de texte n'ouvre pas la boîte de dialogue de sélection de fichier. De plus, je crois que le fait d'agrandir le fichier d'entrée avec font-size est une bien meilleure idée, que d'utiliser width y height .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X