CSS-позиционирование: относительное строит независимые «стеки»; или: почему синий боится красного и желтого?

Что мне нужно сделать: мне нужно создать два блока div рядом друг с другом. Внутри каждого div мне нужно иметь изображения с абсолютным позиционированием. Мне также нужно перетащить эти изображения из одного div в другой.

Моя проблема заключается в том, что перетаскиваемое изображение исчезает за другим элементом div. Вот jsFiddle, показывающий проблему, когда желтый элемент div исчезает за синим контейнером.

Мой вопрос: есть ли способ заставить синий контейнер распознавать z-индекс (абсолютную позицию) желтого блока div, в то время как желтый блок имеет красный контейнер в качестве привязки?

Небольшой фон: мне нужно добиться этого, потому что я хотел бы перетаскивать изображения из одного списка, а затем перетаскивать их в другой, сортируемый список. Я хотел бы добиться этого с помощью перетаскиваемых, отбрасываемых и сортируемых методов пользовательского интерфейса jQuery. Пока все просто и стандартно.

Однако оба списка изображений должны быть скользящими. Само по себе это относительно легко достигается с помощью метода слайдера пользовательского интерфейса jQuery. Однако для того, чтобы изображения скользили, мне нужно работать с абсолютным позиционированием (фактическое скольжение списка изображений достигается путем изменения абсолютного положения). Таким образом, я не могу обойти относительное и абсолютное позиционирование, как показано в jsFiddle.

Любая помощь, как всегда, приветствуется!


person Ivo Renkema    schedule 14.05.2012    source источник
comment
Не уверен насчет кода, но просто идея: что, если вы сделаете это при перетаскивании, изображение перестанет иметь родительский div в качестве родителя и станет дочерним элементом другого div?   -  person Andrius Naruševičius    schedule 14.05.2012
comment
См. мое обновление для альтернативы просто работе с CSS.   -  person Faust    schedule 14.05.2012
comment
Я не уверен, что есть проблема, так как z-index в желтом div работает нормально: jsfiddle -EDIT: я должен добавить, что использую Chrome, на всякий случай, если это что-то специфичное для браузера.   -  person Tim Hobbs    schedule 14.05.2012


Ответы (1)


Вы также можете:

  1. применить z-index только к элементам внутри контейнеров. (и следите за тем, чтобы не применять z-индекс к контейнерам, иначе они настроят свои собственные контексты стекирования, а z-индекс, применяемый ко всему внутри, будет относиться только к новому контексту.)

  2. Удалите объявление position:relative из двух контейнеров. Без каких-либо объявлений z-index позиционированные элементы будут отображаться перед непозиционированными элементами.

Хорошее объяснение контекстов стека можно найти здесь: http://timkadlec.com/2008/01/detailed-look-at-stacking-in-css/

ОБНОВЛЕНИЕ
Вы можете попробовать параметр helper:clone для перетаскивания jQuery/UI.

Поскольку он «клонирует» элемент, который вы хотите перетащить («использовать для отображения перетаскивания»), он не привязан к тому же контейнеру, что и оригинал. Но вам придется иметь дело с тем фактом, что элемент по-прежнему отображается в своем исходном положении, пока «клонированный» элемент перетаскивается.

Вы можете использовать события запуска и остановки draggable, чтобы сделать оригинал невидимым и снова видимым:

$('.myDiv')
    .draggable({
        helper: 'clone',
        start: function () {
            $(this).css('visibility', 'hidden');
        },
        stop: function () {
            $(this).css('visibility', 'visible');
        }
    })

... но тогда вам нужно будет разобраться с тем, что происходит, когда предмет выпадает, как предлагает Андриус. Для этого я бы рекомендовал посмотреть этот пост: клонирование узла при перетаскивании

Удачи.

person Faust    schedule 14.05.2012
comment
+1 Кроме того, перетаскиваемый плагин пользовательского интерфейса jQuery использует удобную опцию zindex, которая может помочь сделать это чистым способом. $('my-selector').draggable('option', 'zindex', value); - person TJ VanToll; 14.05.2012
comment
Спасибо всем, посмотрев ваши ответы/комментарии, я понял, что просто не могу сделать это так, как задумано. Однако замечание Андрюса о смене родителей с помощью jQuery может сработать. Как бы я это сделал? - person Ivo Renkema; 14.05.2012