Ir directamente al contenido de esta página
Hace unos días mi socio Jorge Fernández me preguntó si podría replicar el comportamiento de la barra de la página de Apple empleando la menor cantidad posible de JavaScript. Imagino que se esperaba alguno de mis scripts en menos de 2Kb, pero el resultado no ha ido por ahí…
En la barra de navegación de Apple, cuando un usuario hace clic sobre el buscador, la caja del mismo se expande para ofrecer un poco más de espacio al texto de búsqueda, lo cual es un detalle de usabilidad muy de agradecer. Al ampliar el tamaño del buscador, los vínculos de la navegación, en consecuencia, disminuyen su anchura. Visto así, el script debería:
input, uno en el estado focus y otro en el estado blur, para activar la animación que amplie o reduzca el campo.En principio no es demasiado complejo, pero como dije en una entrada anterior, para este tipo de efectos son mucho más eficientes las animaciones de CSS3. Así que el resultado se basa en ellas, lo que ha reducido considerablemente la cantidad de JavaScript necesario.
Para crear la barra de navegación, en lugar de flotar los ítems de la lista, hemos aplicado los valores de tablas de la propiedad display, porque tienen la ventaja de que podemos asignarles inicialmente un ancho, pero posteriormente el navegador tiene la capacidad de adaptar los tamaños de las celdas en función de sus contenidos, como hace con las tablas de HTML.
La idea era que a medida que el input del formulario se fuera extendiendo, la falsa celda crecería con él… pero no. El comportamiento real cuando sólo aplicábamos las reglas…
input{
[…]
-webkit-transition:.5s;
-moz-transition:.5s;
-o-transition:.5s;
-ms-transition:.5s;
transition:.5s;
}
input:focus{
width:250px;
[…]
}
…no era el deseado: los navegadores esperaban a que la transición hubiese finalizado para redibujar el elemento padre. Es decir, la caja del formulario se expandía superponiéndose progresivamente al vinculo de su izquierda, para que después sin transición el resto de elementos de la barra se cuadraran ajustándose al nuevo tamaño.
Después de unas cuantas pruebas comprobé que lo que necesitaba era el formulario que contenía el input tuviese la misma transición asociada, para que se expandiera de manera sincronizada. Y en este punto es cuando necesité añadir JavaScript, porque el elemento form no acepta el evento focus.
El script, visto lo anterior, sólo tenía que asignar al formulario el ancho final cuando el usuario activa el input. Además, sólo debía activar las propiedades de transición de CSS para el campo del formulario en caso de tener JavaScript activado, por evitar el efecto indicado anteriormente; es decir, esto:
var n = {
$: function(x){
return document.getElementById(x);
},
soporte: function(){
var pre = ['css','Moz','webkit','o','ms'];
for(var i in pre){
if(eval('n.$('b').style.'+pre[i]+'Transition')!==undefined){
var s = true;
}
}
return s;
},
ini: function(){
if(n.soporte){
n.$('b').className='trans';
n.$('b').onfocus = function(){
n.$('f').className='activo';
}
n.$('b').onblur = function(){
n.$('f').className='';
}
}
}
}
window.onload = n.ini;
Como se ve, el script sólo comprueba las condiciones para sincronizar el comportamiento del formulario y su input: la animación queda a cargo de CSS.
Como nota final, indicar que hay una limitación: como siempre que se quiere que el navegador aplique una transición de una propiedad de longitud, hay que indicar la medida en unidades absolutas, por lo que sería difícil emplearlo con una composición fluida.
Somos un pequeño estudio fundado en 2007 por tres amigos y que actualmente cuenta con un nutrido grupo de colaboradores, todos ellos profesionales con entre ocho y once años de experiencia en diversos aspectos del desarrollo y la programación web.
Además, Digital Icon, S.L. (N.I.F.: B84622927) es una empresa inscrita en el Registro Mercantil de Madrid, Tomo 22 436, Libro 0, Folio 20, Sección 8, Hoja M-400861, Inscripción 1, conforme a los artículos 18 del Código de Comercio y 6 del Reglamento del Registro Mercantil.
Si quiere conocer un poco mejor cómo trabajamos, puede descargar una copia del contrato que firmamos con nuestros clientes o seguirnos en Google+:
Cliente: La Fábrica
División: MovilizaWeb
Nuestro trabajo: PHP, HTML5, CSS
Cliente: Ana del Val
División: EidoWeb
Nuestro trabajo: PHP, XHTML, CSS, JavaScript
Cliente: Guiomar González
División: EidoWeb
Nuestro trabajo: PHP, HTML5, CSS, jQuery
© Digital Icon, S.L., 2007 – 2012
Comentarios
Aún no hay comentarios
¿Algún comentario?