我有两个要素:
1。固定身高的父级overflow:hidden
2。它的孩子,固定高度较大。
<style type="text/css">
.myList {list-style:none; margin:0px; padding:1px;}
.myList li{ height:50px; margin:4px; padding:2px;}
.dragPanel {height:230px; border:solid; overflow:hidden;}
</style>
<div class="dragPanel">
<ul class="myList">
<li>1</li>
<li>2</li>
... ....
<li>8</li>
<li>9</li>
</ul>
</div>
我希望能够在父div中上下拖动列表。我使用jquery ui draggable插件来实现verticle拖动,但我不确定如何约束父div中的列表。
<script type="text/javascript" src="http://jqueryui.com/latest/jquery-1.3.2.js"></script>
<script type="text/javascript" src="http://jqueryui.com/latest/ui/ui.core.js"></script>
<script type="text/javascript" src="http://jqueryui.com/latest/ui/ui.draggable.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$('.dragPanel').addClass("hover");
$('.myList').draggable({ axis: 'y' });
});
</script>
如何为列表的位置设置垂直上限和下限?
答案 0 :(得分:9)
$('.myList').draggable({
axis: 'y',
containment: 'parent'
});
答案 1 :(得分:7)
我遇到了同样的问题,答案对我没有帮助。一些javascript后来我认为以下是一个更好的解决方案。
(有人知道如何将其变成jQuery插件吗?)
<!DOCTYPE html>
<html>
<head>
<title>Draggable limited to the container</title>
<style type="text/css">
#container {
cursor: move;
overflow: hidden;
width: 300px;
height: 300px;
border: 1px solid black;
}
</style>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js"></script>
<script type="text/javascript">
$(function() {
$.globalVars = {
originalTop: 0,
originalLeft: 0,
maxHeight: $("#draggable").height() - $("#container").height(),
maxWidth: $("#draggable").width() - $("#container").width()
};
$("#draggable").draggable({
start: function(event, ui) {
if (ui.position != undefined) {
$.globalVars.originalTop = ui.position.top;
$.globalVars.originalLeft = ui.position.left;
}
},
drag: function(event, ui) {
var newTop = ui.position.top;
var newLeft = ui.position.left;
if (ui.position.top < 0 && ui.position.top * -1 > $.globalVars.maxHeight) {
newTop = $.globalVars.maxHeight * -1;
}
if (ui.position.top > 0) {
newTop = 0;
}
if (ui.position.left < 0 && ui.position.left * -1 > $.globalVars.maxWidth) {
newLeft = $.globalVars.maxWidth * -1;
}
if (ui.position.left > 0) {
newLeft = 0;
}
ui.position.top = newTop;
ui.position.left = newLeft;
}
});
});
</script>
</head>
<body>
<div id="container">
<img id="draggable" src="avatar.jpg" />
</div>
</body>
</html>
答案 2 :(得分:3)
确定,
这是我走下去的路线......
当页面加载时,我在可拖动列表周围添加一个容器div。我把它的高度设置为列表的两倍,然后将它放在页面上一点点:
<script type="text/javascript">
$(document).ready(function() {
CreateContainerDiv();
$('.dragPanel').addClass("hover");
$('.myList').draggable({ axis: 'y', containment: 'parent' });
});
function CreateContainerDiv() {
var dragPanel = $('.dragPanel');
var dragTarget = $('.myList');
// add the container panel
var newPanelHeight = dragTarget.outerHeight() * 2 - dragPanel.outerHeight();
dragTarget.wrap(document.createElement("div"));
// set its height and put it in the right place
dragTarget.parent().css("height", newPanelHeight);
dragTarget.parent().css("position", "relative");
var newPanelPosition = ((dragTarget.outerHeight() * -1) / 2);
dragTarget.parent().css("top", newPanelPosition);
}
</script>
然后该列表包含在这个新元素中。
这似乎可以完成这项工作,但如果列表中应用了任何填充/边距,则定位会有点不对劲。对此的任何想法都会被贬低!
------编辑---------
好的,我想我已经解决了安置问题。我把它变成了一个插件,所以其他人不必花时间创建这个功能。
答案 3 :(得分:0)
您不必为此类结构拖动任何内容。你需要的是设置父div与overflow-x:hidden;和overflow-y:scroll;。这样,它的内容将是可滚动的。
如果你想隐藏滚动条,只需输入以下属性:.dragPanel :: - webkit-scrollbar {width:0!important}就是这样!我真的不知道你为什么要考虑拖动元素而不只是滚动内容(这是执行这种“问题”的正确方法)。无论如何,我希望它可以帮助任何需要适合同样需要的人。问候!