Подтвердить что ты не робот

JQuery Draggable и Resizeable над IFrames (решение)

Недавно я столкнулся с некоторыми проблемами, используя плагины JQuery Draggable и Resizable. Ища решения, я нашел очень фрагментированный код во многих разных местах и, наконец, подал заявку на чистое решение, которое, кажется, работает почти идеально для меня.

Я думал, что буду делиться своими выводами для кого-то еще, если они придут к этой проблеме тоже.

У меня есть div, который содержит и IFrame. Этот div должен быть изменен по размеру и перетаскиваться. Достаточно просто - добавьте jquery draggable и resizable в div так:

$("#Div").draggable();
$("#Div").resizable();

Все в порядке, пока вы не перетащите другой div, содержащий iframe, или попробуйте изменить размер текущего div, переместив ваш текущий iframe. Обе функции останавливаются, когда над iframe.

Решение:

$("#Div").draggable({
    start: function () {
        $(".AllContainerDivs").each(function (index, element) {
        var d = $('<div class="iframeCover" style="zindex:99;position:absolute;width:100%;top:0px;left:0px;height:' + $(element).height() + 'px"></div>');
        $(element).append(d);});
    },
    stop: function () {
        $('.iframeCover').remove();
    }
});



$("#Div").resizable({
    start: function () {
        $(".AllContainerDivs").each(function (index, element) {
            var d = $('<div class="iframeCover" style="z-index:99;position:absolute;width:100%;top:0px;left:0px;height:' + $(element).height() + 'px"></div>');
            $(element).append(d);
        });
    },
    stop: function () {
        $('.iframeCover').remove();
    }
});

Наслаждайтесь!

PS: некоторый дополнительный код для создания окон, которые, когда они выбраны, переносятся на передний план других перетаскиваемых объектов:

В перетаскиваемой функции запуска -

var maxZ = 1;
$(".AllContainerDivs").each(function (index, element) {
    if ($(element).css("z-index") > maxZ) {
        maxZ = $(element).css("z-index");
    }
});
$(this).css("z-index", maxZ + 1);
4b9b3361

Ответ 1

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

Есть некоторые jquery-плагины, которые достигают части этой функциональности, но многие борются с iframe.

Приведение на передний план также может быть улучшено в точках и может не работать во всех ситуациях.

Ответ 2

Попробуйте следующее:

 $('#Div').draggable({ iframeFix: true });

Это должно работать.

Ответ 3

То, что я сделал, это определить body.dragging iframe {pointer-events: none;}, а затем добавить dragging class to body на событие dragstart и удалить его на событие dragend.

Хорошо работает для меня, не уверен, почему он не упоминался ранее, насколько я могу сказать, что свойство CSS указателя-события уже было в 2010 году.

Ответ 4

Почему так сложно? Существует гораздо более красивое решение:

  • поместите ваш iframe внутри относительного div с некоторым z-индексом, скажем 0
  • make iframe relative также и изменить его z-index на -1 во время перетаскивания:

код:

$("#Div").draggable({
    start: function () {
        $("iframe").css('z-index', '-1');
    },
    stop: function () {
        $("iframe").css('z-index', '0');
    }
});

Ответ 5

Сначала я походил как решение Байрона Кобба, но поскольку я использую элемент диалога, и Iframe не требуется, когда отображается диалог (это диалог сохранения), мне понравилось использовать modal:

$('#savingDialog').dialog({
    modal: true
});