Cómo construir un menú de navegación deslizante sensible

Después de un largo período de investigación de diseños de respuesta móviles, pasé bastante tiempo experimentando con varios diseños de UI. Un punto de acceso importante en la página es a menudo la navegación principal del sitio web. Los usuarios desean un acceso rápido a sus páginas de contenido, y esto siempre será así, ya sea en un monitor completo o en una pantalla móvil más pequeña.

Para este tutorial, quiero demostrar cómo podemos usar una combinación de consultas de medios CSS3 junto con algunos jQuery para administrar un menú de navegación deslizante. Los enlaces aparecerán como de costumbre en el frontend, pero caerán en un menú oculto después de cambiar el tamaño por debajo de 600px. En cambio, vemos un pequeño ícono de menú desplegable que cambiará el comando de apertura y cierre.

Demo en vivo - Descargar código fuente

Configuración del documento

El área del encabezado superior contiene una pequeña selección de archivos que necesitamos para crear este efecto. Incluyo una hoja de estilo personalizada junto con una copia de la última biblioteca jQuery alojada por Google. Todas las funciones JS personalizadas se almacenan en un archivo externo llamado menu.js.

La mayor parte del marcado de la página no es importante, aparte del área del encabezado. Intenté mantener todo a una altura fija, pero el encabezado no puede usar una propiedad CSS fija o la página no se expandirá al deslizar el menú para abrirlo y cerrarlo. Así que los enlaces de encabezado y navegación están configurados por altura de la línea Valores en CSS.

La página h1 el título se ajusta mejor como último elemento, por lo que el encabezado siempre mantendrá su altura constante. Justo al lado del título hay un enlace de anclaje con el ID #navbtn y esto contiene el icono de enlace del menú deslizante. Solo se mostrará usando CSS después de que el ancho caiga por debajo de un cierto umbral.

Posiciones de marcado en CSS

Típicamente no considero que requiera jQuery siempre que sea posible. El único problema con los menús alternativos es que no podemos hacerlo de manera eficiente en CSS. Y los métodos de jQuery aplicarán estilos CSS en línea que anulan la hoja de estilo predeterminada. Así que se trata de posicionar los elementos usando CSS y ayudarlos a animarse adecuadamente con JavaScript.

Los restablecimientos de mi navegador CSS predeterminado incluyen un conjunto de códigos personalizados para la tipografía de la página. Además, nuestro mosaico de fondo del cuerpo es PS Neutral salvado de patrones sutiles. Tuve que dividir el contenedor de envoltorio y el contenedor de cuerpo en 2 divs porque estamos usando el relleno lateral de la izquierda y la derecha para evitar que la página crezca al 100% de ancho. Agregando valores de margen en el margen: 0 auto; La propiedad dará lugar a perder el posicionamiento centrado.

Al estilizar el interior.

Elemento que conservamos el control sobre la barra de cabecera. Y al establecer la posición en absoluta, controlamos la distancia que seguirán los enlaces de navegación después del título. Observe cómo #navbtn se mostrará oculto hasta que se redimensione a menos de 560 px mediante consultas de medios. Todo lo demás está configurado, incluyendo la altura, el ancho y el posicionamiento.

Estilos responsivos

Hay solo una pequeña cantidad de cambios que he realizado cuando la ventana del navegador cambia de tamaño en menos de 560px. No creo que este sea un número mágico, simplemente resulta que es un área agradable cuando la navegación predeterminada comenzará a toparse con el texto del logotipo. Esto es cuando necesitamos ocultar el menú de navegación y mostrar el icono de alternar.

También significa eliminar el posicionamiento absoluto del elemento de navegación para que se renderice como un bloque estático. Los enlaces de anclaje de navegación se mostrarán como filas de ancho total del 100% para un acceso más rápido al tocar en una pantalla móvil. Además, los encabezados de página internos + párrafos se redimensionarán un poco más pequeños, junto con los valores de altura de línea ajustados.

Interacciones con JavaScript

El bit final de código en menu.js También podría incluirse directamente en el documento HTML. Pero como tenemos que manejar más de un solo método de conmutación, es más limpio y eficiente separar el marcado de los efectos dinámicos. Voy a desglosar este archivo en secciones para que sea más fácil de leer.

La primera gran parte es sin duda la más confusa. Se trata de errores menores al cambiar el tamaño de los navegadores de sensible a no sensible y no debería afectar en absoluto a los teléfonos inteligentes. Adjuntamos un controlador de eventos a la ventana que verifica el tamaño de .on (). Las dos declaraciones lógicas distintas están comparando con la variable que apunta al elemento de navegación del encabezado, junto con el enlace de alternar del menú de navegación.

Cuando el navegador responde y el usuario activa / desactiva el menú, agregará una línea estilo atributo. Esto tendrá prioridad sobre cualquier cosa escrita en la hoja de estilo y es un problema después de que el menú se haya abierto y cerrado. El nav tendrá un estilo permanente de pantalla: ninguna; incluso después de cambiar el tamaño más grande que 560px.

Esto es lo que está comprobando la segunda declaración if {}. Cuando tanto el botón de navegación como el botón de menú están ocultos, el diseño responde, el usuario abrió / cerró el menú y luego volvió a cambiar su tamaño a la vista normal. Así que solo necesitamos mostrar el navegador de nuevo, pero hay un problema. El método show () de jQuery también adjuntará estilos en línea, lo que significa que al volver a cambiar el tamaño para responder, el menú de navegación permanece abierto permanentemente. Para arreglar esto estaré agregando una clase. .keep-nav-closed. Esto solo se agregará si el navegador está cerrado y luego se redimensiona. Si se deja abierto cuando responde, permanecerá abierto cuando se redimensione más y vuelva a bajar.

Ahora la otra afirmación si {} debería tener sentido en cuanto a por qué estamos revisando esta clase. Solo aparecerá después del segundo tiempo de cambio de tamaño y apertura de la navegación, por lo que sabemos que, en cambio, eliminamos la clase de la forma en que permanece cerrada cuando el tamaño vuelve a tener un ancho de respuesta. Es un error extraño y todavía tengo que encontrar una solución más pequeña o más rápida para manejar los estilos jQuery en línea, además de eliminar el atributo por completo (lo que aún causa problemas). Así que ahora avancemos y echemos un vistazo al segmento final de JavaScript.

Ambos controladores de eventos están buscando eventos de clic en diferentes objetivos. El primero está bloqueado en todos los diferentes enlaces de anclaje en las secciones de navegación de encabezado y pie de página. Los valores href son símbolos hash (#) que no van a ninguna parte, así que simplemente los configuro para que no carguen nada. Esto es similar al hacer clic en el botón de navegación porque no queremos cargar un hash en la URL de la página. En su lugar, el menú de navegación oculta de respuesta se abrirá y cerrará a 350 milisegundos, ignorando completamente el valor href.

Demo en vivo - Descargar código fuente