Also available in: English
Il y a quelques temps de cela, lorsque je faisais des recherches sur les boutons radios et checkboxes personnalisables en CSS, j’avais en tête de faire la même chose avec le champ « fichier » (input-file
). J’avais donc fait un essai en CSS pur. Puis j’avais laissé l’idée de côté.
Finalement je suis revenu dessus hier pour compléter l’idée de base par une information visuelle textuelle. En effet si vous essayez cette version de l’input-file personnalisé en CSS, vous verrez que rien ne vous indique qu’une image est sélectionnée par vos soins. Ce qui est plutôt gênant pour un utilisateur.
J’ai alors cherché à le faire en JS (vanilla, pas de jQuery), et ce n’est pas si complexe que cela.
Le code HTML
Pour rendre la chose la plus « naturelle » possible, nous allons nous contenter d’un élément label
et d’un input:file
.
Le label sera utilisé comme élément « sensible », comme un bouton, pour activer le champ de sélection d’un fichier.
Je renseigne ici volontairement plusieurs classes pour manipuler les éléments en CSS et JS sans dépendre des éléments HTML. Le paragraphe en fin de code permettra d’accueillir un peu d’informations sur le fichier.
Quelques styles
Le conteneur va être positionné en relative
afin de pouvoir placer l’input en position absolue.
On va donc se retrouver avec le label du champ servant de « déclencheur » (sensible au clic et touches du clavier) et le champ de recherche de fichiers par dessus mais transparent, servant lui aussi de déclencheur.
Nous allons faire en sorte de travailler la marge interne (padding) de ce champ afin de le superposer au label, rendant ainsi sensibles le label et le champ invisible sur une surface à peu près identique.
Pour le reste des choix graphiques (couleurs, typographie, etc) je vous laisse faire, c’est secondaire pour ce que je vous propose.
Retour visuel textuel grâce à JavaScript
Ce code est proposé en JS vanilla (c’est à dire sans Framework JS), il est possible de l’adapter à votre framework préféré si vous en utilisez un dans votre projet.
Les actions sont relativement simples ici, j’espère que les commentaires vous suffiront 🙂
Le résultat et la présentation ici sont très sommaires, il vous appartiendra ensuite de ruser pour ajouter des petits effets visuels : une icône de fichier joint sur le bouton par exemple, ou une personnalisation du retour textuel suivant la langue, etc.
Démonstration Fork on CodePen.io
Quelques articles pour aller plus loin
Si vous ne le saviez pas, vous pouvez également styler certains éléments de formulaire comme les boutons radio, les checkbox, ou même l’élément progress en HTML5.
Bonne lecture !
Salut.
Bien joué, je garde sous le coude 🙂
Merci.
Merci Greg 🙂
Merci pour le partage.
Comment faire si j’ai quatre input file à traités ?
Merci
Hello,
Il faut adapter le code en utilisant querySelectorAll qui permet de récupérer chaque item.
Un petit article de Dew de chez Alsacréations pour explication.
Bonne lecture.
Bjr
Merci pour ta réponse.
Cela fait depuis hier que j’essaye mais je n’y arrive pas.
Je maîtrise pas du tout le javascript.
Pourrais tu me mettre un exemple pour deux boutons par exemple ?
Merci par avance.
Hello,
Navré pour le temps de réponse. Difficile d’être sur tous les fronts en même temps.
Un code comme ceci devrait faire l’affaire, même s’il n’est pas optimal car il dépend fortement de la structure du code HTML. Mais ça marche :
Multiple Custom Inputs:file
Bon dimanche.
slt !!!
merci pour le script mais pourquoi quand on utilse le document.getElementById(‘qlqChose’);le focus ne passe plus
parce le querySelector ne passe pas dans les vieux navigateurs
merci,
Merci pour cette astuce, ça déchire 🙂
Un grand merci pour ce code ! Je n’y connais rien en java et j’ai réussi à cacher ce vilain bouton « Choisissez un fichier » pour un design collant avec mon site, grâce à toi. 🙂
Pour ceux qui ne veulent pas avoir « C:\fakepath\ » devant le nom du fichier (sous chrome par exemple), il suffit de modifier la dernière ligne du code javascript par :
» the_return.innerHTML = this.value.replace(« C:\\fakepath\\ », « »); «
Bonjour,
Tout d’abord merci pour ce super tuto.
Ensuite je voudrais savoir comment faire pour masquer le nom du fichier sélectionné et le remplacer par une image ?
Merci d’avance
Bonjour,
Merci 🙂
Tu souhaites afficher une miniature du fichier sélectionné ? Si c’est le cas c’est plus complexe car ça demande de réellement charger le fichier sur ton serveur, au moins dans un dossier temporaire, en AJAX. Un poil plus long que ce tutoriel quand même :p
PHP et AJAX sont tes amis ?
Bon week-end.
Merci de la réponse mais ce n’est pas cet effet là que je souhaites faire.
Je voudrais juste insérer une image comme une croix rouge quand le fichier n’est pas sélectionné et un carré bleu par exemple quand celui ci est sélectionné ? (le carré bleu remplacerai donc le nom du fichier sélectionné)
Merci d’avance en espérant avoir été clair 😀
Merci pour cette excellente source d’inspiration
Vraiment super ! Je suis tombé dessus par hasard, et ça faisait des années que je souhaitais personnaliser un champ « file », et voilà 🙂
Merci à toi, je comprends mieux maintenant !
Cet article m’a beaucoup aidé merci ..
Merci beaucoup. Je dois dire que c’est seulement en ce jour même où je vous écris que je tombe sur votre site. Je n’ai pas encore vraiment eu le temps de parcourir tous les essentiels tutoriels ou articles que vous avez mis sur votre site, mais déjà vue que j’ai trouvé dans un premier temps satisfaction à ce que je cherchais, j’en suis apriori pour l’instant comblé de joie.
Merci de plus pour le travail que vous abattez pour les communautés du monde entier !
Merci beaucoup pour votre message. C’est toujours plaisant de savoir que mes jours, semaines et mois passés sur ce blog apporte de la joie 🙂
Excellent week-end à vous 🙂