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

JQuery UI resizable не поддерживает позицию: исправлено; Любые рекомендации?

Функция JQuery UI .resizable не поддерживает элементы position: fixed;. Когда вы попытаетесь изменить их размер, он переключит свой атрибут позиции на абсолютный. Любые рекомендуемые исправления?

У меня есть окна чата, которые появляются и перетаскиваются вокруг документа. Они фиксированы так, что они не прокручиваются со страницей за ними. Все они отлично работают, пока вы не попытаетесь изменить размер окна, когда он перейдет на position: absolute;, а затем останется после того, как прокрутка страницы.

Я попытался обработать событие остановки изменения размера и изменить положение на фиксированное:

    stop: function (event, ui)
    {
        $(chatWindow).css('position', 'fixed');
    }

Это не работает, потому что позиционирование (top: и left:) неверно для фиксированного элемента, и когда вы останавливаете изменение размера, элемент переключается на фиксированное позиционирование и переходит к странным местам на странице. Иногда выпрыгивает из страниц и теряется навсегда.

Любые предложения?

4b9b3361

Ответ 1

Чтобы справиться с этой проблемой, я завернул блок .resizable() блоком .draggable():

<div id="draggable-dealie">
    <div id="resizable-dealie">
    </div>
</div>

соответствующие js:

$("#draggable-dealie").draggable();
$("#resizable-dealie").resizable();

и убедитесь, что у вас есть свойство position:fixed !important;, установленное в # draggable-dealie CSS:

#draggable-dealie {
    position:fixed !important;
    width:auto;
    height:auto;
}

У меня есть демонстрация при: http://jsfiddle.net/smokinjoe/FfRRW/8/

Ответ 2

Если, как и я, у вас есть фиксированный div внизу страницы, то вы можете просто добавить! важно для этих правил css, чтобы заставить его придерживаться внизу:

.fixed {
  position: fixed !important;
  top: auto !important;
  bottom: 0 !important;
  left: 0;
  right: 0;
}

И просто сделайте его изменчивым по своей северной границе:

$('.fixed').resizable({
  handles: "n"
});

Ответ 3

Простое положение силы: фиксируется на элементе при запуске изменения размера и при изменении размера.

$(".e").draggable().resizable({
   start: function(event, ui) {
      $(".e").css("position", "fixed");
   },
   stop: function(event, ui) {
      $(".e").css("position", "fixed");
   }
});

JSFiddle: http://jsfiddle.net/5feKU/

Ответ 4

Нет красоты, но как насчет сохранения позиции (вверху и слева) в отдельных vars в начале изменения размера (я думаю, что метод называется "start" )?

ОБНОВЛЕНИЕ (Спасибо за комментарий... Событие срабатывает слишком поздно): Поскольку JqueryUI генерирует второй объект "ui" при создании объекта с изменяемым размером, он дает этому ui-объекту поле: ui.originalPosition... Это должно быть положение фиксированного элемента до изменения размера...

Ответ 5

Вот решение, с которым я столкнулся, это немного больше кода, чем хотелось бы, но он устраняет проблему:

$("#test").resizable({stop:function(e, ui) {
    var pane = $(e.target);
    var left = pane.attr("startLeft");
    var top = pane.attr("startTop");
    pane.css("position", "fixed");
    pane.css("top", top);
    pane.css("left", left);
}});
$("#test").draggable({create: function(e, ui) {
    var pane = $(e.target);
    var pos = pane.position();
    pane.attr("startLeft", pos.left + "px");
    pane.attr("startTop", pos.top + "px");
}, stop: function(e, ui) {
    var pane = $(e.target);
    pane.attr("startLeft", ui.position.left + "px");
    pane.attr("startTop", ui.position.top + "px");
}});

Это сохраняет верхнюю и левую позиции в элементе html (требуется, чтобы docthype xhtml был действителен) и использует эту информацию для установки позиции в конце события изменения размера.

Ответ 6

Это грязное решение, но работает для меня.

this.resizable({
    start:function (event, ui){
         x =ui.originalPosition.left+ $(ui.originalElement).parent().scrollLeft()
         y = ui.originalPosition.top+ $(ui.originalElement).parent().scrollTop()
    },
    resize:function (event, ui){
         $(ui.originalElement).css('left' , x);
         $(ui.originalElement).css('top' , y);
}

Ответ 7

У меня была эта проблема сегодня, и я абсолютно ненавижу "неэстетичные" обходные пути... Поэтому я решил немного поэкспериментировать, не было ли "лучшего" решения... и в какой-то момент у меня было догадка:

HTML:

<div class="fixed"></div>

javascript (jquery):

$('.fixed').resizable();
$('.fixed').draggable();

CSS

.fixed{
    position: fixed !important;
}

JQuery просто переиграл CSS, черт!