Как сделать div ширину перетаскиваемой?

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

Div arrangement

Я хотел бы добавить перетаскиваемый дескриптор в левую границу дочернего div, чтобы дочерний div мог быть изменен по ширине. Должен ли я добавить еще один очень узкий div, где левая граница расположена так, что ее можно перетащить, а позиция пересчитана для динамического изменения свойства ширины дочернего divs?

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

Ответы

Ответ 1

Я думаю, что это то, что вы ищете

handle: Какие дескрипторы могут использоваться для изменения размера.

Пример: $( ".selector" ).resizable({ handles: "n, e, s, w" });

HTML:

<div class="parent">
    <div class="child"></div>
</div>

CSS

.parent {
    position: relative;
    width: 800px;
    height: 500px;
    background: #000;
}
.child {
    position: absolute;
   right: 0;
    top: 0;
    width: 200px;
    height: 100%;        
    background: #ccc;
}

JS:

$('.child').resizable({
    handles: 'n,w,s,e',
    minWidth: 200,
    maxWidth: 400
});

проверьте этот JSFiddle

EDIT: Решена проблема css, Обновлен скрипт

Ответ 2

Это можно сделать довольно легко с помощью vanilla jQuery, так сказать. Я предлагаю использовать более эффективный макет разметки, иначе вы столкнетесь с некоторыми проблемами относительной позиции/размера.

Я бы использовал один контейнер и 2 ребенка. У одного из детей (второго или правого) будет ручка, прозрачная, но маленькая. Для jQuery вы просто присоедините событие мыши вниз к этому дескриптору и соответствующим образом измените размеры других детей. Вот примерно, как это будет выглядеть.

HTML

<div id="container">
    <!-- Left side -->
    <div id="left"> This is the left side content! </div>
    <!-- Right side -->
    <div id="right">
        <!-- Actual resize handle -->
        <div id="handle"></div> This is the right side content!
    </div>
</div>

JavaScript

var isResizing = false,
    lastDownX = 0;

$(function () {
    var container = $('#container'),
        left = $('#left'),
        right = $('#right'),
        handle = $('#handle');

    handle.on('mousedown', function (e) {
        isResizing = true;
        lastDownX = e.clientX;
    });

    $(document).on('mousemove', function (e) {
        // we don't want to do anything if we aren't resizing.
        if (!isResizing) 
            return;

        var offsetRight = container.width() - (e.clientX - container.offset().left);

        left.css('right', offsetRight);
        right.css('width', offsetRight);
    }).on('mouseup', function (e) {
        // stop resizing
        isResizing = false;
    });
});

JSFiddle

Ответ 3

Используйте взаимодействие с jQuery UI Resizable, как указано в комментарии. Взгляните на этот пример: http://jqueryui.com/resizable/#max-min

EDIT: Чтобы заблокировать его только для изменения ширины, установите minHeight равным maxHeight. Вероятно, это возможно.

Код из приведенного выше примера:

$(function() {
  $( "#resizable" ).resizable({
    minHeight: 250,
    maxHeight: 250,
    minWidth: 200,
    maxWidth: 350
  });
});

ИЗМЕНИТЬ 2: Для приведения в действие обрабатываются любые разные способы: прочитайте документ http://api.jqueryui.com/resizable/#option-handles

Ответ 4

Попробуйте этот код..

$('.child').resizable({
    handles: 'w'
});

Затем вы можете добавить max и min Width

Ответ 5

Вы также можете присоединить обработчик событий, как показано ниже, что полезно, если вы хотите что-то сделать в начале или в конце изменения размера.

$("#resizeableElementId").resizable({handles: 'n,w,s,e', minWidth: 200, maxWidth: 600}); 

$("#resizeableElementId").on( "resizestop", function( event, ui ) {

    console.log('resize ended');
    console.dir(event);

});

Помните, что вам нужно также включить jQuery UI; загрузите его и добавьте что-то вроде этого:

<link rel="stylesheet" type="text/css" href="jquery-ui-1.11.1.custom/jquery-ui.min.css" />