Drag n' Drop für HTML Elemente
Um Elemente einer Seite frei positionieren zu können braucht es eine Mischung auf Java-Script und Styling-Information mit CSS.
Dieses Beispiel ist in purem Java-Script ohne JQuery geschrieben!
Styling
Das gewünschte Element muss über die Styling Information
position: absolute; positioniert werden. Dies bewirkt, dass das Element vom Fluss des Dokumentes genommen und darüber positioniert wird. Mit den
Richtungsangaben top,
bottom,
left und
right kann das absolut positionierte Element im Rahmen des Viewports positioniert werden.
Java-Script
Wie gesagt ist Java-Script für die wenigsten Einsätze sinnvoll, da es oft andere, geeignetere Technologien gibt.
Zum Beispiel kann man mittels CSS-Eigenschaft position: absolute; (und den dazugehörigen Eigenschaften top, left, top, bottom) HTML-Elemente frei auf dem Viewport, ausserhalb des normalen Inhaltes der Seite positionieren. Die frei positionierten Elemente geben der Seite viel Schwung. Aber dennoch wirken sie zu statisch und unbeweglich. Man möchte also ein bisschen mehr Einfluss (Eigenheit) auf die Seite bringen und die Elemente umrangieren.
Java-Script kann hier perfekt eingesetzt werden um die Positionierungs CSS-Eigenschaften der Element mit jedem Maus-Klick anzupassen.
Code
<script type="text/javascript">
window.onload = function() {
var elements = new Array(
document.getElementById('mandrake'),
document.getElementById('feather'),
document.getElementById('pergamentSmall'),
document.getElementById('sphere'),
document.getElementById('horn')
);
for(var i = 0; i < elements.length; ++i) {
if(elements[i] == null) continue;
elements[i].onmousedown = function(downEvent) {
grab(downEvent, this);
return false;
}
}
fixSearch();
}
function fixSearch() {
document.getElementById('search').onmousedown = function(downEvent) {
document.getElementById('sphere').onmousedown = null;
}
document.getElementById('search').onmouseout = function(downEvent) {
document.getElementById('sphere').onmousedown = function(downEvent) {
grab(downEvent, this);
return false; // Keine browserspezifischen, weiteren Aktionen (vor allem für Firefox)
}
}
}
function grab(event, element) {
var cursorXPositionInElement = getCursorXPositionInElement(event, element);
var cursorYPositionInElement = getCursorYPositionInElement(event, element);
document.onmousemove = function(moveEvent) {
elementPositioning(moveEvent, element, cursorXPositionInElement, cursorYPositionInElement);
return false;
}
document.onmouseup = drop;
}
function elementPositioning(event, element, cursorXPositionInElement, cursorYPositionInElement) {
element.style.left = getCursorXPosition(event)-cursorXPositionInElement+'px';
element.style.top = getCursorYPosition(event)-cursorYPositionInElement+'px';
}
function drop() {
document.onmousemove = null;
document.onmouseup = null;
}
function getCursorXPositionInElement(event, element) {
return getCursorXPosition(event)-getElementXPosition(element);
}
function getCursorYPositionInElement(event, element) {
return getCursorYPosition(event)-getElementYPosition(element);
}
function getCursorXPosition(event) {
if(!event) event = window.event;
return event.pageX ? event.pageX : event.clientX + window.document.body.scrollLeft;
}
function getCursorYPosition(event) {
if(!event) event = window.event;
return event.pageY ? event.pageY : event.clientY + window.document.body.scrollTop;
}
function getElementXPosition(element) {
return element.offsetLeft;
}
function getElementYPosition(element) {
return element.offsetTop;
}
</script>