En esta ocasión, aprenderemos a crear un menú de pestañas con nuestra querida librería de javascript jQuery. Recrearemos de forma simple y limpia un menú de pestañas elegante, útil y listo para utilizar en nuestros sitios web.

Autor: Adrián Mato

Hola! Soy diseñador, programador web y cofundador de la startup Cokidoo, desarrollamos aplicaciones web a gran escala y comercio electrónico, aplicaciones para móviles y advertising. Puedes seguirme através de mi twitter y ver algunos de mis themes en Themeforest. También soy aficionado a la fotografía.
Descarga Demostración

Introducción: ¿Qué vamos a hacer?

Cada día existen más diseños inspirados en el “formato blog”, estructuras que en su mayoría se componen de una cabecera, un menú horizontal, una división del contenido a dos columnas: contenido del artículo y columna derecha de widgets / gadgets y finalmente termina en un pie de página.

Es en esa columna derecha, en la de widgets, donde podemos ver un gran uso del menú de pestañas, la mayoría de las veces son pestañas que contienen información sobre el archivo de publicaciones, últimos comentarios, artículos más leídos, etc. Os dejo con una imagen previa de lo que haremos:

Vista previa del menú de pestañas

Así pues, mediante un poco de xHTML, CSS y javascript (jQuery en este caso) aprenderemos a crear nuestro propio menú de pestañas listo para usar en cualquiera de nuestros diseños web.

¡Vamos a ello!

Paso 1: La estructura HTML

Como siempre, lo primero que debemos tener claro y preparado para trabajar, es la estructura html que tendrá nuestra página. En esta ocasión tendrán especial relevancia las listas y bloques de contenido:

<!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" dir="ltr" lang="es-ES">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Cómo crear un menú de pestañas elegante en jQuery</title>
    <link rel="stylesheet" href="main.css" type="text/css" media="screen" />
    <!--[if IE]>
        <link rel="stylesheet" href="ie.css" type="text/css" media="screen" />
    <![endif]-->
</head>
<body>
    <div class="wrapper">
        <h1>Cómo crear un menú de pestañas elegante en jQuery</h1>
        <br />
        <div class="aux">
            <div id="container">
                <ul class="menu">
                    <li id="noticias" class="active">Noticias</li>
                    <li id="tutoriales">Tutoriales</li>
                    <li id="enlaces">Enlaces</li>
                </ul>
                <span class="clear"></span>
                <div class="content noticias">
                    <h3>Últimas Noticias</h3>
                    <ul>
                        <li><img src="img/bullet.png" alt="-" /> Manifiesto por los Derechos en Internet </li>
                        <li><img src="img/bullet.png" alt="-" /> Logos que Inspiran Volumen #5</li>
                        <li><img src="img/bullet.png" alt="-" /> Erasmusu llega a los 6.000 usuarios</li>
                        <li><img src="img/bullet.png" alt="-" /> Lanzamos web.ontuts.com!</li>
                    </ul>
                </div>
                <div class="content tutoriales">
                    <h3>Últimos Tutoriales</h3>
                    <ul>
                        <li><img src="img/bullet.png" alt="-" /> Cómo crear bordes redondeados en CSS3</li>
                        <li><img src="img/bullet.png" alt="-" /> JSONP, llamadas entre dominios</li>
                        <li><img src="img/bullet.png" alt="-" /> Introducción a Microsoft Silverlight</li>
                        <li><img src="img/bullet.png" alt="-" /> Cómo aplicar sombra en textos con CSS3</li>
                        <li><img src="img/bullet.png" alt="-" /> Creando capa de conexión abstracta a base de datos con PHP</li>
                        <li><img src="img/bullet.png" alt="-" /> Mini Aplicaciones Web con Python y Juno</li>
                    </ul>
                </div>
                <div class="content enlaces">
                    <h3>Deberías Visitar...</h3>
                    <ul>
                        <li><img src="img/bullet.png" alt="-" /> <a href="http://www.plusmusica.com">www.plusmusica.com</a> - Online jukebox!</li>
                        <li><img src="img/bullet.png" alt="-" /> <a href="http://www.cokidoo.com">www.cokidoo.com</a> - Nuestra startup! :) </li>
                        <li><img src="img/bullet.png" alt="-" /> <a href="http://www.cokidoo.com">www.pixelartgames.com</a> - Te gustan los juegos pixel art? ;) </li>
                        <li><img src="img/bullet.png" alt="-" /> <a href="http://www.dmsconsulting.es">www.dmsconsulting.es</a> - Anterior empresa</li>
                    </ul>
                </div>
            </div>
        </div>
    </div>
    <script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript" src="tabs.js"></script>
</body>
</html>

Estamos utilizando un contenedor con el id “container“, el cual fija el ancho de nuestro widget y que contiene por un lado el menú de selección de pestaña activa (en forma de lista desordenada) y tres divisiones contenedoras:

  • noticias
  • tutoriales
  • enlaces

Estas tres divisiones (como habréis podido deducir) son las tres secciones que tendrá nuestro widget, las cuales contendrán su información correspondiente y que comparten la clase de CSS “content“.

Cada sección del menú horizontal tiene un ID que se corresponde con la clase de cada contenedor “content”. Esto nos facilitará el código javascript en próximos pasos.

Esta estructura html que parece tan simple, nos ayudará mucho en el paso 3, cuando tengamos que aplicar el javascript para recrear así la funcionalidad del menú.

Paso 2: Aplicando estilo a nuestro menú de pestañas

Como hemos visto en la imagen previa, queremos que nuestro menú tenga las siguientes características de estilo:

  • Menú horizontal para las pestañas.
  • Ocultado de secciones no activas.
  • Resaltado de sección activa para diferenciarse de las demás.
  • Algunas zonas redondeadas para mejorar un poco el aspecto visual.

Para ello, aplicaremos el siguiente código CSS:

/******* MENU *******/
#container{
    margin:4em auto;
    width:400px;
}
#container ul{
    list-style:none;
    list-style-position:outside;
}
#container ul.menu li{
    float:left;
    margin-right:8px;
    margin-bottom:-1px;
}
#container ul.menu li{
    font-weight:700;
    display:block;
    padding:10px 15px;
    background:#303030;
    margin-bottom:-1px;
    border:1px solid #3e3e3e;
    border-width:1px 1px 1px 1px;
    position:relative;
    color:#e4e1cd;
    cursor:pointer;
    border-radius:3px 3px 0 0;
    -moz-border-radius:3px 3px 0 0;
    -webkit-border-radius:3px 3px 0 0;
}
#container ul.menu li:hover{
    color:#fff;
}
#container ul.menu li.active{
    background:#171717;
    top:1px;
    border-bottom:0;
    color:#fff;
}
/******* /MENU *******/

/******* CONTENT *******/
.content{
    margin:0pt auto;
    background:#efefef;
    background:#171717;
    border:1px solid #3e3e3e;
    text-align:left;
    padding:1.3em;
    padding-bottom:20px;
    font-size:12px;
    line-height:2em;
    color:#8C8C8C;
    border-radius:0 5px 5px 5px;
    -moz-border-radius:0 5px 5px 5px;
    -webkit-border-radius:0 5px 5px 5px;
}
.content h3{
    line-height:1em;
    vertical-align:middle;
    height:48px;
    padding:10px 10px 10px 52px;
    font-size:32px;
    color:#E4E1CD;
}
/******* /CONTENT *******/

/******* NOTICIAS *******/
.content.noticias h3{
    background:transparent url(img/news.png) no-repeat scroll left top;
}
.content.noticias{
    display:block;
}
/******* /NOTICIAS *******/

/******* TUTORIALES *******/
.content.tutoriales h3{
    background:transparent url(img/tuts.png) no-repeat scroll left top;
}
.content.tutoriales{
    display:none;
}
/******* /TUTORIALES *******/

/******* ENLACES *******/
.content.enlaces h3{
    background:transparent url(img/links.png) no-repeat scroll left top;
}
.content.enlaces{
    display:none;
}
.content.enlaces a{
    color:#498BBF;
}
/******* /ENLACES *******/

Como véis, estamos presuponiendo que todas las secciones de contenido estarán ocultas mediante la propiedad CSS “display:none“, salvo la sección de “noticias” la cual estará visible y activa asignándole la propiedad “display:block“. A su vez, en el menú “noticias” tendrá la clase “active” asignada, indicando que es la sección actualmente activa.

La clase de CSS “active” baja en 1 pixel la altura de la pestaña activa y oculta la línea superior de la división del contenido, proporcionando un poco más de diferenciación frente al resto de pestañas inactivas.

Sin la clase active y las propiedadas mencionadas, ocurriría lo siguiente:

Problema en el menú de pestañas sin clase active

Otra forma o camino a seguir para ocultar esta línea, sería aplicar un color idéntico al fondo de la división contenedora al borde inferior de la sección del menú, es decir que la clase “active” quedaría así:

#container ul.menu li.active{
    background:#171717;
    top:1px;
    border-bottom:0;
    color:#fff;
}

El resto de código CSS simplemente se basa en retoques visuales para lograr un menú de pestañas un poco más bonito: imágenes para los encabezados, bordes redondeados, etc.

No queda mucho más que comentar, así que… ¡Vamos a por el código javascript!

Paso 3: Añadiendo funcionalidad con javascript y jQuery

Antes de añadir la funcionalidad, es importante pensar con calma y dejar muy claro qué es lo que queremos conseguir y cuáles serán los efectos a emplear. En nuestro caso recrearemos lo siguiente:

  • Las secciones del menú activan los contenidos
  • Al hacer click en una sección, se oculta el contenido actual y se muestra el nuevo.
  • Al hacer click en una sección, esta pasa a estar activa, la anterior deja de estarlo.
  • Utilizaremos para alternar entre contenidos un “efecto fade in“.

Para lograr todo esto, nos será de gran ayuda los métodos addClass y removeClass que nos proporciona jQuery, con los cuales podremos aplicar o quitar estilo de CSS de forma rápida y cómoda. Este sería el código de javascript:

$(document).ready(function(){
    $(".menu > li").click(function(e){
        var a = e.target.id;
        //desactivamos seccion y activamos elemento de menu
        $(".menu li.active").removeClass("active");
        $(".menu #"+a).addClass("active");
        //ocultamos divisiones, mostramos la seleccionada
        $(".content").css("display", "none");
        $("."+a).fadeIn();
    });
});

Es realmente poco código, ¿verdad? Esto tiene una explicación bastante clara, para los que no lo hayáis deducido ya, lo explicamos:

  • Cada sección en el menú tiene un ID asignado.
  • Cada contenedor “content” tiene además una clase asignada, que coincide con el ID de la sección del menú.
  • b>Mediante el ID, conocemos qué sección está seleccionando el usuario, y lo guardamos en una variable.
  • Con esa variable, accedemos a los distintos selectores para aplicar las clases correspondientes.
  • La clase “active” nos permite también saber qué sección dejará de estar activa.

De no organizarlo o plantearlo de esta forma en la que reaprovechamos una cadena para crear distintos selectores, estaríamos ahora mismo trabajando con un código javascript de muchísimas más líneas, ya que tendríamos que generar código para cada una de las secciones que tengamos, a más secciones más y más código necesitaríamos.

El método fadeIn() lo que hace es quitar el estilo por defecto “display:none” que tienen las secciones ocultas y lo muestra de forma progresiva.

Una vez más se demuestra lo importante que es el planteamiento inicial, tanto de estructura HTML, como de CSS y javascript para lograr el objetivo final con el mínimo de código y peso posible.

No nos queda nada más que hacer en este tutorial :) .

Reflexión final

Es realmente interesante ver como jQuery ha facilitado la vida a los desarrolladores web con ejemplos como este, en los que reutilizando una cadena de texto sacada apartir de un ID podremos generar múltiples selectores listos para utilizar y trabajar con ellos, ahorrándonos código y aportando mayor rendimiento y velocidad a nuestras páginas / scripts.

Como siempre, espero que este tutorial os sirva de ayuda para vuestros proyectos.

¡Nos vemos en el próximo tutorial!

¿Necesitas desarrollar un proyecto web o para móviles? ¡Estamos disponibles!

Visitar Cokidoo

Cokidoo, los creadores de Ontuts, desarrollamos proyectos tecnológicos centrados en redes sociales y aplicaciones web, aplicaciones móviles y consultoría web y bases de datos.

Somos jóvenes, inquietos, versátiles, apasionados por la innovación y enfocados en las nuevas tecnologías. Con Ontuts tratamos de compartir nuestro conocimiento adquirido en los distintos proyectos, ayudando a la comunidad y mostrando nuestra capacidad tecnológica.

Si necesitas un presupuesto sin compromiso, estamos disponibles, no dudes en contactar con nosotros.

Comentarios en esta publicación (52 comentarios)

¿Te ha gustado esta publicación? ¡Puedes compartir tu opinión con todos nosotros! Simplemente pincha aquí mismo.

He buscado tipo de menú como por dos semanas!!! Yupi!!!!
gracias

Me he chutado todo los tutoriales sobre jQuery que hay en el sitio, ciertamente soy muy buenos. Espero con ansias el siguiente. Gracias.

Felipe Orellana Castillo

Hola

Muchas gracias, muy útil el tutorial, sería agradable que hicieran más como estos

saludos!

Luis C. Bardullas

Gracias por compartirlo!!!

leo

Buen tutorial, justo lo que andaba buscando, lo uso y te comento como me fue.

felicidades!… :P

marco m

demasiado bueno el tutorial
jquery lo mejor

Muy bueno, me pregunto como se hace para que el contenido de las pestañas no sea un div en la misma pagina, sino que se traiga (por ejemplo) de un script php o algo asi. De todas formas muy bien explicado todo

Julio

Cuando se prueba en un website MS asp.net no funciona correctamente. ¿Esto porque puede darse?

@Julio no sé exactamente cuál puede ser el problema, pero lo que sí te puedo confirmar es que el lenguaje del lado del servidor es totalmente independiente del javascript que apliques a tu resultado HTML final.

Cesar

Pienso que en CSS deberia existir una propiedad relacionada con el click del mouse y asi no tener que programar estas tonterias ya que son cosas de estilo puramente…

Louis du Pointe

Hola, de antemano muchas gracias por compartir con nosotrso tu conocimiento , el menu esta genial… sin embargo tenog un problemita… acabo de bajar el jquery 1.4.1 Released , y he intentado hacer este menu, y el paso no3 no me funciona, no sabria decir el por que… podrias subir en un zip o algo asi, los fuentes de este ejemplo para ver como seria ya funcionando??? te lo agradeceria mucho

Louis du Pointe

Hey disculpa la molestia.. ya vi cual era el error.. ya todo funcionando correctamente.. en verdad gracias prola ayuda y ojala pudieras aportarnos mas tutoriales de este tipo y asi de bien explicados ya que osn dificiles de conseguir !!!!!

En verda dmucha sgracias

Juan Carlos

Gracias, excelente!!!!!!!!!!

Mati

Muy claro y sencillo, un MAESTRO!!!!
Ojalá publiques más.

JOSAFAT
Unknown

Para hacer eso no hace falta utilizar jquery, por dios… hasta donde llegaremos…

Leonel
Orlando

Muy bueno este tutorial:
Solo que me gustaria me ayudaras con algo, es referente a este tutorial. Como ejemplo voy a decir que si yo tubiera este menu de pestañas hasta abajo de una pagina larga y para verlo tubiera que ir hasta abajo de la pagina obiamente pues no hay problema todo bien, pero si doy click a una pestaña la pagina se sube al principio lo cual la verda es molesto como se puede solucionar esto? como prueba puedes restaurar la ventana de tu browser a un tamaña menor y veras que al dar click sobre el la pagina se mueve gracias…

@Orlando no es una pregunta trivial, ya que veo por donde vas pero como solución rápida y sencilla te sugiero que uses anclas de enlace, de esta forma puedes tener como hipervínculo “[url que desees]#region” y al cargar la página se te moverá hasta la posición deseada.

oswaldo

Muy buenas tardes, muy bueno el control, solo me gustaria saber como se puede hacer para que cuando se ejecute un evento y se refresque la pagina, el menu vuelva a cargar la pestaña activa al momento de ejecutar el evento.

Diego

Hola, yo tengo un problema parecido al de Orlando, he probado a poner el código del menu en la parte de abajo de un html de prueba, al pulsar sobre el enlace de la pestaña la página me parpadea y el scroll sube o baja de un modo un tanto molesto para la vista, ¿Sabes a que puede ser debido? ¿Se produciria el mismo efecto si el menú estuviese basado unicamente en css?

andres felipe

Brother estuvo muy bueno el tutorial pero le hago una pregunta soy nuevo en este campo de web sites y no se donde colocar la funcionalidad osea el javascript ,,perdon por la ignorancia men pero ni idea

@filipe Descárgate la demo y encontrarás la respuesta a tus preguntas :P

bueno una consulta amigo como puedo hacer que en vez que salga algo que ya esta escrito salga o mejor dicho se cargue una pagina php dentro delas ventanas

Lau

Está divino!! Lo estoy implementando en mi proyecto actual, pero me topé con dos cosas..

- Le quise hacer una pequeña modificación para que en vez de cambiar de color el fondo de las pestañas, sea una imagen (que cambie de posición con ccs).. pero por alguna razón no me toma el movimiento, y cuando está activa o cuando paso el mouse por arriba se queda estático.

Estoy usando éste codigo:
background:url(img/tab-bar1.png) no-repeat 0 -15px; width:66px;

Y por supuesto, cambiándole el valor para que se produzca el movimiento. Lo puse dentro de container ul.menu li:hover y container ul.menu li:active. ¿Qué estoy haciendo mal?

- Y otra cosa.. ya que tengo un espacio limitado para el contenido de las tabs, pero la información continúa, le puse un scroll con javascript que funciona perfecto mientras ese div no tenga el display:none; ahi deja de funcionar el scroll. ¿Hay alguna manera de evitar eso?

Perdón por el bombardeo de preguntas! pero es que me gustó tanto este script (que además se ajusta perfecto para lo que necesito) que me empeciné en usarlo.
Un millón de gracias!!

Chris

No tengo ni idea del tema, aun así estoy haciendo mi portfolio para usarlo luego con wordpress.
La barra de navegación que he diseñado es parecida a esta que haces en el tutorial, y me estoy rompiendo la cabeza para ver como la hago con css y usando sprites, que por cierto más mal no lo puedo llevar.

Cuestión…en este caso, si el navegador no soporta css3, las esquinas redondeadas se verán en vértice? Es por intentar recrear este menú en mi web. Un saludo

Leonardo

Hola muchas gracias por el tutorial, lo he integrado perfectamente, Solo me gustaria saber como hacer para rote automaticamente en tiempos programados? ( como slideshow)

Gracias

leonardo

@Leonardo gracias por tus comentarios. Échale un vistazo a esto: http://www.elated.com/articles/javascript-timers-with-settimeout-and-setinterval/ deberías aprender a controlar el settimeout

Gustavo Pedreros

Me parece Genial! tu aporte, muy bien explicado, este será mi comienzo con jquery. Muchas gracias, cuidese harto.

sickboy

Creeo que el ejemplo sería más comprensible para los novatos si en vez de “e” usaras una variable “evt” o “event” y en vez de “a” usaras algo más intuitivo, el ejemplo esta bastante interesante y tiene muchas posibilidades gracias por compartir.

un abrazo y un saludo.

N4CH0

Muy bueno el tuto, me ayuda en mucho para la apliccaion que voi a desarrollar. Gracias por elaporte y sigan adelante. alert(“EL KONOCIMIENTO ES PODER”);

Ramiro Carrión

Muy bueno el tutorial, es muy claro y muy bien explicado, gracias por su aporte y sigan adelante.

Saludos.

Jefferson Figueroa

Muy muy bueno tu tutorial.

Muchas gracias!

Esta muy bueno y eso como lo puedo poner en como una entrada en wordpress?? y poner videos dentro??

Me gustó mucho el tutorial. Te hago una pregunta, hay alguna forma de que al recargar la página vuelva a la pestaña activa? Modifique esto con php:

<li id="noticias">Noticias
<li id="tutoriales">Tutoriales
<li id="enlaces">Enlaces

El problema es que al recargar la página se activa la pestaña indicada pero siempre muestra el contenido de Noticias. Se te ocurre algo para poder modificar esto? Saludos

Jose

Muchas gracias por el tutorial,
Estoy intentando unirlo con el Lightbox JS, pero no me funciona.
¿ Alguien me puede ayudar ?

clemente

que bueno que encontre algo asi y de verdad q sirve y muchas gracias x dar el codigo sin esconder nada quiero comentar q pueden poner mas menus este solo incluye 3. gracias y sabras como hago un blog para mi web quiero q me ayuden por favor

Cristian

Estimado.
genial tu tutorial. Lo aplique en un proyecto y funciona a la perfección. SOLO UN PROBLEMA ME CAUSA.
Necesito tener 2 menus del mismo tipo con información diferente en la misma pagina.
Por alguna razon no me funciona.
Cambio en nombre de los ID, modifico el main.css y nada… me queda desordenado el segundo menu.
como lo hago?
gracias

Arkero

Increible el tuto, espero llegar a casa y probarlo en mi proyecto

LEONARDOTE

ME ENCANTARIA QUE FUESE MAS DETALLISTA A ALA HORA DE EXPLICAR ESTA APLICACION ME AYUDARIA MUCHISIMO GRACIAS

Hola! @Adrián Mato entiendo el tema de las anclas, pero no se donde ubicarlas y que agregar en el js. Mi problema es que cuando se hace clic en alguno de los botones la página sube (el scroll queda arriba.

Espero la respuesta, gracias!

Paulo Cèsar Tìjaro

soy estudiante de sistemas y esta pagina me hes muy útil para mi, en especial para nosotros los principiantes, trae todo en cuanto a diseño, modo de operación y seleciòn y manejo de las herramientas.

Nieves L.

Buenas!
Maravillosa página esta!.
Soy estudiante de un taller ocupacional de diseño web y estoy haciendo el diseño de un sitio web como proyecto para el curso. Estoy haciendo una página con pestañas de jquery.
El problema es que necesito hacer un footer con links de texto a las diferentes etiquetas y no encuentro la manera. ¿Me podría orientar alguien, por favor?

Gracias por adelantado!!!!

Gracias!! Excelente estos tutoriales y además en español

Alex Aguilar

Tengo una pregunta: no soy ninguna experta en informática, de hecho no sé prácticamente nada… pero me gusta, como hobby, aprender… tengo una plantilla que realicé con el programa de Artisteer… ésta plantilla tiene una barra hasta arriba con una pestaña que dice ‘Home’… y supuestamente es un gadget en el que puedo ir añadiendo más pestañas… pero en la página de elementos de diseño de mi blog, aparece el gadget de ‘Top Menu’ que solamente acepta direcciones con el http://... y yo quisiera poner una pestaña de ‘Contacto’ que a la hora de pinchar salga la ventana del correo electrónico… cómo pudo manipular en html ésta cuestión, para poder realizarlo?… mi plantilla tiene el script: script src=’http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js’ type=’text/javascript’/

juanchouru

Hola me gustaria saber si me puedes dar una mano en si estoy queriendo hacer lo siguiente: tengo un div con muchas imagenes dentro de otros div lo que quiero hacer es al darle clic a la imagen me abra una pestaña y si queiro volver a la pestaña anterior y ver otra foto que me abra otra pestaña sin que se cierre la anterior y asi hasta las pestañas q quiera estaria muy bueno saber es como las pestañas de chrome o de los navegadores
gracias desde ya
saludos!!!

zero

hola muy buentuto pero tengo una pregunta como puedo controlar el menu de una tabla con otro menu osea el mimoi menu que se cambie y todo pero controlandolo con un menu independiente se podra?

wilson

hola este tutorial es muy interesante pero tengo una duda. que pasa si quiero linkear los menus a url distintas dentro del mismo proyecto osea algo asi :

Noticias
Tutoriales

Y esto es por que carga otra pagina lo que resulta obvio. lo que no tengo claro es como puedo llamar a otra url sin que desaparezca el efecto de transición.

Juan

se podrá hacer esto en forma vertical? (las pestañas)

Jorge Luis Toro Pozo

Super OK esta lo de JQuery, funciona tambien con otras versiones de JQuery ejemplo 1.7.1????

Añade Tu Comentario