Si no recuerdo mal, HTML5 le permite llamar al método click
en un elemento de entrada oculto para mostrar el cuadro de diálogo de archivo a través de un botón personalizado (¿por qué no simplemente hacer que funcione sin un elemento, no lo sé). Lamentablemente, no todos los navegadores actualmente en uso admiten esto todavía, por lo que está obligado a diseñar una entrada de archivo para que parezca un botón.
Este es un truco hilarante fea pero ingenioso CSS me encontré en un sitio una vez (probablemente Imgur):
.fileupload {
width: 100px;
height: 50px;
position: relative;
overflow: hidden;
background: ...; /* and other things to make it pretty */
}
.fileupload input {
position: absolute;
top: 0;
right: 0; /* not left, because only the right part of the input seems to
be clickable in some browser I can't remember */
cursor: pointer;
opacity: 0.0;
filter: alpha(opacity=0); /* and all the other old opacity stuff you
want to support */
font-size: 300px; /* wtf, but apparently the most reliable way to make
a large part of the input clickable in most browsers */
height: 200px;
}
Y el código HTML para ir con ella:
<div class="fileupload">
<input type="file" />
Any content here, perhaps button text
</div>
Lo que hace ¿hace que la entrada del archivo sea enorme (al cambiar el tamaño de la fuente (!?)) para garantizar que cubra el botón, y luego corta el exceso con overflow: hidden;
. Esto puede no funcionar para botones absolutamente enormes.
Esto es inútil, ya que en algunos navegadores viene el nombre del archivo antes del botón, mientras que en otros se trata después.Consulte aquí: http://www.quirksmode.org/dom/pix/filefields.gif –
@Dbugger: IIRC Safari también le permite hacer clic en la parte del texto, como lo hacen muchos otros navegadores. Al menos IE no le gusta los clics en el campo, de ahí el posicionamiento correcto. Revisé, y de hecho es lo que imgur.com hace, y estoy bastante seguro de que son una muy buena prueba de campo. –
Parece que la mayoría de estos ejemplos funcionan con la excepción del navegador anterior ... es decir, IE 8 y por debajo de – Paul