Как изменить размер ТОЛЬКО по горизонтали или вертикали с помощью jQuery UI Resizable?


81

Единственное решение, которое я нашел, - установить максимальную и минимальную высоту или ширину с текущим значением.

Пример:

foo.resizable({ 
  maxHeight: foo.height(), 
  minHeight: foo.height() 
});

Но это действительно некрасиво, особенно если мне нужно программно изменить высоту элемента.

Ответы:


145

Вы можете установить изменения размера handlesопцию , чтобы показывать только на левой и правой (или восток / запад), как это:

foo.resizable({
    handles: 'e, w'
});​

Вы можете попробовать здесь.


7
Я только что обнаружил оговорку с этим решением. Он все равно поместит ширину и высоту, когда будет выполнен как встроенный стиль. У меня возникают проблемы с вертикальным решением. Как только я изменил его размер, ширина будет установлена, и она больше не 100% (а значение в пикселях). Просто поместите это здесь, на случай, если другие ищут и столкнутся с этим.
Fernker

@Fernker Да, это больно.
Бен

вы можете получить обратно процентную ширину, если передадите своему div свойства min-width и max-width с одинаковым значением. Это не будет отменено :)
Себастьен

2
Не проходит тест сдвиг-перетаскивание.
ничего не нужно 09

@nothingisneeded можете описать "тест сдвиг-перетаскивание"?
Jon z

27

Хотя плакат в основном просил изменить размер только по горизонтали, вопрос действительно касается и вертикального.

Вертикальный случай имеет особую проблему: вы могли установить относительную ширину (например, 50%), которую хотите сохранить даже при изменении размера окна браузера. Однако пользовательский интерфейс jQuery устанавливает абсолютную ширину в пикселях, как только вы сначала измените размер элемента, и относительная ширина будет потеряна.

Если обнаружен следующий код для этого варианта использования:

$("#resizable").resizable({
    handles: 's',
    stop: function(event, ui) {
        $(this).css("width", '');
   }
});

См. Также http://jsfiddle.net/cburgmer/wExtX/ и jQuery UI с изменяемым размером: автоматическая высота при использовании только восточного маркера


2
Очень интересно, спасибо. Буду иметь в виду. Я думаю, что важно отметить, что ширина элемента с изменяемым размером должна быть установлена ​​css, если нет, она будет потеряна после изменения размера. См. Здесь jsfiddle.net/paska/wExtX/10
Диего

1
Это решение, которое я искал. По какой-то причине, даже если ручка отключена для области, кажется, что ее размеры по-прежнему установлены в пиксели. Если вы не используете этот метод, вы потеряете высоту или ширину в%.
Сергей

На самом деле это не работает в jQuery-ui 1.11.0. Ширина CSS, установленная непосредственно для элемента, не берется из начальной ширины. Я пытаюсь установить ширину в процентах, и она записывается с числом px.
Бен

Спасибо, этот прием также пригождалось игнорировать «Shift-перетащить» , который поддерживает формат изображения при изменении размера (для горизонтального изменения размера, набор CSS , heightчтобы ''в resizeи stopобработчиков)
nothingisnecessary

18

Очень простое решение:

$( ".selector" ).resizable({ grid: [1, 10000] }); // horizontal
$( ".selector" ).resizable({ grid: [10000, 1] }); // vertical

Это также работает для draggable (). Пример: http://jsfiddle.net/xCepm/


1
Это действительно некрасиво !! Кроме того, правильное решение (то, которое мы должны использовать) - это @Nick Craver's
Diego

1
Я согласен! :-) Но приятно, что он работает с resizable () и draggable ().
января

1
Мне нравится этот! Помимо того, что это круто с математической точки зрения, он оставляет ручку в правом нижнем углу, давая визуальный намек на то, что размер элемента можно изменять. В принятом решении ручка изменения размера скрыта, и пользователь должен догадаться, что нижнее поле является горячей точкой.
corwin.amber

Это идеально по причинам, заявленным @ corwin.amber
Ломбас

Идеально для моих нужд:{handles: 'se', grid: [10000, 1], autoHide: true}
electrotype

9

Решение состоит в том, чтобы настроить ваш размер так, чтобы он отменял изменения размера, который вам не нужен.

вот пример изменения размера только по вертикали:

foo.resizable({
  resize: function(event, ui) { 
    ui.size.width = ui.originalSize.width;
  }      
}); 

Разве это не будет некрасиво?
Диего,

1
Таким образом, пользователь видит дескриптор, который он не может использовать.
Нима

1

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

foo.first().resizable({
    resize: function(event, ui) { 
    ui.element.css('width','auto');
    },
}); 

0

Для меня решения с ручками и resizeобработчиком работали нормально, поэтому пользователь видит дескриптор, но может изменять размер только по горизонтали, аналогичное решение должно работать для вертикального. Без нижнего правого обработчика пользователь может не знать, что он может изменять размер элемента.

При использовании ui.size.height = ui.originalSize.height;он не будет работать должным образом, если элемент изменил свой размер по сравнению с исходным состоянием.

foo.resizable({
    // Handles left right and bottom right corner
    handles: 'e, w, se',
    // Remove height style
    resize: function(event, ui) {
        $(this).css("height", '');
    }
});

Для лучшей производительности $(this)можно было удалить:

var foo = jQuery('#foo');
foo.resizable({
    // Handles left right and bottom right corner
    handles: 'e, w, se',
    // Remove height style
    resize: function(event, ui) {
        foo.css("height", '');
    }
});

0
Successfully working div position Vertically and horizontally
-------------------------------------------------------------

<head>

    <style>
    .resizable {
        height: 100px;
        width: 500px;
        background: #09C;
    }
    .resizable-x {
        height: 100px;
        width: 500px;
        background: #F60;
    }
    </style>

    <script>
     $(function() {

        $( ".resizable" ).resizable({
            grid: [10000, 1]
        });

        $( ".resizable-x " ).resizable({
            grid: [1, 10000]
        });


        $( ".resizable" ).draggable();
        });

      });
        </script>`enter code here`
    </head>

    <body>
    <div class="resizable"></div>
    <div class="resizable-x"></div>
    </body>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.