Hace un par de semanas, creé un screencast que demostró cómo construir un menú de navegación de tres niveles. En un correo electrónico de respuesta, uno de nuestros lectores solicitó un tutorial sobre cómo crear un menú de estilo de lámpara de lava. Afortunadamente, es una tarea bastante simple, especialmente cuando se utiliza una biblioteca de JavaScript. Vamos a construir uno desde cero hoy.
Antes de poder crear esta funcionalidad nítida, necesitamos una base desde la cual trabajar. En su editor de código favorito, cree una lista desordenada para su navegación e importe jQuery y jQuery UI, a través de Google.
SpasticNav Plugin
- Casa
- Acerca de
- Blog
- Más sobre mi cartera
- Contacto
Note cómo le dimos una identificación de "seleccionado" a la página de inicio. Esto es bastante estándar en la mayoría de los sitios web; permite utilizarlo para apuntar a la página actual y diseñar ese elemento de la lista en consecuencia.
A continuación, debemos decidir cómo implementar mejor la funcionalidad de la lámpara de lava. Para permitir la reutilización, empaquetaremos este pequeño script en un complemento y lo llamaremos así:
$ ('# nav'). spasticNav ();
Desde que decidimos crear un complemento, avancemos y creamos un nuevo archivo para ese script, y lo referenciamos en nuestro marcado. Lo llamaremos jquery.spasticNav.js.
Para reducir el número de variables globales que debemos crear, así como eliminar cualquier posibilidad de que el símbolo $ choque con otras bibliotecas de JavaScript, envolvamos nuestro complemento en una función anónima autoejecutable.
(función ($) ) (jQuery);
Ahora, jQuery se pasará a nuestro complemento y se representará mediante el símbolo $.
A continuación, generalmente es una buena práctica dar a los usuarios del complemento la mayor flexibilidad posible. Como tal, les daremos la opción de pasar un objeto literal cuando llamen al complemento para anular un puñado de configuraciones. Como yo lo veo, deberían ser capaces de:
Ahora, nombraremos nuestro complemento y lo haremos igual a una función. $ .fn es simplemente un alias para jquery.prototype.
$ .fn.spasticNav = function (options) ;
Sabiendo que vamos a permitir estas anulaciones, debemos asegurarnos de que aceptamos un parámetro de "opciones".
Ahora que hemos nombrado nuestro complemento, el siguiente paso es crear las opciones de configuración.
opciones = $. extensión (superposición: 20, velocidad: 500, restablecer: 1500, color: '# 0b2b61', alivio: 'easeOutExpo', opciones);
Arriba, tomamos la variable de opciones, establecemos algunas propiedades y valores predeterminados, y luego la extendemos con lo que sea (si es que pasa) el usuario pasa cuando llama al complemento. De esa manera, las opciones que pasen anularán nuestra configuración predeterminada. Por ejemplo, si, cuando llamo a este complemento, paso:
$ ('# nav'). spasticNav (speed: 2000, easing: 'easeOutElastic');
Esas dos propiedades anularán la configuración predeterminada, mientras que el resto de las opciones permanecerán igual.
Ahora, estamos listos para recorrer cada elemento que se pasó a este complemento e implementar la funcionalidad de la lámpara de lava. Recuerde, no podemos asumir que el usuario va a pasar un solo elemento a este complemento. Podrían, si quisieran, hacer referencia a una clase, que se refiere a múltiples elementos que deberían recibir esta funcionalidad. Como tal, llamaremos a este. Cada uno para iterar sobre cada elemento del conjunto envuelto.
devuelve this.each (function () );
Dentro de esta función, crearemos algunas variables. No todos ellos tendrán valores de inmediato, pero como el motor de JavaScript llevará todos los nombres de las variables a la parte superior de la función de todos modos (detrás de la escena), generalmente es una buena práctica declararlos en la parte superior y luego inicializarlos más tarde..
var nav = $ (this), currentPageItem = $ ('# selected', nav), blob, reset;
Ahora que hemos declarado / inicializado nuestras variables, creemos el blob real, por así decirlo.
PS') .css (width: currentPageItem.outerWidth (), height: currentPageItem.outerHeight () + options.overlap, izquierda: currentPageItem.position (). izquierda, arriba: currentPageItem.position (). top - options.overlap / 2, backgroundColor: options.color). AppendTo (this);
La razón por la que estamos llamando al método CSS, en lugar de simplemente agregar una clase, es porque estos valores variarán dependiendo del elemento de la lista de la página actual. Como tal, debemos usar JavaScript para recuperar sus valores..
Finalmente, agregamos este nuevo elemento de lista a esta, o #nav.
A continuación, necesitamos almacenar una referencia a #blob. De esa manera, no tenemos que buscar el DOM cada vez que deseamos acceder a él. Declaramos el gota Variable en la parte superior de la función. Ahora, vamos a inicializarlo.
blob = $ ('# blob', nav);
Ahora debemos "escuchar" cuando el usuario se desplaza sobre uno de los elementos de la lista (excluyendo el blob, por supuesto) en nuestro menú de navegación. Cuando lo hagan, estableceremos el ancho y las propiedades de la izquierda del blob iguales a las del elemento de la lista que se encuentra en ese momento..
$ ('li: not (#blob)', nav) .hover (function () // pase el mouse sobre clearTimeout (reset); blob.animate (left: $ (this) .position (). left, width: $ (this) .width (), duration: options.speed, easing: options.easing, queue: false);, function () // mouse out reset = setTimeout (function () blob.animate (width: currentPageItem.outerWidth (), left: currentPageItem.position (). left, options.speed), options.reset););
Para resumir el guión de arriba ...
Y eso es todo lo que hay que hacer! Este es un plugin super simple. El siguiente paso es diseñar nuestro menú de navegación..
Sin ningún estilo, nuestro menú debe parecerse a esto:
Primero el estilo de "nav" ul. Abra su archivo style.css, y agregue:
#nav posición: relativo; fondo: # 292929; flotador izquierdo;
A continuación, le daremos estilo a cada elemento de la lista..
#nav li float: left; estilo de lista: ninguno; borde derecho: 1px sólido # 4a4a4a; borde izquierdo: 1px negro sólido;
Esto simplemente hace flotar cada elemento de la lista a la izquierda y agrega un borde a cada lado..
Avanzando, a continuación debemos diseñar las etiquetas de anclaje dentro de nuestro menú de navegación.
#nav li a color: # e3e3e3; posición: relativa; índice z: 2; flotador izquierdo; tamaño de letra: 30px; Familia tipográfica: helvética, arial, sans-serif; texto-decoración: ninguno; relleno: 30px 45px;
Estamos configurando un color, flotándolos hacia la izquierda, configurando algunos valores de fuente y una cantidad saludable de relleno. Tome nota de la propiedad del índice z Esto es una necesidad, y se explicará en breve. Sin embargo, recuerde que, para ajustar el índice z, debemos establecer un contexto de posicionamiento, lo que hemos hecho..
Debido a que no estamos implementando una hoja de estilo de reinicio completo, asegurémonos de que eliminamos los márgenes y el relleno predeterminados de nuestra ul y li, solo para evitar posibles dolores de cabeza.
ul, li margen: 0; relleno: 0;
El último paso es diseñar el blob en sí.!
#blob border-right: 1px solid # 0059ec; borde izquierdo: 1px sólido # 0059ec; posición: absoluta; arriba: 0; índice z: 1; fondo: # 0b2b61; fondo: -moz-lineal-gradiente (arriba, # 0b2b61, # 1153c0); fondo: -webkit-gradiente (lineal, superior izquierda, inferior izquierda, de (# 0b2b61), a (# 1153c0)); -moz-border-radius: 4px; -webkit-border-radius: 4px; -moz-box-shadow: 2px 3px 10px # 011331; -webkit-box-shadow: 2px 3px 10px # 011331;
Una vez más, establecemos algunos colores bonitos para nuestros bordes, y agregamos algunos colores de fondo (incluidos los gradientes / bordes / sombras de CSS3 para Firefox y Safari / Chrome). Una vez más, vemos esa propiedad z-index. Sin esto, el blob se mostrará sobre todo el texto en el menú de navegación. Para contrarrestar esto, debemos asegurarnos de que su propiedad de índice z sea MÁS BAJA que la de los elementos de la lista. También debemos establecer la posición en absoluta para ajustar sus valores superior e izquierdo con nuestro complemento.
¡Eso es todo al respecto! Con un mínimo esfuerzo, hemos creado desde cero un menú de navegación realmente atractivo. ¡Hazme saber si tienes alguna pregunta! Gracias por leer y mirar.