Otro blog más de diseño
Ahora que están de moda los sistemas de pestañas, yo también me subo al carro de la moda y propongo mi propio sistema al margen de frameworks. Un poco de html, algo de css y el javascript de toda la vida.
Lo primero de todo es crear la estructura que queremos que siga el sistema. En mi caso quiero hacer un panel limitado en tamaño, para pongamos por ejemplo, un panel de configuración.
<div id="panel">
<ul id="tabs">
<li id="tab_01"><a href="#">opción 1</a></li>
<li id="tab_02"><a href="#">opción 2</a></li>
<li id="tab_03"><a href="#">opción 3</a></li>
<li id="tab_04"><a href="#">opción 4</a></li>
</ul>
<div id="paneles">
<div id="panel_01">panel para la opción 1</div>
<div id="panel_02">panel para la opción 2</div>
<div id="panel_03">panel para la opción 3</div>
<div id="panel_04">panel para la opción 4</div>
</div>
</div>
A cada elemento de la lista de los paneles les añadimos un identificador para después poder ocultarlos y/o mostrarlos según nos convenga. De momento debería de verse así
A continuación viene la parte más divertida, darle forma y color.
Para la forma de las pestañas, usaremos la siguiente imagen:

Los estilos serían algo similar a esto.
/* tamaño y forma del panel principal */
div#panel {
position: relative;
width:400px;
height: 300px;
}
/* configuracion de las pestañas */
ul#tabs {
position:absolute;
left: 0px;
top: 0px;
margin:0;
padding:0;
width: 400px;
height: 24px;
z-index: 20;
}
ul#tabs li {
float:left;
height: 23px;
padding-left: 8px;
list-style: none;
margin-right: 1px;
background: url(tabs.png) left -48px;
}
ul#tabs li.actual {
height: 24px;
background: url(tabs.png) left -72px;
}
ul#tabs li a {
display: block;
/* hack para ie6 */
.display: inline-block;
/* fin del hack */
height: 23px;
line-height: 23px;
padding-right: 8px;
outline: 0px none;
font-family: arial;
font-size: 10px;
text-decoration: none;
color: #000;
background: url(tabs.png) right 0px;
}
ul#tabs li.actual a {
height: 24px;
line-height: 24px;
background: url(tabs.png) right -24px;
cursor: default;
}
/* Configuración de los paneles */
div#panel #paneles {
position:absolute;
left: 0px;
top: 23px;
width: 398px;
height: 275px;
border: 1px solid #91a7b4;
background: #fff;
overflow: hidden;
z-index: 10px;
}
div#panel #paneles div {
margin:10px;
width: 378px;
height: 255px;
font-family: arial;
font-size: 12px;
text-decoration: none;
color: #000;
overflow: auto;
}
Por lo que el resultado debería ser igual a esto.
Como la cosa ya va tomando forma, necesitamos crear una función javascript que nos permita cambiar tanto la apariencia de las pestañas como la visibilida de cada una de las capas destinadas a tal fin.
Para ello creamos una función como esta
function tab(pestana,panel)
{
pst = document.getElementById(pestana);
pnl = document.getElementById(panel);
psts = document.getElementById('tabs').getElementsByTagName('li');
pnls = document.getElementById('paneles').getElementsByTagName('div');
// eliminamos las clases de las pestañas
for(i=0; i< psts.length; i++)
{
// Para evitar meternos en temas de dom
// hacemos que la clase sea vacío
psts[i].className = '';
}
// Añadimos la clase "actual" a la pestaña activa
pst.className = 'actual';
// ocultamos todos los paneles
for(i=0; i< pnls.length; i++)
{
pnls[i].style.display = 'none';
}
// Y mostramos el panel que nos interesa
pnl.style.display = 'block';
}
Al final de nuestro documento, mostramos la pestaña que queremos tener activa de esta forma
<script type="text/javascript">
tab('tab_01','panel_01');
</script>
Y esta misma función será la que utilicemos en cada enlace para poder mostrar/ocultar nuestra información.
<ul id="tabs">
<li id="tab_01"><a href="#" onclick="tab('tab_01','panel_01');">opción 1</a></li>
<li id="tab_02"><a href="#" onclick="tab('tab_02','panel_02');">opción 2</a></li>
<li id="tab_03"><a href="#" onclick="tab('tab_03','panel_03');">opción 3</a></li>
<li id="tab_04"><a href="#" onclick="tab('tab_04','panel_04');">opción 4</a></li>
</ul>
[ ver resultado final ] [ descargar ]
Qué puedo decir de mi que no se haya dicho ya antes.
mola
Julio 2nd, 2009 el 11:25 pm
Rula que te cagas neno! Muchas gracias, lo analizo e intento aprender a hacerlo.
cmacias
Julio 3rd, 2009 el 12:06 pm
Me alegro de que te pueda ser útil
Roxseni gonzalez
Julio 14th, 2009 el 9:43 pm
buenos dias, ayudarme en algo…. primero: Hay alguna manera de colocar las pestañas en lugar de horizontal -como el ejemplo que muestras- vertical?
y segundo. exactamente dnde inserto ese codigo…..
de antemano gracias
cmacias
Julio 15th, 2009 el 12:04 am
Hola Roxseni, es muy sencilo, sólo debes buscar en la hoja de estilos la línea donde pone “ul#tabs li” y eliminar “float:left;”.
De esa forma, las pestañas no “flotarán” a la izquierda y mantendrán su orientación por defecto, que es la vertical.
Diseño web
Agosto 12th, 2009 el 6:23 am
¿cmacias puedo poner esta noticia en una de mis paginas? como es logico pondre un link a tu pagina. Un saludo
cmacias
Agosto 12th, 2009 el 12:27 pm
@DiseñoWeb, encantado de que lo hagas. No necesitas pedir permiso
Un saludo
Rodolfo
Octubre 2nd, 2009 el 2:12 am
Muy interesante, pero como hago pàra que al seleccionar una viñeta o tab, salga un recuadro en donde podre colocar formularios para llenar, y una vez llenados, pueda cambiar de viñeta sin que esta información cambie…..
Rodolfo
Octubre 2nd, 2009 el 2:15 am
Creo que no me deje entender, puedo poner formularios en lugar de textos dentro de los cuadros una vez seleccionado las viñetas? y deseo que la informacion ingresada se mantenga, podrian ayudarme? gracias.
Rodolfo
Octubre 2nd, 2009 el 2:26 am
Otra pregunta si no paresco muy cargoso, en la parte donde explican como hacerlo vertical, como haria apra que el resultado se vea al lado derecho y no al inferior?
Rodolfo
Octubre 2nd, 2009 el 2:39 am
Ehhhhhh, ya esta, eso me pasa por no revisar bien antes de preguntar, pero al ponerlo como vertical se deforma…..
(
Rodolfo
Octubre 2nd, 2009 el 3:00 am
Estimados amigos, aqui les tengo una tareita y espero me puedan ayudar. Me gusto mucho los tabs,y quiero saber como puedo anexar esos paneles a un menu vertical, con las mismas caracteristicas, aqui les dejo el menu. Gracias.
Menu Vertical
body #button li a {
width: auto;
}
#button li a:hover {
border-left: 10px solid #1c64d1;
border-right: 10px solid #5ba3e0;
background-color: #2586d7;
color: #fff;
}
#button li #active {
border-left: 10px solid #1c64d1;
border-right: 10px solid #5ba3e0;
background-color: #2586d7;
color: #fff;
}
–>
Home
Products
Services
Support
Order
News
About
Rodolfo
Octubre 2nd, 2009 el 3:04 am
<!--Menu Vertical
/* CSS Tabs */
#button {
width: 12em;
border-right: 1px solid #000;
padding: 0 0 1em 0;
margin-bottom: 1em;
font-family: Tahoma, Arial, sans-serif;
/*'Trebuchet MS', 'Lucida Grande', Verdana, Arial, sans-serif;*/
font-size : 10px;
background-color: #90bade;
color: #333;
}
#button ul {
list-style: none;
margin: 0;
padding: 0;
border: none;
}
#button li {
border-bottom: 1px solid #90bade;
margin: 0;
list-style: none;
list-style-image: none;
}
#button li a {
display: block;
padding: 5px 5px 5px 0.5em;
border-left: 10px solid #1958b7;
border-right: 10px solid #508fc4;
background-color: #2175bc;
color: #fff;
text-decoration: none;
width: 100%;
}
html>body #button li a {
width: auto;
}
#button li a:hover {
border-left: 10px solid #1c64d1;
border-right: 10px solid #5ba3e0;
background-color: #2586d7;
color: #fff;
}
#button li #active {
border-left: 10px solid #1c64d1;
border-right: 10px solid #5ba3e0;
background-color: #2586d7;
color: #fff;
}
Home
Products
Services
Support
Order
News
About
-->
Diseño web
Octubre 2nd, 2009 el 4:08 am
rodolfo pesao me han venio 6 mensajes seguidos a las 3 de la mañana. Me puse para recibir notificaciones. si me acuerdo mañana intento ayudarte, un saludo
Vito
Octubre 12th, 2009 el 2:46 am
Buen programa, lo apique en un formulario, pero una duda. Tengo mi base de datos en PHP e incruste los input text y selects en los marcos y debajo de los tabs puse un botn para grabar.
¿Como obtengo los valores que ingrese para pasarlos a mi base de datos? Aun no le atino, ¿quien me puede ayudar?
Vito
Octubre 12th, 2009 el 3:04 am
Por cierto, ya intente con:
$nb=$_POST["Form1.TxtApRc"];
$nb=$_POST["TxtApRc"];
y nada, no captura el valor….. Espero me puedan ayudar, gracias
cmacias
Octubre 12th, 2009 el 8:23 am
Si el código lo tienes fuera de los marcos, y el formulario dentro, obviamente no te funcionará. Tanto el formulario como el código deben ir en el mismo lugar.
Piensa que las páginas que cargan en los marcos son totalmente independientes de la página donde los cargas.
sonia
Enero 4th, 2010 el 1:03 pm
Hola: yo es esto lo que tengo ahora necesito averigüar otra cosa. Si cojo la opción 2 y tubiera un boton de imprimir, lo que quiero es imprimir unicamente la pestaña que seleccione, me podias asesorar un poco como hacerlo, le estoy dando mil vueltas y no lo consigo. Muchas gracias.Sonia
cmacias
Enero 4th, 2010 el 1:44 pm
Yo haría lo siguiente. A la capa que deseas imprimir le colocaría una clase determinada, como por ejemplo “class=print”.
En la hoja de estilo principal, le añadiría un “media=screen” y añadiría una nueva hoja de estilos con un “media=print” en donde colocaría los estilos a usar dentro de esa capa a imprimir. Obviamente, el resto de estilos de la página, deberían ir con un “display:none” para no ser interpretados por el navegador a la hora de imprimir.
sonia
Enero 4th, 2010 el 2:09 pm
muchas gracias. Lo pruebo y cuando lo tenga te comento.
Rafalinux
Febrero 28th, 2010 el 2:38 pm
El sistema de pestañas que has creado es muy sencillo, pero increíblemente potente. Lo he probado y es muy bueno, aunque le tengo que sacar un “pero”. En cada panel he intentado poner conenido. Estos contenedores se llevan muy bien con las etiquetas , y , pero si quiero poner otro DIV, por ejemplo, si quisiera anidad otro sistema de pestañas debajo del principal, no se puede (o yo no puedo, al menos). No sé si el problema es del CSS o del core de Javascript, a pesar de que he intentado incluir DIV como contenido de los paneles.
¿Has probado a hacerlo? ¿Te funciona?
Gracias por adelantado y muy buen trabajo. Enhorabuena.
Rafalinux
Febrero 28th, 2010 el 5:28 pm
Vaya, en mi mensaje de antes no me he explicado bien. Quise decir que etiquetas como P, SPAN, etc., funcionan sin problemas. Pero cualquier etiqueta DIV que pongo dentro de los paneles no aparece.
He estado revisando el CSS y no creo que sea de allí. Estoy un poco perdido, la verdad.
cmacias
Marzo 1st, 2010 el 1:28 pm
Hola Rafa, efectivamente acabo de ver el problema que comentas del “div”. Para ocultar el div, hago un recorrido de los “div” que hay dentro del panel. Al meter un div dentro de otro, este último entra en el recorrido y se oculta, y por eso no lo ves.
Esto me lleva a rehacer el código para que solo tenga en cuenta los div contenedores, por lo que aprovecharé y le meteré nuevas funcionalidades y las publicaré.
Un saludo y gracias por tu indicación.
Rafalinux
Marzo 1st, 2010 el 11:43 pm
Sí, ayer estuve comprobando el comportamiento de los DIV, y llegué también a esa conclusión. De todas maneras, si uso la etiqueta SPAN funciona perfectamente.
No creo que debas modificar el código, porque creo que es muy sencillo, fácil de entender y muy potente.
Mi problema con los DIV dentro de los paneles era simplemente porque necesitaba incluir una aplicación en Javascript que utilizaba un DIV como referencia. La solución la he encontrado al hacer a div#panel con menos anchura: en lugar de 100% le he dado 80%, y el resto lo utilizo para una especie de menú lateral.
SOLUCIONADO!
Gracias por contestar tan rápido! Saludos!
cmacias
Marzo 2nd, 2010 el 12:15 am
Otra solución sería cambiar en el código la llamada a los contenedores.
En vez de :
getElementsByTagName(‘div’);
poner :
getElementsByTagName(‘h4′);
Y obviamente cambiar en los paneles los “div” por “h4″. De esta manera puedes colocar tantos div dentro como necesites.
Otra cosa sería hacerlo “como Dios manda” y restringir el bucle solamente a cada primer div. Por eso como solución rápida está bien, pero mejor si se puede usar sin restricciones, verdad ?
Un saludo
Rafalinux
Marzo 3rd, 2010 el 10:55 pm
Sí, tienes razón, pero he encontrado otra solución: utilizar SPAN en lugar de DIV, de modo que se tienen los mismos efectos, pero sin interferirse con DIV.
Me dí cuenta del problema cuando quise introducir un calendario hecho en Javascript. Dado que utilizaba muchos DIV para dibujarse en la página, o bien daba error, o bien no aparecía, directamente.
Para rizar el rizo, intentaré colocar pestañas anidadas dentro del bloque de pestañas principal, y lo intentaré con SPAN o como nos has sugerido. Ya te contaré!
Saludos y GRACIAS!