3 votes

Stylisation d'une entrée de type="fichier".

J'ai lu des articles à ce sujet à plusieurs endroits.

J'ai essayé la méthode trouvée ici : http://www.quirksmode.org/dom/inputfile.html

Je n'ai pas réussi à le faire fonctionner. J'ai donc essayé une méthode CSS/HTML et cela fonctionne à merveille dans Firefox, Chrome, Safari et Opera (toutes les dernières versions) mais pas dans (vous l'avez deviné) IE8.

Il a l'air bien, mais quand vous cliquez dessus, ça ne marche pas. Si vous double-cliquez dessus, il fonctionne.

Avez-vous une idée de la façon de faire fonctionner ce système en un seul clic ?

Actuellement, j'utilise les commentaires conditionnels d'IE pour dire aux utilisateurs d'IE de double-cliquer sur le bouton de sélection. Le site est en cours de conception et n'est pas encore accessible aux utilisateurs. J'aimerais résoudre ce problème avant qu'il ne soit mis en ligne, si possible.

0voto

Gaurav Agrawal Points 2552

En fait, ce n'est pas votre problème, car IE prend un contrôle de téléchargement de fichier de manière différente. Il comprend le contrôle de téléchargement de fichier comme une zone de texte et un bouton d'entrée, lorsque vous cliquez sur le bouton "Browse" ou "select" de téléchargement de fichier, il ouvre une boîte de dialogue, mais lorsque vous cliquez sur le texte de téléchargement de fichier, il met en évidence la zone de texte et si vous cliquez à nouveau sur cette zone de texte, il ouvrira la boîte de dialogue. On peut dire qu'il s'agit d'un bug prédéfini dans IE et que nous ne pouvons rien y faire. La plupart des utilisateurs connaissent ce problème.

0voto

M-Soley Points 155

Si vous essayez de masquer le bouton de saisie par défaut sans perdre le comportement par défaut d'IE8 sur le fichier de saisie et également la prise en charge des navigateurs croisés, essayez d'appliquer la méthode suivante

input.file{
   width:0 ; 
   height:0;
}  //supposing your file input has class of .file`   

dans le css et vous êtes prêt à partir

0voto

Lynda Points 10527

Cela fait un moment que j'ai posé cette question et voici la méthode que j'utilise maintenant pour styliser les entrées de fichiers. Ces informations proviennent de Codrops . Il est beaucoup plus détaillé et fournit plusieurs exemples, mais voici l'essentiel :

HTML

 <input type="file" name="file" id="file" class="inputfile" />
 <label for="file">Choose a file</label> 

BESOIN DE VÉRIFIER POUR JS

<html class="no-js">
  <head>
      <!-- remove this if you use Modernizr -->
      <script>(function(e,t,n){var r=e.querySelectorAll("html")[0];r.className=r.className.replace(/(^|\s)no-js(\s|$)/,"$1js$2")})(document,window,0);</script>
  </head>
</html>

CSS

.js .inputfile {
    width: 0.1px;
    height: 0.1px;
    opacity: 0;
    overflow: hidden;
    position: absolute;
    z-index: -1;
}

.inputfile + label {
    max-width: 80%;
    font-size: 1.25rem;
    /* 20px */
    font-weight: 700;
    text-overflow: ellipsis;
    white-space: nowrap;
    cursor: pointer;
    display: inline-block;
    overflow: hidden;
    padding: 0.625rem 1.25rem;
    /* 10px 20px */
}

.no-js .inputfile + label {
    display: none;
}

.inputfile:focus + label,
.inputfile.has-focus + label {
    outline: 1px dotted #000;
    outline: -webkit-focus-ring-color auto 5px;
}

.inputfile + label * {
    /* pointer-events: none; */
    /* in case of FastClick lib use */
}

.inputfile + label svg {
    width: 1em;
    height: 1em;
    vertical-align: middle;
    fill: currentColor;
    margin-top: -0.25em;
    /* 4px */
    margin-right: 0.25em;
    /* 4px */
}

JS

;( function ( document, window, index )
{
    var inputs = document.querySelectorAll( '.inputfile' );
    Array.prototype.forEach.call( inputs, function( input )
    {
        var label    = input.nextElementSibling,
            labelVal = label.innerHTML;

        input.addEventListener( 'change', function( e )
        {
            var fileName = '';
            if( this.files && this.files.length > 1 )
                fileName = ( this.getAttribute( 'data-multiple-caption' ) || '' ).replace( '{count}', this.files.length );
            else
                fileName = e.target.value.split( '\\' ).pop();

            if( fileName )
                label.querySelector( 'span' ).innerHTML = fileName;
            else
                label.innerHTML = labelVal;
        });

        // Firefox bug fix
        input.addEventListener( 'focus', function(){ input.classList.add( 'has-focus' ); });
        input.addEventListener( 'blur', function(){ input.classList.remove( 'has-focus' ); });
    });
}( document, window, 0 ));

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