Установка z-индекса на перетаскиваемые элементы
Я пытаюсь установить z-index для перетаскиваемых элементов с помощью jQuery. Вы можете видеть, о чем я говорю, и о том, что у меня есть до сих пор:
http://jsfiddle.net/sushik/LQ4JT/1/
Это очень примитивно, и с ним возникают проблемы. Любые идеи о том, как я сделал бы последний элемент с кликом, имеют самый высокий индекс z и вместо того, чтобы сбросить все остальное на базу z-index
, попросите их сделать шаг, поэтому второй с последним нажатием имеет второй самый высокий z-index
, и т.д.
Еще одна проблема, с которой я столкнулся, заключается в том, что она работает только с полным кликом, но перетаскиваемая функциональность работает, щелкая и удерживая нажатой клавишу. Как я мог применить класс к этому первоначальному клику и не дожидаться события отпускания клика?
Ответы
Ответ 1
Я обновил свой CSS и Javascript. Не используйте "! Important" в css, если вы не так сильно отчаялись.
http://jsfiddle.net/LQ4JT/7/
$(document).ready(function() {
var a = 3;
$('#box1,#box2,#box3,#box4').draggable({
start: function(event, ui) { $(this).css("z-index", a++); }
});
$('#dragZone div').click(function() {
$(this).addClass('top').removeClass('bottom');
$(this).siblings().removeClass('top').addClass('bottom');
$(this).css("z-index", a++);
});
});
Хотя этот ответ работает, он имеет ограничение максимального числа 2 ^ 31-1 в javascript.
refer Что такое максимальное целочисленное значение JavaScript, которое Number может идти без потери точности? для получения дополнительной информации.
Ответ 2
Все, что вам нужно сделать, это использовать draggable({stack: "div"})
Теперь, когда вы перетаскиваете div, он автоматически перейдет в начало.
Ответ 3
Следующий код будет соответствовать вашим требованиям. Вам нужно stack
ваш divs
вместо установки z-indexes
, а во-вторых, вам нужно показать div сверху, просто щелкнув по нему, не перетаскивая его.
Итак, для стекирования вам нужно stack: "div"
и для отображения элемента div сверху, просто нажмите, вам нужно использовать distance: 0
.
По умолчанию значение distance: 10
означает, что до тех пор, пока вы не перетащите его 10 pixels
, он не будет отображаться вверху. Установив значение distance: 0
, он будет отображаться сверху после простого нажатия.
Попробуйте использовать следующий код.
$('#box1,#box2,#box3,#box4').draggable({
stack: "div",
distance: 0
});
Рабочий JSFiddle Здесь.
Изменить:
Нажмите кнопку Run code snippet ниже, чтобы выполнить этот встроенный фрагмент кода.
$(document).ready(function() {
$('#box1,#box2,#box3,#box4').draggable({
stack: "div",
distance: 0
});
$('#dragZone div').click(function() {
$(this).addClass('top').removeClass('bottom');
$(this).siblings().removeClass('top').addClass('bottom');
});
});
#box1 {
width: 150px;
height: 150px;
background-color: red;
position: absolute;
top: 0px;
left: 0px;
z-index: 0
}
#box2 {
width: 150px;
height: 150px;
background-color: green;
position: absolute;
top: 20px;
left: 50px;
z-index: 0
}
#box3 {
width: 150px;
height: 150px;
background-color: yellow;
position: absolute;
top: 50px;
left: 100px;
z-index: 0
}
#box4 {
width: 150px;
height: 150px;
background-color: blue;
position: absolute;
top: 70px;
left: 200px;
z-index: 0
}
.top {
z-index: 100!important;
position: relative
}
.bottom {
z-index: 10!important;
position: relative
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script src="http://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
<div id="dragZone">
<div id="box1"></div>
<div id="box2"></div>
<div id="box3"></div>
<div id="box4"></div>
</div>
Ответ 4
Самый простой способ решить эту проблему - использовать опции appendTo и zIndex.
$('#box1,#box2,#box3,#box4').draggable({
appendTo: "body",
zIndex: 10000
});
Ответ 5
Вот очень упрощенная версия ответа Махеша:
$(document).ready(function() {
var a = 1;
$('#box1,#box2,#box3,#box4,#box5,#box6,#box7').draggable({
start: function(event, ui) { $(this).css("z-index", a++); }
});
});
http://jsfiddle.net/LQ4JT/713/
Кажется, что все работает хорошо, если я не пропущу что-то.