Ver Mensaje Individual
  #2 (permalink)  
Antiguo 20/07/2011, 17:30
Avatar de laratik
laratik
 
Fecha de Ingreso: mayo-2010
Ubicación: Cali
Mensajes: 317
Antigüedad: 14 años, 5 meses
Puntos: 63
Respuesta: aplicar un expand all a mis links de archivos en mi blog

Hola Hildergarn, hace poco estuve trabajando en un menú acordeón, lo principal es tener una estructura de lista (como en casi cualquier menú):

Código HTML:
<ul class="acordeon" id="config">
        <li><h3 onselectstart='return false'>Ultimos usuarios</h3>
            <div>En costrucción...</div>
        </li>
        <li><h3 onselectstart='return false'>Ultimos Articulos</h3>
            <div>En costrucción...</div>
        </li>
        <li><h3 onselectstart='return false'>Ultimos widgets</h3>
            <div>En costrucción...</div>
        </li>
    </ul> 
El siguiente paso es ocultar mediante CSS los div que se encuentren dentro del menú:

Código CSS:
Ver original
  1. ul.acordeon {
  2.     list-style: none;
  3.     padding: 0;
  4. }
  5.  
  6. ul.acordeon * {
  7.     padding: 0;
  8.     margin: 0;
  9. }
  10.  
  11. ul.acordeon li h3 {
  12.     background: url(../arrow_left.gif) no-repeat center right;
  13.     color: #555;
  14.     font-size: 12px;
  15.     padding: 5px;
  16.     cursor: pointer;
  17. }
  18.  
  19. ul.acordeon li:hover {
  20.     background: url(../bg_acordeon_over.gif);
  21. }
  22.  
  23. ul.acordeon li {
  24.     border: solid 1px #9ac1c9;
  25.     background: url(../bg_acordeon.gif);
  26.     padding:0;
  27.     margin: 5px;
  28. }
  29.  
  30. ul.acordeon div {
  31.     display: none; //acá oculto el div
  32.     background: #FFF;
  33.     padding: 10px;
  34.     border-top: solid 1px #9ac1c9;
  35. }

El resto de CSS es solo para obtener el resultado visual que necesitaba. A continuación utilizo javascript para dejar visibles los divs:

Código Javascript:
Ver original
  1. function myo() {//document.getElementById().style
  2.     var pa = this.parentNode;
  3.     /*var ocu = pa.parentNode.getElementsByTagName("div");
  4.     for(var i=0; i<ocu.length; i++) {
  5.         if(ocu.item(i) != pa.getElementsByTagName("div").item(0)) {
  6.             ocu.item(i).style.display = "none";
  7.             ocu.item(i).parentNode.getElementsByTagName("h3").item(0).style.background = "url(images/arrow_left.gif) no-repeat center right";
  8.         }
  9.     }*/
  10.     if(pa.getElementsByTagName("div").item(0).style.display == "block") {
  11.         pa.getElementsByTagName("div").item(0).style.display = "none";
  12.         this.style.background = "url(images/arrow_left.gif) no-repeat center right";//esto lo utilizo para cambiar una flecha hacia abajo por una hacia un lado
  13.     } else {
  14.         pa.getElementsByTagName("div").item(0).style.display = "block";
  15.         this.style.background = "url(images/arrow_down.gif) no-repeat center right";//esto lo utilizo para cambiar una flecha hacia un lado por una hacia abajo
  16.     }
  17. }

El código que aparece comentado lo utilizo para que solo se muestre un solo div, de esta manera si doy click en otro head se oculta el div que se este visualizando y se muestra el nuevo. Por ultimo asigno la funcionalidad de mostrar divs a todos los h3 del menú:

Código Javascript:
Ver original
  1. var ac = getElementsByClassName("acordeon");
  2.     for(var i=0; i<ac.length; i++) {
  3.         var head = ac[i].getElementsByTagName("h3");
  4.         for(var j=0; j<head.length; j++) {
  5.             Event.add(head[j],"click",myo);
  6.         }
  7.     }

Resultado:




Conclusión:

Los pasos realmente importantes para crear el menú son:

1. Tener una estructura sobre la cual trabajar, las listas representan una buena opción.
2. Ocultar mediante CSS la parte colapsable del menú (en mi caso los divs)
3. mostrar y ocultar mediante javascript la parte colapsable del menú

Te puedo ayudar con un ejemplo más sencillo si así lo deseas.
__________________
Programar apasiona y lo que apasiona es un arte, por lo tanto programar es un arte.

Quiero karma para en mi próxima vida ser un billonario bien dotado con alas.