Hvis du kan ændre strukturen, så du udelader dine 'placeholders', bliver løsningen en del enklere. I så fald er her et hurtigt skud fra hoften, du kan bruge til inspiration:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Untitled Document</title>
<style type="text/css">
body {
margin: 0;
padding: 0;
font: 12px verdana, arial, sans-serif;
}
.overallContainer {
position: relative;
width: 140px;
padding: 0 2px;
border: 2px solid #666;
list-style: none;
}
.overallContainer * {
cursor: move;
}
.overallContainer .bokse {
padding: 4px 15px;
margin: 1px 0;
border: 1px solid #ccc;
}
.wide {
width: 200px;
}
.wide .bokse {
padding: 2px 25px;
margin: 2px 0;
border: 1px solid #ccc;
}
</style>
<script type="text/javascript">
// Hide form global scope
(function(W) { // W refers to the window object
var dragEnabled = false,
elmDrag = null,
elmClone = null,
elmParent = null,
pos = 0,
maxTopPos = 0;
// Helper to find a parent element with a specific className
function findParent(elm, className, elmBoundary) {
while (elm!==elmBoundary) {
if (elm.className===className) return elm;
elm = elm.parentNode;
}
return null;
}
// Create a semi transparent box to drag. Called on mousedown.
function createClone() {
elmClone = document.createElement("div");
elmClone.style.cssText = "position:absolute;left:2px;right:2px;background:#09f;opacity:0.3";
}
// Event handlers
function dragMove(e) {
if (!dragEnabled) return;
var newTop = e.clientY-pos;
elmClone.style.top = (newTop<0 ? 0 : (newTop>maxTopPos ? maxTopPos : newTop)) + "px";
}
function dragUp() {
if (!dragEnabled) return;
elmDrag.style.opacity = 1;
var cloneTop = elmClone.offsetTop;
elmParent.removeChild(elmClone);
if (cloneTop<1) { // First
elmParent.insertBefore(elmDrag, elmParent.firstChild);
} else {
var a = elmParent.childNodes;
for (var i=a.length-1; i>=0; i--) {
if (a[i].nodeName.toLowerCase()!=="div") continue;
if (a[i].offsetTop<cloneTop) {
if (a[i].offsetTop+a[i].offsetHeight<cloneTop) { // Last
elmParent.appendChild(elmDrag);
} else {
elmParent.insertBefore(elmDrag, a[i].nextSibling);
}
break;
}
}
}
dragEnabled = false;
}
// Set event handlers on document object
if (document.addEventListener) {
document.addEventListener("mousemove", dragMove, false);
document.addEventListener("mouseup", dragUp, false);
} else {
document.attachEvent("onmousemove", dragMove);
document.attachEvent("onmouseup", dragUp);
}
// Make the setDrag function available from the global scope
W.setDrag = function(elmCont, e) {
elmDrag = findParent(e.target||e.srcElement, "bokse", elmCont);
if (!elmDrag) return;
if (!elmClone) createClone();
pos = e.clientY-elmDrag.offsetTop;
elmParent = elmCont;
elmDrag.style.opacity = 0.3;
elmClone.style.height = elmDrag.offsetHeight+"px";
elmClone.style.top = elmDrag.offsetTop+"px";
elmParent.appendChild(elmClone);
maxTopPos = elmParent.clientHeight - elmClone.offsetHeight;
dragEnabled = true;
e.cancelBubble = true;
e.returnValue = false;
if (e.stopPropagation) e.stopPropagation();
if (e.preventDefault) e.preventDefault();
};
})(window);
</script>
</head>
<body>
<div style="padding:100px">
<div class="overallContainer" onmousedown="setDrag(this, event)">
<div class="bokse" id="boks1">Boks nummer 1</div>
<div class="bokse" id="boks2">Boks nummer 2</div>
<div class="bokse" id="boks3">Boks nummer 3</div>
<div class="bokse" id="boks4">Boks nummer 4</div>
<div class="bokse" id="boks5">Boks nummer 5</div>
<div class="bokse" id="boks6">Boks nummer 6</div>
</div>
<hr>
<div class="overallContainer wide" onmousedown="setDrag(this, event)">
<div class="bokse" id="boks7">Boks nummer 7</div>
<div class="bokse" id="boks8">Boks nummer 8</div>
<div class="bokse" id="boks9">Boks nummer 9</div>
<div class="bokse" id="boks10">Boks nummer 10</div>
<div class="bokse" id="boks11">Boks nummer 11</div>
<div class="bokse" id="boks12">Boks nummer 12</div>
</div>
</div>
</body>
</html>
Det kan gøres med væsentligt mindre kode med jQuery, men det lærer du ikke så meget JavaScript af =)