web-dev-qa-db-fra.com

type d'entrée = bouton afficher uniquement le fichier

Y at-il un moyen de style (ou script) <input type=file /> élément pour avoir visible que le bouton "Parcourir" sans champ de texte?

Merci

Edit : Juste pour préciser pourquoi j'ai besoin de cela. J'utilise un code de téléchargement de plusieurs fichiers à partir de http://www.morningz.com/?p=5 et il n'a pas besoin de champ de texte de saisie car il n'a jamais de valeur. Le script ajoute simplement le fichier nouvellement sélectionné à la collection sur la page. Cela semblerait beaucoup mieux sans champ de texte, si c'est possible.

144
Andrija
<input type="file" id="selectedFile" style="display: none;" />
<input type="button" value="Browse..." onclick="document.getElementById('selectedFile').click();" />

Cela fonctionnera sûrement je l'ai utilisé dans mes projets. J'espère que cela aide :)

145
shiba

J'avais une sacrée occasion d'essayer d'accomplir cela. Je ne voulais pas utiliser une solution Flash et aucune des bibliothèques jQuery que j'ai consultées n'était fiable sur tous les navigateurs.

Je suis venu avec ma propre solution, qui est complètement implémentée en CSS (à l'exception du changement de style onclick pour que le bouton apparaisse 'cliqué').

Vous pouvez essayer un exemple de travail ici: http://jsfiddle.net/VQJ9V/307/ (testé en FF 7 , IE 9, Safari 5, Opera 11 et Chrome 14)

Cela fonctionne en créant une entrée de gros fichier (avec une taille de police: 50px), puis en l'enveloppant dans un div ayant une taille fixe et un débordement: hidden. L'entrée n'est alors visible que par cette "fenêtre" div. Une image ou une couleur d’arrière-plan peut être donnée au div, du texte peut être ajouté et l’entrée peut être rendue transparente pour révéler l’arrière-plan du div:

HTML:

<div class="inputWrapper">
    <input class="fileInput" type="file" name="file1"/>
</div>

CSS:

.inputWrapper {
    height: 32px;
    width: 64px;
    overflow: hidden;
    position: relative;
    cursor: pointer;
    /*Using a background color, but you can use a background image to represent a button*/
    background-color: #DDF;
}
.fileInput {
    cursor: pointer;
    height: 100%;
    position:absolute;
    top: 0;
    right: 0;
    z-index: 99;
    /*This makes the button huge. If you want a bigger button, increase the font size*/
    font-size:50px;
    /*Opacity settings for all browsers*/
    opacity: 0;
    -moz-opacity: 0;
    filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0)
}

Faites-moi savoir s'il y a des problèmes et je vais essayer de les résoudre.

79
ampersandre

J'ai passé ma journée aujourd'hui à faire en sorte que cela fonctionne. J'ai trouvé aucune des solutions ici travaillant chacun de mes scénarios.

Puis je me suis rappelé que j'avais vu un exemple pour le téléchargement de fichier JQuery sans zone de texte. Donc, ce que j'ai fait, c'est que j'ai pris leur exemple et l'ai réduit à la partie pertinente.

Cette solution fonctionne au moins pour IE et FF et peut être entièrement stylisée. Dans l'exemple ci-dessous, l'entrée du fichier est masquée sous le bouton "Ajouter des fichiers".

<html>

<head>
    <title>jQuery File Upload Example</title>
    <style type="text/css">
        .myfileupload-buttonbar input
        {
            position: absolute;
            top: 0;
            right: 0;
            margin: 0;
            border: solid transparent;
            border-width: 0 0 100px 200px;
            opacity: 0.0;
            filter: alpha(opacity=0);
            -o-transform: translate(250px, -50px) scale(1);
            -moz-transform: translate(-300px, 0) scale(4);
            direction: ltr;
            cursor: pointer;
        }
        .myui-button
        {
            position: relative;
            cursor: pointer;
            text-align: center;
            overflow: visible;
            background-color: red;
            overflow: hidden;
        }
    </style>
</head>
<body>
    <div id="fileupload" >
        <div class="myfileupload-buttonbar ">
            <label class="myui-button">
                <span >Add Files</span>
                <input id="file" type="file" name="files[]" />
            </label>
        </div>
    </div>
</body>
</html>
51
tmanthey

Cachez l'élément de fichier d'entrée et créez un bouton visible qui déclenchera l'événement click de ce fichier d'entrée.

Essaye ça:

CSS

#file { width:0; height:0; } 

HTML:

<input type='file' id='file' name='file' />
<button id='btn-upload'>Upload</button>

JAVASCRIPT (jQuery):

$(function(){
    $('#btn-upload').click(function(e){
        e.preventDefault();
        $('#file').click();}
    );
});
25
jojo

Cachez la balise du fichier d'entrée avec css, ajoutez une étiquette et affectez-la au bouton d'entrée. L'étiquette sera cliquable et lorsque vous cliquerez dessus, la boîte de dialogue de fichier s'ouvrira.

<input type="file" name="imageUpload" id="imageUpload" class="hide"/> 
<label for="imageUpload" class="button-style">Select file</label>

Ajoutez le style à l'étiquette en tant que bouton.
démonstration en direct

17
Suresh Pattu

Cela va être très difficile. Le problème avec le type d'entrée de fichier est qu'il se compose généralement de deux éléments visuels, tout en étant traité comme un seul élément DOM. Ajoutez à cela que plusieurs navigateurs ont leur propre apparence pour le fichier en entrée, et vous êtes prêt pour le cauchemar. Voir ceci article sur quirksmode.org à propos des bizarreries de l’entrée de fichier. Je vous garantis que cela ne vous rendra pas heureux (je parle d'expérience).

[MODIFIER]

En fait, je pense que vous pourriez vous en tirer en plaçant votre entrée dans un élément conteneur (comme un div) et en ajoutant une marge négative à l'élément. Cacher efficacement la partie de la zone de texte hors écran. Une autre option consisterait à utiliser la technique décrite dans l'article que j'ai lié pour essayer de l'appeler comme un bouton.

15
Erik van Brakel

Correctif pour fonctionner dans tous les navigateurs RÉSOLU:

      <input type = "button" value = "Choose image" 
       onclick ="javascript:document.getElementById('imagefile').click();">
      <input id = "imagefile" type="file" style='visibility: hidden;' name="img"/>

J'ai testé en FF, Chrome et IE - fonctionne bien, styles appliqués également: D

12
Javier Reyes

J'ai essayé de mettre en œuvre les deux solutions principales et cela a été une énorme perte de temps pour moi. En fin de compte, l’application de cette classe .css a résolu le problème ...

input[type='file'] {
  color: transparent;
}

Terminé! super propre et super simple ...

8
nikotromus

Un autre moyen facile de le faire. Créez une balise "input type file" en HTML et masquez-la. Puis cliquez sur un bouton et formatez-le selon vos besoins. Après cela, utilisez javascript/jquery pour cliquer par programme sur la balise d’entrée lorsque vous cliquez sur le bouton.

HTML: -

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

JavaScript: -

document.getElementById('button').addEventListener("click", function() {
    document.getElementById('file').click();
});

jQuery: -

$('#button').click(function(){
    $('#file').click();
});

CSS: -

#button
{
    background-color: blue;
    color: white;
}

Voici un violon JS qui fonctionne pour le même: - http://jsfiddle.net/32na3/

8
divyenduz

J'ai utilisé une partie du code recommandé ci-dessus et après de nombreuses heures de retard, je suis finalement arrivé à une solution sans sac CSS.

Vous pouvez le lancer ici - http://jsfiddle.net/WqGph/

mais a ensuite trouvé une meilleure solution - http://jsfiddle.net/XMMc4/5/

 <input type = "button" value = "Choose image #2" 
   onclick ="javascript:document.getElementById('imagefile').click();">
       <input id = "imagefile" type="file" style='display:none;' name="img" value="none"/>see jsfiddle code for examples<br/>
7
GoreOle

Voici mon bon vieux remède:

<input type="file" id="myFile" style="display:none;" />
<button type="button" onclick="document.getElementById('myFile').click();">Browse</button>

Au moins, cela a fonctionné dans Safari.

Clair et simple.

6
Zooza S

Vous pouvez attribuer à l'élément d'entrée une opacité de police de 0. Cela masquera le champ de texte sans masquer le bouton "Choisir les fichiers".

Aucun javascript requis, effacez le navigateur en traversée aussi loin que IE 9

Par exemple.,

input {color: rgba(0, 0, 0, 0);}
4
nicholmen

HTML:

<input type="file" name="upload" id="upload" style="display:none"></input>
    <button  id="browse">Upload</button>

JQUERY

 $(document).ready(function(){
        $("#browse").click(function(){
        $("#upload").click();
        });
 });

J'espère que ça marche :)

4
Anoop saju

Vous pouvez étiqueter une image pour que, lorsque vous cliquez dessus, l'événement de clic du bouton soit déclenché. Vous pouvez simplement rendre le bouton normal invisible:

<form>
    <label for="fileButton"><img src="YourSource"></label>    <!--You don't have to put an image here, it can be anything you like-->
    <input type="file" id="fileButton" style="display:none;"/>
</form>

Cela a fonctionné pour moi sur tous les navigateurs et est très facile à utiliser.

4
D-Inventor

Vous pouvez répartir l'événement click sur une entrée de fichier cachée comme ceci:

<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;" >Click to upload!</div>
        <!-- hide input[type=file]!-->
        <div style='height: 0px;width:0px; overflow:hidden;'><input id="upfile" type="file" value="upload"/></div>
        <input type="submit" value='submit' >
    </form>

    <script type="text/javascript">
        var btn = document.getElementById("yourBtn");
        var upfile = document.getElementById("upfile"); 
        btn.addEventListener('click',function(){
                if(document.createEvent){
                        var ev = document.createEvent('MouseEvents');
                        ev.initEvent('click',true,false);
                        upfile.dispatchEvent(ev);
                }else{
                        upfile.click();
                }
        });
    
    </script>
4
jiang min

Ive une solution vraiment hacky avec cela ...

<style type="text/css"> 
    input[type="file"]
    { 
        width: 80px;        
    } 
</style>

<input id="File1" type="file" />

Le problème est que l’attribut width qui cache le champ de texte variera d’un navigateur à l’autre, d’un thème Windows à un autreXP, etc. Peut-être que tu peux travailler avec ça? ...

3
user110714

Cela fonctionne pour moi:

input[type="file"]  {
    color: white!important;
}
3
newbie

Je sais que ceci est un ancien message, mais un moyen simple de faire disparaître le texte consiste à définir la couleur du texte sur celle de votre arrière-plan.

par exemple, si votre arrière-plan de saisie de texte est blanc, alors:

input[type="file"]{
color:#fff;
}

Cela n’affectera pas le texte Choisir un fichier qui sera toujours noir en raison du navigateur.

3
Keleko

ma solution est juste de le placer dans une div comme "druveen" dit, cependant j'ajoute mon propre style de bouton à la div (le fait ressembler à un bouton avec un: survol) et je viens de définir le style "opacity: 0;" à l'entrée. Travaille un charme pour moi, espère que cela fait la même chose pour vous.

2
ThomasG

Je viens de styler un fichier d'entrée avec une largeur de 85px, et le champ de texte a disparu du tout

2
user2133061

Ce code HTML apparaît uniquement sur le bouton Télécharger un fichier

<form action="/action_page.php">
    <input type="button" id="id" value="Upload File"  onclick="document.getElementById('file').click();" />
    <input type="file" style="display:none;" id="file" name="file" onchange="this.form.submit()"/>  
</form>
2
Anil Shetty

Il existe plusieurs options valables ici, mais je pensais donner ce que j’avais proposé en essayant de résoudre un problème similaire. http://jsfiddle.net/5RyrG/1/

<span class="btn fileinput-button">
    <span>Import Field(s)</span>
    <input id="fileupload" type="file" name="files[]" onchange="handleFiles(this.files)" multiple>
</span>
<div id="txt"></div>

function handleFiles(files){
    $('#txt').text(files[0].name);  
}
1
Matthew Pautzke

Toutes ces réponses sont jolies, mais CSS ne fonctionnera pas car il n’est pas identique sur tous les navigateurs et appareils, la première réponse que j’ai écrite fonctionnera dans tout sauf Safari. Pour le faire fonctionner dans tous les navigateurs, il doit être créé de manière dynamique, puis recréé à chaque fois que vous souhaitez effacer le texte saisi:

    var imageDiv = document.createElement("div");   
    imageDiv.setAttribute("id", "imagediv");
    imageDiv.style.cssText = 'position:relative; vertical-align: bottom;';  
    var imageText = document.createTextNode("Append Image:");
    var newLine = document.createElement("br"); 
    var image = document.createElement("input");    
    image.setAttribute("type", "file");
    image.setAttribute("id", "images");
    image.setAttribute("name", "images[]");     
    image.setAttribute("multiple", "multiple");
    imageDiv.appendChild(imageText); 
    imageDiv.appendChild(newLine); 
    imageDiv.appendChild(image); 
    questionParagraph.appendChild(imageDiv);
1
user1965301

J'ai écrit ceci:

<form action='' method='POST' name='form-upload-image' id='form-upload-image' enctype='multipart/form-data'>

    <div style="width: 0; height: 0; overflow: hidden;">
        <input type="file" name="input-file" id="input-file" onchange="this.files.length > 0 ? document.getElementById('form-upload-image').submit():null;" />
    </div>
    
</form>

<img src="image.jpg" style="cursor: pointer;" onclick="document.getElementById('input-file').click();" />

Fonctionne bien dans tous les navigateurs, pas de jQuery, pas de CSS.

1
MadMaxIII

La réponse de tmanthey est assez bonne, sauf que vous ne pouvez pas jouer avec border-width dans Firefox v20. Si vous voyez le lien (démo, ne peut pas vraiment montrer ici), ils ont résolu le problème en utilisant font-size = 23px, transformer: translate (-300px, 0px) scale (4) pour que Firefox puisse obtenir le bouton plus gros.

D'autres solutions utilisant .click () sur un div différent sont inutiles si vous voulez en faire une zone de saisie glisser-déposer.

1
Balint Karakai

Alors voici la meilleure façon de faire ceci FOR ALL BROWSERS:

Oubliez le CSS!

<p>Append Image:</p> 
<input type="button" id="clickImage" value="Add Image" />
<input type="file" name="images[]" id="images" multiple />

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" charset="utf-8"></script>

<script>
$('#images').hide();        
$('#clickImage').click( function() {    
    $('#images').trigger('click');  
});
</script>
1
user1965301

Résolu avec le code suivant:

<div style="overflow: hidden;width:83px;"> <input style='float:right;' name="userfile" id="userfile" type="file"/> </div>

1
druveen

Voici une version simplifiée de la solution populaire de @ ampersandre qui fonctionne dans tous les principaux navigateurs. Balisage Asp.NET

<asp:TextBox runat="server" ID="FilePath" CssClass="form-control"
    style="float:left; display:inline; margin-right:5px; width:300px"
    ReadOnly="True" ClientIDMode="Static" />
<div class="inputWrapper">
    <div id="UploadFile" style="height:38px; font-size:16px; 
      text-align:center">Upload File</div>
    <div>
      <input name="FileUpload" id="FileInput" runat="server" 
             type="File" />
    </div>
  </div>
  <asp:Button ID="UploadButton" runat="server" 
    style="display:none" OnClick="UploadButton_Click" />
</div>
<asp:HiddenField ID="hdnFileName" runat="server" ClientIDMode="Static" />

Code JQuery

$(document).ready(function () {

   $('#UploadFile').click(function () {
       alert('UploadFile clicked');
       $('[id$="FileInput"]').trigger('click');
   });

   $('[id$="FileInput"]').change(function (event) {
       var target = event.target;
       var tmpFile = target.files[0].name;
       alert('FileInput changed:' + tmpFile);
       if (tmpFile.length > 0) {
          $('#hdnFileName').val(tmpFile);
       }
       $('[id$="UploadButton"]').trigger('click');
   });
});

code css

.inputWrapper {
height: 38px;
width: 102px;
overflow: hidden;
position: relative;
padding: 6px 6px;
cursor: pointer;
white-space:nowrap;
/*Using a background color, but you can use a background image to represent
 a button*/
background-color: #DEDEDE;
border: 1px solid gray;
border-radius: 4px;
-moz-user-select: none;
-ms-user-select: none;
-webkit-user-select: none;
user-select: none;
}

Utilise un déclencheur de clic caché "UploadButton" pour la publication sur serveur avec standard. Le texte avec "Upload File" met le contrôle d'entrée hors de vue dans le div wrapper quand il déborde, il n'est donc pas nécessaire d'appliquer de styles pour le contrôle "entrée de fichier". Le sélecteur $ ([id $ = "FileInput"]) autorise la section des identifiants auxquels sont appliqués les préfixes ASP.NET standard. La valeur de la zone de texte FilePath définie dans le code serveur situé derrière hdnFileName.Value une fois le fichier téléchargé.

1
Dan Randolph
<a href="#" id="select_logo">Select Logo</a> <input type="file" id="logo"> 

$("#logo").css('opacity','0');

$("#select_logo").click(function(){
   $().trigger('click');
   return false;
});
1
Somwang Souksavatd

Pour moi, le moyen le plus simple consiste à utiliser une couleur de police comme couleur de fond. Simple, pas élégant, mais utile.

<div style="color:#FFFFFF">   <!-- if background page is white, of course -->
<input class="fileInput" type="file" name="file1"/></div>
1
user1852108