Skip to content

Commit

Permalink
#1599: Support for transforms on ghost element
Browse files Browse the repository at this point in the history
  • Loading branch information
owen-m1 committed Sep 6, 2019
1 parent 4f17fb0 commit 1c7847b
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 15 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ Demo: http://sortablejs.github.io/Sortable/
* Advanced swap detection
* Smooth animations
* [Multi-drag](https://github.com/SortableJS/Sortable/tree/master/plugins/MultiDrag) support
* Support for CSS transforms
* Built using native HTML5 drag and drop API
* Supports
* [Meteor](https://github.com/SortableJS/meteor-sortablejs)
Expand Down
50 changes: 42 additions & 8 deletions src/Sortable.js
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,10 @@ let dragEl,

tapEvt,
touchEvt,
lastDx,
lastDy,
tapDistanceLeft,
tapDistanceTop,

moved,

Expand Down Expand Up @@ -548,6 +552,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
el = _this.el,
options = _this.options,
ownerDocument = el.ownerDocument,
dragRect = getRect(target),
dragStartFn;

if (target && !dragEl && (target.parentNode === el)) {
Expand All @@ -566,6 +571,9 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
clientY: (touch || evt).clientY
};

tapDistanceLeft = tapEvt.clientX - dragRect.left;
tapDistanceTop = tapEvt.clientY - dragRect.top;

this._lastX = (touch || evt).clientX;
this._lastY = (touch || evt).clientY;

Expand Down Expand Up @@ -789,8 +797,7 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
+ (relativeScrollOffset ? (relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0]) : 0) / (scaleX || 1),
dy = ((touch.clientY - tapEvt.clientY)
+ fallbackOffset.y) / (scaleY || 1)
+ (relativeScrollOffset ? (relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1]) : 0) / (scaleY || 1),
translate3d = evt.touches ? 'translate3d(' + dx + 'px,' + dy + 'px,0)' : 'translate(' + dx + 'px,' + dy + 'px)';
+ (relativeScrollOffset ? (relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1]) : 0) / (scaleY || 1);

// only set the status to dragging, when we are actually dragging
if (!Sortable.active && !awaitingDragStarted) {
Expand All @@ -802,12 +809,33 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
this._onDragStart(evt, true);
}

touchEvt = touch;
if (ghostEl) {
if (ghostMatrix) {
ghostMatrix.e += dx - (lastDx || 0);
ghostMatrix.f += dy - (lastDy || 0);
} else {
ghostMatrix = {
a: 1,
b: 0,
c: 0,
d: 1,
e: dx,
f: dy
};
}

let cssMatrix = `matrix(${ghostMatrix.a},${ghostMatrix.b},${ghostMatrix.c},${ghostMatrix.d},${ghostMatrix.e},${ghostMatrix.f})`;

css(ghostEl, 'webkitTransform', cssMatrix);
css(ghostEl, 'mozTransform', cssMatrix);
css(ghostEl, 'msTransform', cssMatrix);
css(ghostEl, 'transform', cssMatrix);

css(ghostEl, 'webkitTransform', translate3d);
css(ghostEl, 'mozTransform', translate3d);
css(ghostEl, 'msTransform', translate3d);
css(ghostEl, 'transform', translate3d);
lastDx = dx;
lastDy = dy;

touchEvt = touch;
}

evt.cancelable && evt.preventDefault();
}
Expand Down Expand Up @@ -866,9 +894,13 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
css(ghostEl, 'zIndex', '100000');
css(ghostEl, 'pointerEvents', 'none');


Sortable.ghost = ghostEl;

container.appendChild(ghostEl);

// Set transform-origin
css(ghostEl, 'transform-origin', (tapDistanceLeft / parseInt(ghostEl.style.width) * 100) + '% ' + (tapDistanceTop / parseInt(ghostEl.style.height) * 100) + '%');
}
},

Expand Down Expand Up @@ -1476,7 +1508,9 @@ Sortable.prototype = /** @lends Sortable.prototype */ {
el.checked = true;
});

savedInputChecked.length = 0;
savedInputChecked.length =
lastDx =
lastDy = 0;
},

handleEvent: function (/**Event*/evt) {
Expand Down
18 changes: 11 additions & 7 deletions src/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -109,14 +109,18 @@ function css(el, prop, val) {

function matrix(el, selfOnly) {
let appliedTransforms = '';
do {
let transform = css(el, 'transform');
if (typeof(el) === 'string') {
appliedTransforms = el;
} else {
do {
let transform = css(el, 'transform');

if (transform && transform !== 'none') {
appliedTransforms = transform + ' ' + appliedTransforms;
}
/* jshint boss:true */
} while (!selfOnly && (el = el.parentNode));
if (transform && transform !== 'none') {
appliedTransforms = transform + ' ' + appliedTransforms;
}
/* jshint boss:true */
} while (!selfOnly && (el = el.parentNode));
}

const matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix;
/*jshint -W056 */
Expand Down

0 comments on commit 1c7847b

Please sign in to comment.