Как сделать 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" />