He intentado de mil y una maneras, pero al final me he visto obligado a tener que consultar. Os cuento...
Como sabéis, en los botones de un formulario, ya sean creados mediante etiqueta "input" o "button", al hacer click se suele producir una animación que hace que el contenido de desplace ligeramente hacia adelante y hacia abajo y que los bordes en relieve que por defecto renderiza el navegador cambien.
Aplicando estilos es posible eliminar ese borde. Sin embargo, luchar contra el desplazamiento del contenido es más peliagudo. Os cuento lo que he probado...
SOLUCIONES ESPECÍFICAS DE CADA NAVEGADOR
En Firefox (motores Gecko en general) la solución es sencilla: Establecer el "padding" mediante CSS a una cantidad cualquiera. Hecho eso, ni se menea.
En Opera (motores Presto en general) hay que recurrir a una solución un poco conflictiva, que consiste en disparar un evento "mouseup" cuando se produce el "mousedown" por parte del usuario. Aun así, a veces muestra un pequeño parpadeo producido por la asincronía.
En Internet Explorer (motores Trident en general) ni una solución ni otra funcionan.
SOLUCIÓN GENERAL
Devanándome los sesos pensé en otra solución, aunque exclusiva de la etiqueta "button", pero que funcionó (teniendo "button" quién quiere "input" XD ). Pensé que quizá jugando con el posicionamiento podría engañar al motor de renderizado.
Y así fue. Si asignamos "position: relative" al botón y metemos su contenido en un elemento con "position: absolute" (como una capa "div"), el motor no puede aplicar ese desplazamiento en la animación y evitamos el problema.
¿Inconveniente? Que en motores Presto y Trident funciona de maravilla, pero en Gecko hay que seguir indicándole un "padding" concreto. Además, no entiendo por qué demonios deja la capa más allá de la coordenada (0,0), aun indicándole explícitamente que se quede ahí. De hecho, concretamente añade 2 píxeles en la horizontal y aproximadamente un 50% de la altura del botón en vertical. He probado con Firefox 3 Beta 2 (por confirmar si está solucionado) y sigue igual.
Si queréis reproducir esta última solución:
Código:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <style type="text/css"> #bt { position: relative; left: 0px; top: 0px; width: 100px; height: 24px; padding: 0px; } #div { position: absolute; left: 0px; top: 0px; width: 100px; height: 24px; } </style> </head> <body> <button id="bt"> <div id="div">xxx</div> </button> </body> </html>
Teniendo todo eso en cuenta he pensado en crear un script JS que para navegadores Triden (IE) y Presto (Opera) añadan esa capa extra a los botones. No quería recurrir a JS condicionado pero no queda otra.
¿Alguien sabe si existe otro sistema más cómodo? Sé que a muchos el hecho de que se desplace el contenido le es indiferente. Pero soy un maniático, que le voy a hacer.
Muchas gracias y un saludo :D .