2012-02-03 25 views
5

Versión corta: ¿Cómo puedo arrastrar Link 1 a uno de los menús desplegables de Link 3 en esta demostración? http://jsfiddle.net/Gdadu/2/¿Cómo puedo arrastrar un elemento a una lista desplegable usando jQuery UI sortable()?

EDITAR: La cuestión se ha planteado acerca de lo que debe suceder cuando se arrastra un elemento sobre otro: ¿debe ser colocado a la izquierda/derecha o iniciar un nuevo submenú? Para que la lista sea totalmente ordenable, tiene que haber alguna manera de colocar elementos en submenús no existentes, comenzando un nuevo menú desplegable ul. Podría insertar un ul vacío en cada elemento de la lista que todavía no tenga uno como objetivo de soltar, pero el problema anterior todavía existe.

Esto parece mucho más difícil de lo que pensé inicialmente, así que me disculpo por no haber puesto más esfuerzo en esto todavía, ya que no había considerado algunos de estos problemas. Estoy dispuesto a aceptar una respuesta al problema establecido y me preocupo por el resto más adelante.


Tengo una lista de navegación desplegable básica que quiero ser completamente ordenable, usando jQuery UI. Cualquier elemento li debería poder moverse a cualquier posición en la lista completa. Tengo problemas para arrastrar los elementos de la lista de nivel superior a los submenús, parece que :hover no se activa en la lista desplegable mientras está en "modo de arrastre", por lo que los menús desplegables no aparecen.

Ejemplo HTML:

<ul class="dropdown"> 
    <li><a href="#">Link 1</a></li> 
    <li><a href="#">Link 2</a></li> 
    <li><a href="#">Link 3</a> 
     <ul> 
      <li><a href="#">Link</a></li> 
      <li><a href="#">Link</a></li> 
      <li><a href="#">Link</a> 
       <ul> 
        <li><a href="#">Link</a></li> 
        <li><a href="#">Link</a></li> 
        <li><a href="#">Link</a></li> 
       </ul> 
      </li> 
     </ul> 
    </li> 
</ul> 

Mi CSS:

.dropdown, 
.dropdown li, 
.dropdown ul { 
    list-style:none; 
    margin:0; 
    padding:0; 
} 
.dropdown { 
    position:relative; 
    display:block; 
    z-index:10000; 
} 
.dropdown ul { 
    position:absolute; 
    top:100%; 
    width:100%; 
    visibility:hidden; 
    display:none; 
    z-index:900; 
} 
.dropdown ul ul { 
    top:0; 
    left:100%; 
} 
.dropdown li { 
    position:relative; 
    float:left; 
} 
.dropdown li:hover{ 
    z-index:910; 
    cursor:default; 
} 
.dropdown ul:hover, 
.dropdown li:hover > ul, 
.dropdown a:hover + ul, 
.dropdown a:focus + ul { 
    visibility:visible; 
    display:block; 
} 
.dropdown a { 
    text-decoration:none; 
    display:block; 
    padding:.5em 2em; 
    background:#cde; 
    border:1px solid #ccc; 
} 
.dropdown ul li { 
    width:100%; 
} 

inicialización Sortable:

$('.dropdown').sortable({ 
    items: 'li' 
}); 

Demostración: http://jsfiddle.net/Gdadu/2/

Por ejemplo, quiero dr ag "Enlace 1" en un submenú, pero no puede hacerlo porque el submenú no aparece mientras se arrastra, como si se ignorase :hover. No estoy seguro de si el problema radica en el CSS o javascript. ¿Qué puedo hacer sobre esto?

Buena idea de los comentarios:

Tal vez podría desencadenar todo para expandirse cuando se inicia un lastre

Esto probablemente funcionaría, pero no quiero que todo el menú se expanda. Podría ser una gran cantidad de contenido con muchos enlaces y 3 niveles de navegación, y probablemente se superponga con todos los menús desplegables/desplegables (gran desastre).

+2

Si está arrastrando algo, que se ciernen sobre lo que está arrastrando, que está bloqueando el elemento debajo de ella ... Hemos – Fosco

+0

Todavía está sobrevolando múltiples elementos, mira aquí, por ejemplo: http://jsfiddle.net/Gdadu/4/ El 'html: hover' todavía se activa. En cualquier caso, estoy buscando una solución al problema planteado. –

+0

Eso es solo porque ya está activo antes de arrastrar. No se dispararán nuevos desplazamientos al arrastrar. Quizás puedas disparar todo para expandir cuando se inicie un arrastre. – Fosco

Respuesta

2

Aquí es un violín que muestra algunos puntos que pueden ayudarle con su aplicación: http://jsfiddle.net/Gdadu/13/

Está lejos de ser perfecto, y como se señala en el comentario, hay algunos problemas lógicos también con "la clasificación todo en todas partes ":) Las cosas que no funcionan aquí están clasificando el li anidado en el nivel superior, ordenables en ul's anidados, ... pero creo que están esbozados por ahí. Distinguir la clasificación del arrastre puede ser una cosa necesaria con el estado actual de jqueryui. También atajo su excelente solución css para los submenús y los hice basados ​​en Javascript para simplificar un poco las cosas.

Pero: puede caer dentro vínculo1 link3 o ul anidada de link3;)

+0

Estoy viendo esto, tratando de hacer algo útil con eso. Te dejaré saber cómo me las arreglaré mañana por la noche. –

+0

Otros compromisos me hicieron dejar esta tarea durante probablemente los próximos 2 meses, así que le doy la marca de verificación como se prometió. Gracias por el valiente intento, si alguna vez vuelvo a esto, me aseguraré de publicar mi solución final. –

+0

De nada. Tuve un problema similar una vez que diseñé una interfaz CMS, donde podría "vivir" editar la navegación mientras navegaba por el sitio como administrador. El uso de 'botones de ayuda' para diferentes tareas como arrastrar y soltar u ordenar fue, desde el punto de vista de la usabilidad, la solución más clara. – kontur

Cuestiones relacionadas