Es hat nicht alle schicken Rückrufmethoden und Optionen, aber hey, es macht Dinge dragbar (und optional mit einem angegebenen Handle).
(function($) {
$.fn.drags = function(opt) {
opt = $.extend({handle:"",cursor:"move"}, opt);
if(opt.handle === "") {
var $el = this;
} else {
var $el = this.find(opt.handle);
}
return $el.css('cursor', opt.cursor).on("mousedown", function(e) {
if(opt.handle === "") {
var $drag = $(this).addClass('draggable');
} else {
var $drag = $(this).addClass('active-handle').parent().addClass('draggable');
}
var z_idx = $drag.css('z-index'),
drg_h = $drag.outerHeight(),
drg_w = $drag.outerWidth(),
pos_y = $drag.offset().top + drg_h - e.pageY,
pos_x = $drag.offset().left + drg_w - e.pageX;
$drag.css('z-index', 1000).parents().on("mousemove", function(e) {
$('.draggable').offset({
top:e.pageY + pos_y - drg_h,
left:e.pageX + pos_x - drg_w
}).on("mouseup", function() {
$(this).removeClass('draggable').css('z-index', z_idx);
});
});
e.preventDefault(); // disable selection
}).on("mouseup", function() {
if(opt.handle === "") {
$(this).removeClass('draggable');
} else {
$(this).removeClass('active-handle').parent().removeClass('draggable');
}
});
}
})(jQuery);
Verwendung
$('div').drags();
Demo
Siehe den Pen jQuery Draggable ohne jQuery UI von Chris Coyier (@chriscoyier) auf CodePen.
Ich habe nicht gemerkt, dass man Code-Pens in Seiten einfügen kann. Das ist eine wirklich schöne Funktion. Entschuldigen Sie, dass ich vom Thema dieses Beitrags ablenke.
Gute Arbeit bisher.
Ich wollte das gerade anfordern, danke.
(Übrigens würde ich "var $el" und "var $drag" ein paar Zeilen nach oben verschieben, damit "var" nur einmal vorkommt und JSHint nicht meckert... vielleicht könnte das Handle auch tiefer im dragbaren Objekt liegen, .parent() macht es nicht? )
Demo? :\
Schnelle und leichte Alternative zu Jquery UI's draggable!!!!
Oh danke, ich habe immer nach einem einfachen Skript wie diesem gesucht... das NICHT fehlerhaft ist :) Jetzt ist es in diesem Fall sehr einfach, etwas
onDragEndundonDragStarthinzuzufügen.hmm, es tötet
select
Elemente innerhalb eines dragbaren Elternelements, die Optionen erscheinen nicht mehr, wenn Sie auf dieses kleine Dreieck klicken :/ Schaltflächen, Kontrollkästchen und Optionsfelder funktionieren jedoch weiterhin gut.
Wie bringe ich das auf Touch-Geräten zum Laufen?
Hey! Haben Sie eine Lösung gefunden?
Vielen Dank im Voraus! :D
Ja, ich suche auch nach einer Lösung für Touchscreen-Dragbar. ui-draggable bricht, wenn Transform auf dem Element verwendet wird : \
Als Antwort auf Leute, die nach Touch-Support fragen, möchten Sie vielleicht an diesem einfachen Dragbar-Plugin interessiert sein, das ich entwickelt habe und das mit Touch- und Mausereignissen funktioniert: https://github.com/grantm/jquery-udraggable/
Der Touch-Support wird von Michael S. Mikowskis jquery.event.ue-Plugin bereitgestellt.
Es gibt einen kleinen Fehler... Wenn zwei dragbare Elemente auf derselben Seite vorhanden sind, bewegt sich beim ersten Klicken auf eines davon das andere darüber. Das passiert nur beim ersten Klick, danach funktioniert alles wie es soll... Kann mir jemand sagen, wie ich das beheben kann?
Ist kein Fehler. Entfernen Sie set css z-index.
$drag.css(‘z-index’, 1000)
$drag.css(‘z-index’, ‘auto’) funktioniert gut!
Großen Dank an den Entwickler
Ich habe es gelöst, es war mein Fehler, anstatt IDs für jedes dragbare Element zu verwenden, habe ich das Plugin für eine Klasse angewendet und es "draggable" genannt, ich wusste nicht, dass das Plugin diese Klasse benötigt, um das Bewegen bei mousedown/mouseup zu aktivieren/deaktivieren. Entschuldigung, ich habe vergessen, erneut zu kommentieren, wie das Problem gelöst wurde. Das ist wirklich ein gutes Plugin. Gibt es eine Möglichkeit, eine neue Option zu diesem Plugin hinzuzufügen, um einen Button oder so etwas festzulegen, und das Element nur von diesem Button aus bewegen zu können? Ich habe ein "dragbares Panel" mit dynamischem Inhalt, und manchmal benötigt es eine vertikale Scrollleiste, und wenn Sie die Scrollleiste bewegen, bewegt sich auch das Panel. Fürs Erste habe ich das Problem durch Hinzufügen eines Buttons "Dragbar aktivieren/deaktivieren" gelöst.
bekam einen Fehler "TypeError: $el.css("cursor", opt.cursor).on is not a function"
jQuery aktualisieren oder bind statt on verwenden
Dragbar sind großer Spaß. Ich hatte ziemlich viel Spaß damit – http://grafiks101.com . Jetzt, da es die Jahreszeit ist, würde ich gerne eine Routine sehen, die eine Aktion basierend auf dem Drop-Bereich auslöst. Wissen Sie, wie das Verzieren eines Weihnachtsbaums, aber... wenn Sie die Kugel an den falschen Ast hängen, explodiert der Baum!
Spaßige Sache und ich kann Ihnen gar nicht sagen, wie viel ich von css-tricks.com gelernt habe!!
Wie soll ich das Handle benutzen? Ich habe ein Popup und möchte, dass der Header als Handle dient und das gesamte Popup dragbar ist.
Vergessen zu erwähnen, dass ich versucht habe, "$.extend({handle:".drag_handle",cursor:"move"}, opt);" zu verwenden, aber es funktioniert nicht.
Entschuldigung Leute.... es war mein Fehler. Es ist erledigt.
Dieser Dragbar-Trick ist großartig! Gibt es eine Möglichkeit, einen kleinen Button innerhalb des dragbaren Objekts einzufügen, um es zu schließen?
Ich habe "altmodisch aussehende Dialogboxen" auf meiner Website - http://www.stefangougherty.com , die dragbar und wichtiger noch schließbar sind. Leider hat das alte JavaScript, das sie aktiviert, mit der !DOCTYPE-Information im Header kollidiert, sodass ich das entfernen musste, was für die korrekte Leistung meiner Website in IE entscheidend war.
Irgendein Rat? (Ich kenne nur grundlegendes HTML und CSS, war aber ziemlich erfolgreich darin, kompliziertere Dinge zu "Reverse-Engineering")
Danke!!!
Ich habe ein seltsames Verhalten in Internet Explorer, bei dem der Cursor zu "Kann hier nicht ziehen" wird und das Ziehen erfordert, dass ich wegklicke, es wird gezogen, aber mit Verzögerungen.
Ähm, müssen Sie mousemove nicht irgendwo unbinden? Sobald Sie mit dem Ziehen beginnen, stoppen die Trigger nie. Die Bewegung stoppt, weil die .draggable-Klasse entfernt wird, aber die Trigger feuern weiter?
*-pike
Ich schätze diesen Code wirklich. Ein paar kleinere Kritikpunkte / Fragen...
Warum eine Klasse auf das ziehende Element setzen? Um es während des Ziehens hervorzuheben?
Warum die Variablen drg_w, drg_h verwenden? Diese können einfach ohne Auswirkungen entfernt werden.
Warum konvertiert diese Blog-Software dooftastisch Unterstriche in Kursivschrift? ;)
Warum entfernt diese Blog-Software dooftastisch führende Bindestriche?
Das ist genial! Ich habe eine schnelle Frage – wie kann ich es ein- und ausschalten?
wie in draggable können wir $element.draggable('option','disabled',true/false) tun;
Gibt es hierfür eine Möglichkeit?
Funktioniert nicht mit Win8 & IE10!
Ich bin auf ein Problem mit diesem Skript gestoßen: Versuchen Sie, etwas aus der mouseup-Funktion in Zeile 28 auszugeben, und Sie werden sehen, dass die spezifische Funktion nicht nur jedes Mal aufgerufen wird, wenn das mousemove-Ereignis (Zeile 23) ausgelöst wird, sondern multipliziert damit, wie oft das mousedown-Ereignis (Zeile 12) ausgelöst wird, da der mouseup-Listener innerhalb der mousedown-Funktion (Zeile 12) aufgerufen wird. Dies kann zu ernsthaften Leistungsproblemen führen, nachdem Sie die Box das 4. bis 5. Mal irgendwohin gezogen haben.
Ich habe selbst etwas Ähnliches geschrieben – was halten Sie von meiner Lösung?
Entschuldigung, wenn das viel zu spät ist (was es ist), aber ich habe den gesamten Code genauso eingegeben, wie er hier steht, nur um ihn auszuprobieren, und aus irgendeinem Grund wurde er nicht dragbar. Gibt es einen Fehler?
Genau das, was ich brauchte, vielen Dank Chris.
Fantastisch!
Hey großartige Arbeit!! Aber können Sie mir die Erklärung dafür geben oder haben Sie eine Dokumentation zu dieser Arbeit, ich bin begierig darauf, das zu erfahren, da ich Neuling in JavaScript bin, weshalb ich nach all dem frage.
Das ist gut! Funktioniert perfekt im Chrome-Browser. Aber wie kann es modifiziert werden, damit es für Touch-Geräte funktioniert?
Gibt es eine Möglichkeit, dass dies hinter einem Div-Element funktioniert?
Hey Chris, ich bin ein großer Fan deiner Tricks. Ich habe 2 DIVs, die nebeneinander mit gleicher Höhe und Breite verschachtelt sind und dazwischen eine Trennlinie ist. Kannst du mir einen Tipp geben, wie ich diese Trennlinie dragbar machen kann, sodass sich die Breite jedes DIVs ändert, wenn wir diese Trennlinie ziehen, also 50% 50% die Trennlinie nach rechts ziehen und zum Beispiel die Breite auf 30% 70% ändern.
Die mousemove-Ereignisse feuern weiter. Sie müssen
mouseupüber das Fensterobjekt auslösen. Direkt vor$drag....parents().on('mousemove', ...schreiben SieSchöner Tipp Arthur, danke.
$(window).unbind(‘mouseup’);
verwenden Sie kein mouseup....
Das ist, was ich bisher daraus gemacht habe. Es hat wahrscheinlich immer noch ein paar Fehler, aber für meine Zwecke gefällt es mir besser als der jQuery UI Dragger.
define(function(require, exports, module) {(function($) {
$.fn.drags = function(opt) {
var originalZ = null,
thisDrag = this,
pos = null,
dragger, $el, $parents;
function sortConstraint(x) {
if (x != null) {
x.sort();
}
}
function startChildEvents(isActive) {
$this = $(thisDrag);
var onOff = isActive ? "on" : "off";
$drag = (opt.handle === "") ?
$this.toggleClass('draggable', isActive)
$this.toggleClass('active-handle', isActive).parent().toggleClass('draggable', isActive);
if (originalZ == null) { originalZ = $drag.css('z-index'); }
$parents = $drag.css('z-index', isActive ? 1001 : originalZ).parents();
$parents[onOff]("mousemove", mouseMove);
$el[onOff]("mouseup", mouseUp);
$el.css('cursor', isActive ? opt.cursor : "default");
}
function mouseEnd(e) {
$drag.css('z-index', originalZ);
startChildEvents(false);
var movedLeft = (pos.current.left - pos.start.left) < 0;
if(opt.handle === "") {
$(this).removeClass('draggable');
} else {
$(this).removeClass('active-handle').parent().removeClass('draggable');
}
if (opt.autoEnd) {
dragger.start(false);
}
opt.onEndMove({ movedLeft: movedLeft })
}
function mouseDown(e) {
startChildEvents(true);
pos.current = $drag.offset();
pos.start = pos.current;
pos.click = { y: e.pageY, x: e.pageX };
e.preventDefault(); // disable selection
}
function mouseMove(e) {
var endMove = (opt.xMaxMove != null && Math.abs(pos.current.left - pos.start.left) > opt.xMaxMove);
pos.current = {
top: (opt.axis == "x" ? pos.start.top : pos.start.top + e.pageY - pos.click.y),
left:(opt.axis == "y" ? pos.start.left: pos.start.left + e.pageX - pos.click.x)
};
if (opt.xConstrain != null) {
var xDiff = pos.current.left - pos.reference.left;
if (xDiff < opt.xConstrain[0]){
pos.current.left = pos.reference.left + opt.xConstrain[0];
endMove = true;
} else if (xDiff > opt.xConstrain[1]) {
pos.current.left = pos.reference.left + + opt.xConstrain[1];
endMove = true;
}
}
endMove = (endMove || opt.yMaxMove != null && Math.abs(pos.current.top - pos.start.top) > opt.yMaxMove);
if (opt.yConstrain != null) {
var yDiff = pos.current.top - pos.reference.top;
if (yDiff < opt.yConstrain[0]){
pos.current.top = pos.reference.top + opt.yConstrain[0];
endMove = true;
} else if (yDiff > opt.yConstrain[1]) {
pos.current.top = pos.reference.top + + opt.yConstrain[1];
endMove = true;
}
}
$d = $('.draggable');
if (endMove) { mouseEnd(); } else {
$d.offset(pos.current);
}
}
function mouseUp(e) {
$(this).removeClass('draggable').css('z-index', originalZ);
}
dragger = {
start: function(start, newPos) {
if (pos == null) {
var cc = $el.offset();
pos = { start: cc, current: cc, reference: cc };
}
if (typeof newPos != "undefined") {
pos = $.extend(pos, newPos);
}
$el[start ? "on" : "off"]("mousedown", mouseDown);
if (! start) {
startChildEvents(false);
}
}
}
opt = $.extend({
handle:"",
cursor:"move",
axis: null,
autoStart: true,
autoEnd: false,
xMaxMove: null,
yMaxMove: null,
xConstrain: null,
yConstrain: null,
allowDrag: function() { return true; },
onEndMove: function() {}
}, opt);
sortConstraint(opt.xConstrain);
sortConstraint(opt.yConstrain);
$el = (opt.handle === "") ? $el = this : this.find(opt.handle);
$el.dragger = dragger;
if (opt.autoStart) { dragger.start(true); }
return $el
}
})(jQuery);
});
Ein Update des vorherigen Codes. Dieser kann nun mit einem Klickereignis übergeben werden, das ausgelöst wird, wenn die Maus nur wenige Pixel oder weniger gezogen wird. Beide verwenden einfachere Mathematik als das hier gepostete Original, aber die Gesamtstruktur ist dem Original sehr ähnlich. Er hat auch viel mehr Funktionen als das Original, aber die Art und Weise, wie er Einschränkungen handhabt, ist viel einfacher zu handhaben als der jqueryUI-Dragger.
Es gibt ein inhärentes Problem beim Ziehen eines Panels mit input[type=range]-Steuerelementen, nämlich dass Sie die Bereichsschieberegler nicht verwenden können, da das mousedown-Ereignis abgefangen wird und stattdessen das Panel gezogen wird. Also habe ich eine kleine Lösung geschrieben: dragsOff, mit JQuery's hover-Methode.
Und natürlich, dragsOff
Schön!
Hallo,
Ich hatte dasselbe Problem (wegen des Range-Inputs), aber ich wollte kein Jquery verwenden. Was ich gemacht habe, ist einfach, das draggable-Attribut beim mousedown zu ändern.
Und dann
Um Input-Elemente (Text, Textarea, Range-Slider...) innerhalb des dragbaren Containers zum Laufen zu bringen, entfernen Sie einfach die Anweisungen e.preventDefault();
Brillant! Vielen Dank, ich habe das stundenlang gesucht... :)
Ich verstehe den obigen Code, um ein Bild zu ziehen, aber was ist, wenn ich ein Video-Streaming (WebRTC-Client-Video) dragbar machen möchte?
Ich habe das Skript zur Unterstützung von Touch-Ereignissen bearbeitet... wahrscheinlich nicht kugelsicher, aber es funktioniert für mich.
http://pastebin.com/wVzEqG7i
Sir, wie kann man das Ziehen deaktivieren, wenn Texte in einem Input-Element innerhalb des dragbaren Divs ausgewählt werden? Danke!
Wie kann ich einen Handler angeben? Ich bin neu in jQuery und habe Ihre Erklärung nicht verstanden. Danke
Ich musste dies auf ein Element mit Links anwenden. Im Original folgt es beim Abschluss des Ziehens einem Link, wenn der Benutzer dort gegriffen hat, um das Ziehen zu beginnen/beenden. Diese Version fügt nur ein paar Zeilen hinzu, um das Folgen eines Links zu verhindern, wenn die (versehentliche) Bewegung sehr gering war. Außerdem ermöglicht sie die Arbeit mit Elementen, die mit bottom oder right in ihren CSS positioniert sind.
http://codepen.io/swinggraphics/pen/cxmbj
Wie füge ich **Easing** dafür hinzu?
Dieser Code hat ein ernstes Leistungsproblem, das Sie sehen können, wenn Sie das Objekt mehrmals ziehen, wobei es jedes Mal immer langsamer wird.
Dies liegt daran, dass bei jedem Klick des Benutzers auf das gezogene Objekt ein neuer mousemove-Ereignis-Handler "darüber" gebunden wird. Wenn Sie das Objekt 10 Mal gezogen haben, werden 10 redundante mousemove-Handler den Cursor verfolgen, daher die Verzögerung.
Geoffrey Swensons Code behebt dieses Problem, da er den Ereignis-Handler nach jedem Beenden des Ziehens durch den Benutzer bereinigt. Ich würde jedem empfehlen, seinen Schnipsel anstelle des Originals zu verwenden.
Schauen Sie sich meine Lösung an – https://gist.github.com/NazarkinRoman/12654be37a35ca006375
Es gibt eine gerade behobene Version des Codes. Nicht umgeschrieben, so dass die Verwendung immer noch gleich ist.
Textarea innerhalb des dragbaren Elements wird nicht mehr bearbeitbar, musste zurück zu UI's draggable() wechseln.
Gibt es eine Möglichkeit, das dragbare Element auf die Größe seines Elterndivs zu beschränken?
Damit es nicht vom Bildschirm weggezogen werden kann?
jQuery UI kann das. Ich habe das Gefühl, sobald man ausgefallenere Extras braucht, ist es besser, etwas Robusteres wie jQuery UI oder Dragabilly zu verwenden als diesen einfachen Code oben.
Jedes Mal, wenn ein "mousedown"-Ereignis aufgerufen wird, wird ein "mousemove"-Ereignis-Handler hinzugefügt?
Der Code funktioniert sehr gut. Aber ich möchte nur ein Klickereignis hinzufügen, das verhindert werden sollte, wenn das Element gezogen wird. Kann mir jemand eine einfache Lösung geben?
Ein kleine Optimierung, unnötige Breite und Höhe entfernen, besserer Ereignishandler
und der Handler wird nur an das Dokument angehängt, anstatt an alle seine Eltern.
Demo http://jsbin.com/vuhasika/1/edit
Beide Versionen müssen die Drag-Funktion mit
return this;abschließen, sonst ist sie nicht kettebar.Und wenn man es mit mehr als einem auf einer Seite testet, stellt man fest, dass sie beim Ziehen alle an den Ort des ersten verschoben werden.
Sehr gut, danke
Ich denke, das wird besser und schneller funktionieren als jquery ui
Das ist ein großartiges Stück Code. Genau das, was ich brauchte.
Ich möchte eine Korrektur vorschlagen
Wenn die Option {handle: ___} verwendet wird, wird die jQuery-Verkettung unterbrochen, da sie zum Handle-Element wechselt, anstatt auf demselben Element zu bleiben.
Um das zu beheben, ändern Sie diese Zeile
return $el.css('cursor', opt.cursor).on("mousedown", function(e) {zu
$el.css('cursor', opt.cursor).on("mousedown", function(e) {und ändern Sie die Endzeilen zu diesem
Ich brauche nichts Ähnliches mehr seit der DHTML-Ära, und ich bin überrascht, dass es so wenige leichtgewichtige (wenige Zeilen) Lösungen dafür gibt. Danke an Chris und die wunderbaren Kommentatoren, hier folgt ein weiterer Ansatz, der hauptsächlich auf **Wing**s Optimierungen basiert, aber für mehrere Elemente angepasst ist, im Gegensatz zu seinem Original.
Handler- und Cursor-Optionen wurden entfernt, da ich in meinem Projekt keinen Zweck dafür sah, aber als Bonus funktioniert es gut mit Elementen, bei denen **bottom** oder **right** Attribute gesetzt sind.
auch auf Gist verfügbar: https://gist.github.com/Arty2/11199162
Kommentare und Vorschläge sind natürlich willkommen
Diese Demo funktioniert großartig. Aber wenn ich sie auf meiner Seite implementiere, ist beim Ziehen des Elements der Geister-Drag-Artikel ein riesiger Teil der Seite, nicht nur das LI, das gezogen wird. Mir ist auch aufgefallen, dass, wenn ich viele dieser dragbaren Elemente habe, andere Funktionalitäten auf der Seite (Reorderlist) sehr, sehr langsam werden. Irgendwelche Gedanken?? Danke!
Update-Problem 1 wurde durch Entfernen eines Kindes mit absoluter Positionierung innerhalb des gezogenen LI behoben.
Kann die Klickfunktion in dragbaren Div-Bereichen nicht funktionieren
Das ist wunderschön. Großartige Arbeit
Nettes Code, vielen Dank für das Teilen. Eine Frage
Oft hat man ein Container-Div und viele Child-Divs darin, wie 'header', 'main', 'footer' und ...
Gibt es eine Möglichkeit, all diese (Container und seine Kinder) zu ziehen, wenn man eines von ihnen wie das 'header'-Div zieht?
Beachten Sie, dass der obige Originalcode hervorragend funktioniert, AUSSER dass jeder Drag, den Sie machen, den Browser immer mehr verlangsamt. Um dies zu beheben, fügen Sie ein
.off('event')direkt vor jedem.onAufruf hinzu.Wie würde der Code aussehen, um WordPress Posts, Seiten und Kategorien in ihren Listen nach oben oder unten zu ziehen? Ich suche nach Code, den ich zu einem benutzerdefinierten Functions-Plugin hinzufügen kann, das ich erstelle. (Anstatt ein bestehendes Plugin zu verwenden, wäre es schön, den benötigten Code dafür und auch die CSS zu erhalten.)
Einen Schritt weiter (wenn das in Ordnung ist).
Schließen eines Baumastes. Wenn der Benutzer viele Kinder hat, wäre es schön, einen Ast zu schließen, um Platz zu sparen. Zum Beispiel, indem die Möglichkeit besteht, einen Seitenast, einen Kategorieast usw. zu schließen.
Dieses Stück Code funktioniert perfekt für mich. Ich habe eine Frage.
Gibt es eine Möglichkeit, dies auf einem Mobilgerät ohne jQuery Mobile zu verwenden?
Wie viele vor mir habe auch ich eine eigene Lösung. Mit Touch-Unterstützung.
Obwohl die Struktur des Codes sehr ähnlich ist, habe ich diesen Beitrag tatsächlich erst kürzlich bemerkt. Aber er hat mich dazu gebracht, zu lernen, wie man jQuery-Bibliothekserweiterungen schreibt. Bisher ist es nur eine Funktion (kein Plugin)
http://codepen.io/Shikkediel/pen/ZYbWzL
Wenn ich die Kommentare lese, denke ich, dass Arthurs Tipp zum Aufheben der Bindung von mousemove lohnenswert war, also habe ich das auch implementiert. Für die meisten anderen genannten Probleme denke ich, dass eine Lösung im Skript hinzugefügt wurde.
Zuvor griff ich auf die notwendigen Teile von jQuery UI zurück, um ein ziehbares Element zu erstellen, kombiniert mit Touch Punch in der Hoffnung auf browserübergreifende Kompatibilität.
Schön zu sehen, dass diese Version tatsächlich auf meinem Handy funktioniert, aber wenn mehrere ziehbare Elemente auf der Seite sind, werden sie alle bewegt, wenn eines bewegt wird.
Ich habe mit der Heracles-Version angefangen und bin zu einer funktionierenden iOS- und Android-Version gekommen. Siehe den Code
Das scheint perfekt zu sein, danke!
Diese hier funktioniert, sogar auf meinem Handy, aber es ist ärgerlich, dass das Element nach dem Ziehen ein wenig nach unten auf der Seite zu rutschen scheint. Das ist wirklich die Transformation scale(1.1). Man kann beim Ziehen nicht präzise sein, wenn sich die Größe ändert.
Außerdem erstellst du, wie im Code, auf dem dies basiert, eine globale Variable namens stack.
Auf Mobilgeräten ist diese Version aufgrund der Prüfung auf kleine Bewegungen bei kleinen Elementen schwieriger zu verwenden. Ich habe die Seite mehr gescrollt, als das Element zu ziehen.
Es scheint, dass die Leistung nicht so gut ist, es laggt...
Danke, slavap, für den Code, er war sehr nützlich. Aber wie kann ich ein Klickereignis erkennen? Ich erstelle ein Datumsscroll (ähnlich wie bei mobiscroll) und möchte den Wert des angeklickten Elements zurückgeben.
Gibt es keine Methode, um zu verhindern, dass sich ziehbare Elemente überlappen?
Ich benutze dieses Plugin, aber es hat einen großen Fehler, wenn das als ziehbar definierte Element ein weiteres Element enthält. Die Auswahl funktioniert einfach nicht mehr (zumindest in Chrome). Außerdem gefällt mir das UX-Problem nicht, dass, wenn der Benutzer „den Ziehvorgang“ auf einem Eingabe- oder Schaltflächenelement beginnt, der Ziehvorgang ausgeführt wird und dann der Mausklick ausgeführt wird.
Ich ziehe es vor, einige Elemente vom Starten des Ziehereignisses auszuschließen, also habe ich dieses Plugin geforkt, um eine Abbruchoption zu haben, ähnlich wie bei jQuery-UI: https://github.com/pjfsilva/dte-project/blob/master/jquery-draggable/draggable.js
Jetzt funktioniert es und die Benutzererfahrung ist verbessert. Standardmäßig sind Abbruchelemente: a,input,textarea,button,select,option
Haben Sie einen Demo-Link?
Vielleicht könnte jemand tatsächlich einen Drag-and-Drop von Beiträgen und Seiten in WordPress erstellen. Wenn sich jemand berufen fühlt... schauen Sie mal bei
https://core.trac.wordpress.org/ticket/2702
http://easywebdesigntutorials.com/drag-and-drop-page-ordering-in-a-tree-page-view-wordpress/
Es ist kurz, aber mächtig
Ich habe eine funktionierende Demo meiner Version auf GitHub https://github.com/geewhizbang/jQueryDragger
Diese hier funktioniert bei mir nicht. Bei mehreren ziehbaren Elementen auf einer Seite bewegt das Ziehen eines Elements alle zur Position des ersten. Und auch nach dem Loslassen der Maustaste folgen sie weiter dem Cursor.
Und es behandelt keine Touch-Ereignisse.
jQuery UI funktioniert auf Mobilgeräten, dieses hier nicht. Kann man nicht vergleichen