J'ajouterai ma propre réponse pour le faire comme je l'ai fait ... mais voici un exemple basé sur le bootstrap qui pourrait aider .. geniuscarrier.com/…
Vishnu Narang
Réponses:
235
Le style des entrées de fichier est notoirement difficile, car la plupart des navigateurs ne changeront pas l'apparence de CSS ou de javascript.
Même la taille de l'entrée ne répondra pas aux goûts de:
<inputtype="file"style="width:200px">
À la place, vous devrez utiliser l'attribut size:
<inputtype="file"size="60"/>
Pour tout style plus sophistiqué que cela (par exemple, changer l'apparence du bouton de navigation), vous devrez examiner l'approche délicate de superposer un bouton de style et une zone de saisie au-dessus de l'entrée de fichier native. L'article déjà mentionné par rm sur www.quirksmode.org/dom/inputfile.html est le meilleur que j'ai vu.
MISE À JOUR
Bien qu'il soit difficile de <input>styliser directement une balise, cela est facilement possible à l'aide d'une <label>balise. Voir la réponse ci-dessous de @JoshCrozier: https://stackoverflow.com/a/25825731/10128619
La réponse de @TLK Ryan ne fonctionnera pas dans IE lorsque vous essayez de faire des téléchargements iframe. Il vous donne une erreur d'accès refusé. Pour les téléchargements normaux, je conviens que c'est le plus simple!
frostymarvelous
3
Une solution beaucoup plus simple que celle de quirksmode est expliquée ici . Il suffit de mettre ce lien ici, car cette réponse est de toute façon une réponse de lien uniquement.
Joeytje50
10
Pour toute personne intéressée par une approche moderne, je suggère de regarder cette réponse . Il ne nécessite pas non plus JavaScript comme certaines des autres réponses.
Josh Crozier
3
@JoshCrozier a publié une solution incroyablement bien meilleure. Bat même les fausses solutions de mouseclicking :)
Lodewijk
1021
Vous n'avez pas besoin de JavaScript pour cela! Voici une solution multi-navigateur:
Voir cet exemple! - Il fonctionne dans Chrome / FF / IE - (IE10 / 9/8/7)
La meilleure approche serait d'avoir un élément d'étiquette personnalisé avec un forattribut attaché à un élément d'entrée de fichier caché . (L' forattribut de l'étiquette doit correspondre à celui de l'élément de fichier idpour que cela fonctionne).
1 - Il convient de noter que si vous masquez l'élément à l'aide display: none, il ne fonctionnera pas dans IE8 et les versions antérieures. Sachez également que jQuery validate ne valide pas les champs masqués par défaut. Si l'une de ces choses vous pose problème, voici deux méthodes différentes pour masquer l'entrée ( 1 , 2 ) qui fonctionne dans ces circonstances.
J'ai une question avec celui-ci cependant, lors de la sélection d'un fichier, comment pourrions-nous procéder, puis afficher le nom du fichier?
Richlewis
17
Comment afficher le nom du fichier sélectionné si display: noneest défini pour input[type=file]?
Sarthak Singhal
38
Excellente solution, mais vous avez réellement besoin de Javascript. Si vous souhaitez afficher le nom du fichier, comme d'autres personnes l'ont demandé, vous devez ajouter un intervalle entre l'étiquette et l'entrée masquée: <span id = "file-selected"> </span>. Mettez ensuite à jour la portée de l'événement change: $ ('# file-upload'). Bind ('change', function () {var fileName = ''; fileName = $ (this) .val (); $ ('# fichier sélectionné '). html (fileName);})
Sam
9
Vous devez utiliser position: absolute; left: -99999remau lieu de display: nonepour des raisons d'accessibilité. La plupart du temps, les lecteurs d'écran ne liront pas les éléments s'ils sont masqués à l'aide de la display: noneméthode.
Capsule
10
Je suis très surpris de constater que personne ne semble avoir envisagé l'accessibilité au clavier. labelles éléments ne sont pas accessibles au clavier, contrairement à buttons et inputs. L'ajout tabindexn'est pas une solution car le labelne sera toujours pas actionné quand il a le focus et l'utilisateur appuie sur Entrée. J'ai résolu ce problème en masquant visuellement l'entrée, afin qu'elle puisse toujours être focalisée, puis en utilisant :focus-withinle labelparent: jsbin.com/fokexoc/2/edit?html,css,output
Oliver Joseph Ash
195
suivez ces étapes, vous pouvez créer des styles personnalisés pour votre formulaire de téléchargement de fichiers:
c'est le simple formulaire HTML (veuillez lire les commentaires HTML que j'ai écrits ci-dessous)
<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>
puis utilisez ce script simple pour passer l'événement click à la balise d'entrée de fichier.
function getFile(){
document.getElementById("upfile").click();}
Vous pouvez désormais utiliser n'importe quel type de style sans vous soucier de la façon de modifier les styles par défaut.
Je le sais très bien car j'essaie de changer les styles par défaut depuis un mois et demi. croyez-moi, c'est très difficile car différents navigateurs ont des balises d'entrée de téléchargement différentes. Utilisez donc celui-ci pour créer vos formulaires de téléchargement de fichiers personnalisés. Voici le code de TÉLÉCHARGEMENT AUTOMATISÉ complet.
<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 -> Merci pour la recommandation .. ici j'ai utilisé un script java très simple, pas besoin d'utiliser des frameworks comme Jquery ou PrototypeJS.
teshguru
7
J'ai des problèmes pour envoyer le formulaire dans IE9. Je reçois une erreur «Accès refusé» qui tente de soumettre le formulaire via javascript. Si je clique sur le bouton soumettre via l'interface utilisateur, cela fonctionne. Y a-t-il un moyen de contourner cela?
Kevin
1
@kevin -> Veuillez essayer event.preventDefault () après document.myForm.submit (), j'ai apporté la modification au code ci-dessus.
teshguru
1
Fonctionne bien dans Chrome, Firefox, Safari et Opera - mais pas dans IE9. Dans IE9, j'obtiens la même erreur «Accès refusé» que @Kevin - et parfois juste un échec silencieux sans erreur.
daveywc
10
Dans IE10 (et éventuellement IE9, etc.), vous obtiendrez "Accès refusé" (ou aucune réponse de jQuery) si vous essayez de soumettre automatiquement le formulaire après avoir cliqué sur le bouton d'entrée de fichier via javascript. Cette méthode fonctionne donc pour styliser le bouton d'entrée de fichier tant que l'utilisateur est toujours celui qui soumet le formulaire. Cela m'a pris un certain temps pour trouver cela et je vois que d'autres ont également le même problème. Voir ceci pour plus d'informations stackoverflow.com/a/4335390/21579 .
Jeff Widmer
76
Cachez-le avec css et utilisez un bouton personnalisé avec $ (sélecteur) .cliquez sur () pour activer le bouton de navigation. puis définissez un intervalle pour vérifier la valeur du type d'entrée de fichier. l'intervalle peut afficher la valeur pour l'utilisateur afin que l'utilisateur puisse voir ce qui est téléchargé. l'intervalle s'effacera lorsque le formulaire sera soumis [EDIT] Désolé, j'ai été très occupé à mettre à jour ce post, voici un exemple
<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;});});
Juste curieux, cela fonctionne-t-il dans tous les navigateurs de nouvelle génération tels que Firefox, IE, Opera, Safari, Chrome, etc.?
Wh1T3h4Ck5
C'est la solution la plus simple pour moi! Au moins dans IE 9, Chrome 23 et FF 16 avec jQuery 1.7.2, donc avec les versions mises à jour, cela devrait fonctionner.
Dani BISHOP
Est-ce que quelqu'un sait comment changer le .new_Btn au cas où l'utilisateur aurait choisi une image. Maintenant, il montre juste la même classe. Quelqu'un sait comment suivre cela? Merci
Ando
2
@MehdiKaramosly, cela fonctionne même sur IE 6 - mais cela n'est vrai que jusqu'à jQuery 1.x , jQuery 2.x + ne prend pas en charge les anciens IE
jave.web
1
@Ando via Javascript / jQuery => la valeur de l'entrée de fichier est vide ou contient le chemin du fichier local => utilisez l'événement onchange et testez val () :) voir jsfiddle.net/ZrBPF
jave.web
55
Tous les moteurs de rendu génèrent automatiquement un bouton lors de la création d'un <input type="file">. Historiquement, ce bouton n'a pas été stylisé. Cependant, Trident et WebKit ont ajouté des crochets via des pseudo-éléments.
Trident
Depuis IE10, le bouton d'entrée de fichier peut être stylisé à l'aide du ::-ms-browsepseudo-élément. Fondamentalement, toutes les règles CSS que vous appliquez à un bouton standard peuvent être appliquées au pseudo-élément. Par exemple:
Cela s'affiche comme suit dans IE10 sur Windows 8:
WebKit
WebKit fournit un crochet pour son bouton d'entrée de fichier avec le ::-webkit-file-upload-buttonpseudo-élément. Encore une fois, presque toutes les règles CSS peuvent être appliquées, par conséquent l'exemple Trident fonctionnera également ici:
Lors du style d'une entrée de fichier, vous ne devez interrompre aucune des interactions natives fournies par l'entrée .
L' display: noneapproche rompt le support natif du glisser-déposer.
Pour ne rien casser, vous devez utiliser l' opacity: 0approche pour l'entrée et la positionner en utilisant un modèle relatif / absolu dans un wrapper.
En utilisant cette technique, vous pouvez facilement styliser une zone de clic / dépôt pour l'utilisateur et ajouter une classe personnalisée en javascript sur dragenterévénement pour mettre à jour les styles et donner à l'utilisateur un retour pour lui permettre de voir qu'il peut déposer un fichier.
HTML:
<labelfor="test"><div>Click or drop something here</div><inputtype="file"id="test"></label>
merci pour le post, comment cela fonctionne-t-il si l'attribut multiple = "multiple" est ajouté, j'ai fait glisser 2 images mais je
n'ai
Vous avez manqué le code ici. Il y a plus sur le violon. Quelle bibliothèque?
ctrl-alt-delor
Il y a juste du javascript sur le violon avec jQuery pour afficher les fichiers qui ont été déposés. C'est tout
kevcha
Après avoir implémenté et testé cette solution, elle ne semble pas fonctionner non plus dans Edge.
ChrisA
1
Ah ok, j'ai raté le wrapper avec la position relative dans votre réponse - Mon mauvais. Si l'entrée est inférieure aux dimensions de l'écran, le navigateur essaie de la faire défiler et, ce faisant, déplace le conteneur de défilement vers le haut de la page. Voici une démonstration: stackblitz.com/edit/input-file-overflow?file=style.css (tout simplement pas exactement comment la position absolue est la cause du comportement)
Tom
23
Je peux le faire avec du CSS pur en utilisant le code ci-dessous. J'ai utilisé bootstrap et font-awesome.
Vous pouvez envelopper votre type d'entrée = "fichier" à l'intérieur d'une étiquette pour l'entrée. Donnez un style à l'étiquette comme vous le souhaitez et masquez l'entrée avec display: none;
Voici une solution qui ne stylise pas vraiment l' <input type="file" />élément mais utilise à la place un <input type="file" />élément au-dessus d'autres éléments (qui peuvent être stylisés). L' <input type="file" />élément n'est pas vraiment visible par conséquent, l'illusion générale est d'un contrôle de téléchargement de fichiers bien conçu.
J'ai rencontré ce problème récemment et malgré la pléthore de réponses sur Stack Overflow, aucune ne semblait vraiment correspondre à la facture. Au final, j'ai fini par le personnaliser afin d'avoir une solution simple et élégante.
J'ai également testé cela sur Firefox, IE (11, 10 et 9), Chrome et Opera, iPad et quelques appareils Android.
$('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");}});
Assurez-vous de définir le style sur l'entrée lorsque vous êtes prêt: opacity: 0
vous ne pouvez pas définir display: nonecar il doit être cliquable. Mais vous pouvez le positionner sous le bouton "nouveau" ou rentrer sous autre chose avec z-index si vous préférez.
Configurez du jquery pour cliquer sur l'entrée réelle lorsque vous cliquez sur l'image.
cela échouera avec FF11 - raison: puisque vous ne pouvez pas influencer précisément la taille du champ de saisie (uniquement en utilisant la taille html) et le bouton (vous pouvez définir la hauteur à l'aide de css), si votre champ de saisie visible est plus grand que FF nous le fournit, vous se retrouvent avec une très grande zone aveugle - point de vue de l'utilisateur: dans la plupart des cas, il se plaindra que le téléchargement ne fonctionne pas, lorsqu'il est cliqué
Jeffz
2
Bonne idée mais cela ne fonctionnera pas sur IE. $ ('# the_real_file_input'). click () déclenchera une boîte de dialogue ouverte mais le fichier ne sera pas sélectionné dans un formulaire et le téléchargement échouera.
Tomas
11
Mettez le bouton de téléchargement de fichier sur votre joli bouton ou élément et cachez-le.
Très simple et fonctionnera sur n'importe quel navigateur
vous ne pouvez pas utiliser la méthode click () pour déclencher un événement pour le fichier de type d'entrée. la plupart du navigateur ne permet pas pour des raisons de sécurité
Mahi
même en utilisant jquery? Est-ce exact? comment le feriez-vous à la place?
style="visibility:hidden"est trop long, utilisez simplement hidden. En outre, click()cela fonctionne pour tous les navigateurs et il n'y a aucune raison de sécurité très fiable pour l'instant et sur tous les appareils, c'est la manière légitime et @Gianluca pour une utilisation classique de jQuerytrigger()
Thielicious
1
C'est précisément la solution que j'allais ajouter à cela! Cela fonctionne et vous pouvez l'afficher exactement comme vous le souhaitez. Fonctionne avec Chrome, en essayera d'autres.
markthewizard1234
7
la seule façon dont je peux penser est de trouver le bouton avec javascript après son rendu et de lui attribuer un style
J'utiliserais normalement du javascript simple pour personnaliser la balise d'entrée de fichier. Un champ de saisie caché, en cliquant sur le bouton, javascript appelle le champ caché, une solution simple sans aucun CSS ou tas de jquery.
vous ne pouvez pas utiliser la click()méthode pour déclencher l'événement pour le fichier de type d'entrée. la plupart du navigateur ne permet pas pour des raisons de sécurité.
Mahi
6
Ici, nous utilisons une étendue pour déclencher l'entrée du fichier de type et nous avons simplement personnalisé cette étendue , afin que nous puissions ajouter n'importe quel style en utilisant cette méthode.
Notez que nous utilisons une balise d'entrée avec l'option visibilité: cachée et la déclenchons dans l'intervalle.
Cela fonctionne très bien dans angulaire 2+. Je ne sais pas pourquoi il a été rejeté. Si vous utilisez angulaire, c'est la solution la plus simple disponible.
AndrewWhalan
4
SEULEMENT CSS
Utilisez ce très simple et FACILE
Html:
<label>Attach your screenshort</label><inputtype="file"multipleclass="choose">
Ne vous laissez pas berner par les "excellentes" solutions CSS uniquement qui sont en fait très spécifiques au navigateur, ou qui superposent le bouton stylé au-dessus du vrai bouton, ou qui vous obligent à utiliser un <label>au lieu d'un <button>, ou tout autre hack . JavaScript EST nécessaire pour le faire fonctionner pour une utilisation générale. Veuillez étudier comment gmail et DropZone le font si vous ne me croyez pas.
Stylisez simplement un bouton normal comme vous le souhaitez, puis appelez une simple fonction JS pour créer et lier un élément d'entrée masqué à votre bouton stylisé.
Remarquez comment le code ci-dessus le lie de nouveau après chaque fois que l'utilisateur choisit un fichier. Ceci est important car "onchange" n'est appelé que si l'utilisateur change le nom du fichier. Mais vous voudrez probablement obtenir le fichier chaque fois que l'utilisateur le fournira.
Pour être exact, l' labelapproche fonctionne, sauf qu'elle ne peut pas afficher le nom ou le chemin du fichier sélectionné. Donc, nécessairement, c'est le seul problème que JS a besoin de résoudre.
Hassan Baig
4
Solution de fichiers multiples avec nom de fichier converti
Comment afficher uniquement le nom du fichier et non le fakepathchemin?
Hassan Baig
3
Cette semaine, j'ai également dû personnaliser le bouton et afficher le nom de fichier sélectionné à côté, donc après avoir lu certaines des réponses ci-dessus (merci BTW), j'ai trouvé l'implémentation suivante:
Fondamentalement, je travaille avec la bibliothèque ng-file-upload, angulairement, je lie le nom de fichier à ma portée $ et lui donne la valeur initiale de 'Aucun fichier choisi', je lie également la fonction onFileSelect () à ma portée, donc quand un fichier est sélectionné, j'obtiens le nom de fichier en utilisant l'API ng-upload et l'assigne au $ scope.filename.
Simulez simplement un clic sur le <input>en utilisant la trigger()fonction lorsque vous cliquez sur un style <div>. J'ai créé mon propre bouton à partir d'un <div>, puis j'ai déclenché un clic sur inputlorsque je clique sur mon <div>. Cela vous permet de créer votre bouton comme vous le souhaitez car il s'agit d'un <div>et simule un clic sur votre fichier <input>. Ensuite, utilisez display: nonesur votre <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");});
La meilleure façon est d'utiliser le pseudo-élément: après ou: avant comme élément sur l'entrée de dé. Ensuite, stylisez ce pseudo-élément comme vous le souhaitez. Je vous recommande de faire comme style général pour tous les fichiers d'entrée comme suit:
Le meilleur moyen que j'ai trouvé est de le input type: filerégler sur display: none. Donnez-lui un id. Créez un bouton ou tout autre élément pour ouvrir l'entrée de fichier.
Ajoutez ensuite un écouteur d'événements (bouton) qui, lorsque vous cliquez dessus, simule un clic sur l'entrée du fichier d'origine. Comme cliquer sur un bouton nommé bonjour mais cela ouvre une fenêtre de fichier.
Exemple de code
//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")})
css peut faire beaucoup ici ... avec un peu de ruse ...
<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);
}
J'ai trouvé une méthode très simple pour basculer le bouton de fichier sur une image. Vous venez d'étiqueter une image et de la placer sur le bouton du fichier.
<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>
Lorsque vous cliquez sur l'image étiquetée, vous sélectionnez le bouton de fichier.
Cela masque le bouton du fichier d'entrée, mais sous le capot, il clique sur un autre bouton normal, que vous pouvez évidemment styler comme n'importe quel autre bouton. C'est la seule solution sans inconvénient en dehors d'un nœud DOM inutile. Grâce à display:none;, le bouton de saisie ne réserve aucun espace visible dans le DOM.
(Je ne sais plus à qui donner des accessoires pour cela. Mais j'ai eu cette idée quelque part ici sur Stackoverflow.)
Réponses:
Le style des entrées de fichier est notoirement difficile, car la plupart des navigateurs ne changeront pas l'apparence de CSS ou de javascript.
Même la taille de l'entrée ne répondra pas aux goûts de:
À la place, vous devrez utiliser l'attribut size:
Pour tout style plus sophistiqué que cela (par exemple, changer l'apparence du bouton de navigation), vous devrez examiner l'approche délicate de superposer un bouton de style et une zone de saisie au-dessus de l'entrée de fichier native. L'article déjà mentionné par rm sur www.quirksmode.org/dom/inputfile.html est le meilleur que j'ai vu.
MISE À JOUR
Bien qu'il soit difficile de
<input>
styliser directement une balise, cela est facilement possible à l'aide d'une<label>
balise. Voir la réponse ci-dessous de @JoshCrozier: https://stackoverflow.com/a/25825731/10128619la source
Vous n'avez pas besoin de JavaScript pour cela! Voici une solution multi-navigateur:
Voir cet exemple! - Il fonctionne dans Chrome / FF / IE - (IE10 / 9/8/7)
La meilleure approche serait d'avoir un élément d'étiquette personnalisé avec un
for
attribut attaché à un élément d'entrée de fichier caché . (L'for
attribut de l'étiquette doit correspondre à celui de l'élément de fichierid
pour que cela fonctionne).Comme alternative, vous pouvez également envelopper directement l'élément d'entrée de fichier avec une étiquette: (exemple)
En termes de style, il suffit de masquer 1 l'élément d'entrée à l'aide du sélecteur d'attribut .
Ensuite, tout ce que vous devez faire est de styliser l'
label
élément personnalisé . (exemple) .1 - Il convient de noter que si vous masquez l'élément à l'aide
display: none
, il ne fonctionnera pas dans IE8 et les versions antérieures. Sachez également que jQuery validate ne valide pas les champs masqués par défaut. Si l'une de ces choses vous pose problème, voici deux méthodes différentes pour masquer l'entrée ( 1 , 2 ) qui fonctionne dans ces circonstances.la source
display: none
est défini pourinput[type=file]
?position: absolute; left: -99999rem
au lieu dedisplay: none
pour des raisons d'accessibilité. La plupart du temps, les lecteurs d'écran ne liront pas les éléments s'ils sont masqués à l'aide de ladisplay: none
méthode.label
les éléments ne sont pas accessibles au clavier, contrairement àbutton
s etinput
s. L'ajouttabindex
n'est pas une solution car lelabel
ne sera toujours pas actionné quand il a le focus et l'utilisateur appuie sur Entrée. J'ai résolu ce problème en masquant visuellement l'entrée, afin qu'elle puisse toujours être focalisée, puis en utilisant:focus-within
lelabel
parent: jsbin.com/fokexoc/2/edit?html,css,outputsuivez ces étapes, vous pouvez créer des styles personnalisés pour votre formulaire de téléchargement de fichiers:
c'est le simple formulaire HTML (veuillez lire les commentaires HTML que j'ai écrits ci-dessous)
puis utilisez ce script simple pour passer l'événement click à la balise d'entrée de fichier.
Vous pouvez désormais utiliser n'importe quel type de style sans vous soucier de la façon de modifier les styles par défaut.
Je le sais très bien car j'essaie de changer les styles par défaut depuis un mois et demi. croyez-moi, c'est très difficile car différents navigateurs ont des balises d'entrée de téléchargement différentes. Utilisez donc celui-ci pour créer vos formulaires de téléchargement de fichiers personnalisés. Voici le code de TÉLÉCHARGEMENT AUTOMATISÉ complet.
la source
Cachez-le avec css et utilisez un bouton personnalisé avec $ (sélecteur) .cliquez sur () pour activer le bouton de navigation. puis définissez un intervalle pour vérifier la valeur du type d'entrée de fichier. l'intervalle peut afficher la valeur pour l'utilisateur afin que l'utilisateur puisse voir ce qui est téléchargé. l'intervalle s'effacera lorsque le formulaire sera soumis [EDIT] Désolé, j'ai été très occupé à mettre à jour ce post, voici un exemple
la source
HTML
CSS
jQuery
Violon : http://jsfiddle.net/M7BXC/
Vous pouvez également atteindre vos objectifs sans jQuery avec JavaScript normal.
Maintenant, le newBtn est lié au html_btn et vous pouvez styler votre nouveau btn comme vous le souhaitez: D
la source
Tous les moteurs de rendu génèrent automatiquement un bouton lors de la création d'un
<input type="file">
. Historiquement, ce bouton n'a pas été stylisé. Cependant, Trident et WebKit ont ajouté des crochets via des pseudo-éléments.Trident
Depuis IE10, le bouton d'entrée de fichier peut être stylisé à l'aide du
::-ms-browse
pseudo-élément. Fondamentalement, toutes les règles CSS que vous appliquez à un bouton standard peuvent être appliquées au pseudo-élément. Par exemple:Cela s'affiche comme suit dans IE10 sur Windows 8:
WebKit
WebKit fournit un crochet pour son bouton d'entrée de fichier avec le
::-webkit-file-upload-button
pseudo-élément. Encore une fois, presque toutes les règles CSS peuvent être appliquées, par conséquent l'exemple Trident fonctionnera également ici:Cela s'affiche comme suit dans Chrome 26 sur OS X:
la source
Si vous utilisez Bootstrap 3, cela a fonctionné pour moi:
Voir http://www.abeautifulsite.net/whipping-file-inputs-into-shape-with-bootstrap-3/
Ce qui produit le bouton d'entrée de fichier suivant:
Sérieusement, consultez http://www.abeautifulsite.net/whipping-file-inputs-into-shape-with-bootstrap-3/
la source
Exemple de travail ici avec prise en charge native du glisser-déposer: https://jsfiddle.net/j40xvkb3/
Lors du style d'une entrée de fichier, vous ne devez interrompre aucune des interactions natives fournies par l'entrée .
L'
display: none
approche rompt le support natif du glisser-déposer.Pour ne rien casser, vous devez utiliser l'
opacity: 0
approche pour l'entrée et la positionner en utilisant un modèle relatif / absolu dans un wrapper.En utilisant cette technique, vous pouvez facilement styliser une zone de clic / dépôt pour l'utilisateur et ajouter une classe personnalisée en javascript sur
dragenter
événement pour mettre à jour les styles et donner à l'utilisateur un retour pour lui permettre de voir qu'il peut déposer un fichier.HTML:
CSS:
Voici un exemple de travail (avec JS supplémentaire pour gérer les
dragover
événements et les fichiers déposés).https://jsfiddle.net/j40xvkb3/
J'espère que cela vous a aidé!
la source
Je peux le faire avec du CSS pur en utilisant le code ci-dessous. J'ai utilisé bootstrap et font-awesome.
la source
Vous pouvez envelopper votre type d'entrée = "fichier" à l'intérieur d'une étiquette pour l'entrée. Donnez un style à l'étiquette comme vous le souhaitez et masquez l'entrée avec display: none;
la source
Voici une solution qui ne stylise pas vraiment l'
<input type="file" />
élément mais utilise à la place un<input type="file" />
élément au-dessus d'autres éléments (qui peuvent être stylisés). L'<input type="file" />
élément n'est pas vraiment visible par conséquent, l'illusion générale est d'un contrôle de téléchargement de fichiers bien conçu.J'ai rencontré ce problème récemment et malgré la pléthore de réponses sur Stack Overflow, aucune ne semblait vraiment correspondre à la facture. Au final, j'ai fini par le personnaliser afin d'avoir une solution simple et élégante.
J'ai également testé cela sur Firefox, IE (11, 10 et 9), Chrome et Opera, iPad et quelques appareils Android.
Voici le lien JSFiddle -> http://jsfiddle.net/umhva747/
J'espère que cela t'aides!!!
la source
C'est simple avec jquery. Pour donner un exemple de code de la suggestion de Ryan avec une légère modification.
HTML de base:
Assurez-vous de définir le style sur l'entrée lorsque vous êtes prêt:
opacity: 0
vous ne pouvez pas définirdisplay: none
car il doit être cliquable. Mais vous pouvez le positionner sous le bouton "nouveau" ou rentrer sous autre chose avec z-index si vous préférez.Configurez du jquery pour cliquer sur l'entrée réelle lorsque vous cliquez sur l'image.
Maintenant, votre bouton fonctionne. Il suffit de couper et coller la valeur lorsqu'elle est modifiée.
Tah dah! Vous devrez peut-être analyser le val () pour quelque chose de plus significatif, mais vous devriez être prêt.
la source
Mettez le bouton de téléchargement de fichier sur votre joli bouton ou élément et cachez-le.
Très simple et fonctionnera sur n'importe quel navigateur
modes
la source
VISIBILITÉ: TRICK caché
Je fais généralement le
visibility:hidden
tourc'est mon bouton stylisé
il s'agit du bouton type d'entrée = fichier. Notez la
visibility:hidden
règlec'est le bit JavaScript pour les coller ensemble. Ça marche
la source
style="visibility:hidden"
est trop long, utilisez simplementhidden
. En outre,click()
cela fonctionne pour tous les navigateurs et il n'y a aucune raison de sécurité très fiable pour l'instant et sur tous les appareils, c'est la manière légitime et @Gianluca pour une utilisation classique de jQuerytrigger()
la seule façon dont je peux penser est de trouver le bouton avec javascript après son rendu et de lui attribuer un style
vous pourriez également regarder ce résumé
la source
J'utiliserais normalement du javascript simple pour personnaliser la balise d'entrée de fichier. Un champ de saisie caché, en cliquant sur le bouton, javascript appelle le champ caché, une solution simple sans aucun CSS ou tas de jquery.
la source
click()
méthode pour déclencher l'événement pour le fichier de type d'entrée. la plupart du navigateur ne permet pas pour des raisons de sécurité.Ici, nous utilisons une étendue pour déclencher l'entrée du fichier de type et nous avons simplement personnalisé cette étendue , afin que nous puissions ajouter n'importe quel style en utilisant cette méthode.
Notez que nous utilisons une balise d'entrée avec l'option visibilité: cachée et la déclenchons dans l'intervalle.
Référence
la source
C'est une bonne façon de le faire avec le téléchargement de matériel / fichier angulaire. Vous pouvez faire de même avec un bouton d'amorçage.
Remarque que j'ai utilisé à la
<a>
place de<button>
cela permet aux événements de clic de bouillonner.la source
SEULEMENT CSS
Utilisez ce très simple et FACILE
Html:
Css:
la source
Peut-être beaucoup d'awns. Mais j'aime ça en CSS pur avec des fa-boutons:
Violon: https://jsfiddle.net/zoutepopcorn/v2zkbpay/1/
la source
Ne vous laissez pas berner par les "excellentes" solutions CSS uniquement qui sont en fait très spécifiques au navigateur, ou qui superposent le bouton stylé au-dessus du vrai bouton, ou qui vous obligent à utiliser un
<label>
au lieu d'un<button>
, ou tout autre hack . JavaScript EST nécessaire pour le faire fonctionner pour une utilisation générale. Veuillez étudier comment gmail et DropZone le font si vous ne me croyez pas.Stylisez simplement un bouton normal comme vous le souhaitez, puis appelez une simple fonction JS pour créer et lier un élément d'entrée masqué à votre bouton stylisé.
Remarquez comment le code ci-dessus le lie de nouveau après chaque fois que l'utilisateur choisit un fichier. Ceci est important car "onchange" n'est appelé que si l'utilisateur change le nom du fichier. Mais vous voudrez probablement obtenir le fichier chaque fois que l'utilisateur le fournira.
la source
label
approche fonctionne, sauf qu'elle ne peut pas afficher le nom ou le chemin du fichier sélectionné. Donc, nécessairement, c'est le seul problème que JS a besoin de résoudre.Solution de fichiers multiples avec nom de fichier converti
EXEMPLE Bootstrap
HTML:
1. JS avec jQuery:
2. JS sans jQuery
la source
Voici une solution, qui montre également le nom de fichier choisi: http://jsfiddle.net/raft9pg0/1/
HTML:
JS:
CSS:
la source
fakepath
chemin?Cette semaine, j'ai également dû personnaliser le bouton et afficher le nom de fichier sélectionné à côté, donc après avoir lu certaines des réponses ci-dessus (merci BTW), j'ai trouvé l'implémentation suivante:
HTML:
CSS
Javascript (angulaire)
Fondamentalement, je travaille avec la bibliothèque ng-file-upload, angulairement, je lie le nom de fichier à ma portée $ et lui donne la valeur initiale de 'Aucun fichier choisi', je lie également la fonction onFileSelect () à ma portée, donc quand un fichier est sélectionné, j'obtiens le nom de fichier en utilisant l'API ng-upload et l'assigne au $ scope.filename.
la source
Simulez simplement un clic sur le
<input>
en utilisant latrigger()
fonction lorsque vous cliquez sur un style<div>
. J'ai créé mon propre bouton à partir d'un<div>
, puis j'ai déclenché un clic surinput
lorsque je clique sur mon<div>
. Cela vous permet de créer votre bouton comme vous le souhaitez car il s'agit d'un<div>
et simule un clic sur votre fichier<input>
. Ensuite, utilisezdisplay: none
sur votre<input>
.la source
La meilleure façon est d'utiliser le pseudo-élément: après ou: avant comme élément sur l'entrée de dé. Ensuite, stylisez ce pseudo-élément comme vous le souhaitez. Je vous recommande de faire comme style général pour tous les fichiers d'entrée comme suit:
la source
Le meilleur moyen que j'ai trouvé est de le
input type: file
régler surdisplay: none
. Donnez-lui unid
. Créez un bouton ou tout autre élément pour ouvrir l'entrée de fichier.Ajoutez ensuite un écouteur d'événements (bouton) qui, lorsque vous cliquez dessus, simule un clic sur l'entrée du fichier d'origine. Comme cliquer sur un bouton nommé bonjour mais cela ouvre une fenêtre de fichier.
Exemple de code
javascript
la source
css peut faire beaucoup ici ... avec un peu de ruse ...
:: référence :: http://site-o-matic.net/?viewpost=19
-une abbaye
la source
J'ai trouvé une méthode très simple pour basculer le bouton de fichier sur une image. Vous venez d'étiqueter une image et de la placer sur le bouton du fichier.
Lorsque vous cliquez sur l'image étiquetée, vous sélectionnez le bouton de fichier.
la source
Seule cette approche vous donne toute la flexibilité! ES6 / VanillaJS!
html:
javascript:
Cela masque le bouton du fichier d'entrée, mais sous le capot, il clique sur un autre bouton normal, que vous pouvez évidemment styler comme n'importe quel autre bouton. C'est la seule solution sans inconvénient en dehors d'un nœud DOM inutile. Grâce à
display:none;
, le bouton de saisie ne réserve aucun espace visible dans le DOM.(Je ne sais plus à qui donner des accessoires pour cela. Mais j'ai eu cette idée quelque part ici sur Stackoverflow.)
la source