Skip to content

Commit 7b3b36b

Browse files
committed
Calculate snap, restrict offsets once at start
1 parent 6bae046 commit 7b3b36b

File tree

1 file changed

+42
-36
lines changed

1 file changed

+42
-36
lines changed

interact.js

Lines changed: 42 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,9 @@
7171
tapTime = 0, // time of the most recent tap event
7272
prevTap = null,
7373

74-
startOffset = { left: 0, right: 0, top: 0, bottom: 0 },
74+
startOffset = { left: 0, right: 0, top: 0, bottom: 0 },
75+
restrictOffset = { left: 0, right: 0, top: 0, bottom: 0 },
76+
snapOffset = { x: 0, y: 0},
7577

7678
tmpXY = {}, // reduce object creation in getXY()
7779

@@ -2000,16 +2002,6 @@
20002002
status.realX = page.x;
20012003
status.realY = page.y;
20022004

2003-
var elementOffsetX = 0,
2004-
elementOffsetY = 0;
2005-
2006-
if (snap.elementOrigin) {
2007-
var rect = target.getRect();
2008-
2009-
elementOffsetX = startOffset.left + (rect.width * snap.elementOrigin.x);
2010-
elementOffsetY = startOffset.top + (rect.height * snap.elementOrigin.y);
2011-
}
2012-
20132005
// change to infinite range when range is negative
20142006
if (snap.range < 0) { snap.range = Infinity; }
20152007

@@ -2047,8 +2039,8 @@
20472039

20482040
range = typeof anchor.range === 'number'? anchor.range: snap.range;
20492041

2050-
dx = anchor.x - page.x + elementOffsetX;
2051-
dy = anchor.y - page.y + elementOffsetY;
2042+
dx = anchor.x - page.x + snapOffset.x;
2043+
dy = anchor.y - page.y + snapOffset.y;
20522044
distance = hypot(dx, dy);
20532045

20542046
inRange = distance < range;
@@ -2093,11 +2085,11 @@
20932085
status.dy = closest.dy;
20942086
}
20952087
else if (snap.mode === 'grid') {
2096-
var gridx = Math.round((page.x - snap.gridOffset.x - elementOffsetX) / snap.grid.x),
2097-
gridy = Math.round((page.y - snap.gridOffset.y - elementOffsetY) / snap.grid.y),
2088+
var gridx = Math.round((page.x - snap.gridOffset.x - snapOffset.x) / snap.grid.x),
2089+
gridy = Math.round((page.y - snap.gridOffset.y - snapOffset.y) / snap.grid.y),
20982090

2099-
newX = gridx * snap.grid.x + snap.gridOffset.x + elementOffsetX,
2100-
newY = gridy * snap.grid.y + snap.gridOffset.y + elementOffsetY;
2091+
newX = gridx * snap.grid.x + snap.gridOffset.x + snapOffset.x,
2092+
newY = gridy * snap.grid.y + snap.gridOffset.y + snapOffset.y;
21012093

21022094
dx = newX - page.x;
21032095
dy = newY - page.y;
@@ -2145,18 +2137,6 @@
21452137
status.dy = 0;
21462138
status.restricted = false;
21472139

2148-
var elementOffset = { top: 0, left: 0, bottom: 0, right: 0};
2149-
2150-
if (restrict.elementRect) {
2151-
var elementRect = target.getRect();
2152-
2153-
elementOffset.left = startOffset.left - (elementRect.width * restrict.elementRect.left);
2154-
elementOffset.top = startOffset.top - (elementRect.height * restrict.elementRect.top);
2155-
2156-
elementOffset.right = startOffset.right - (elementRect.width * (1 - restrict.elementRect.right));
2157-
elementOffset.bottom = startOffset.bottom - (elementRect.height * (1 - restrict.elementRect.bottom));
2158-
}
2159-
21602140
var rect;
21612141

21622142
if (restriction === 'parent') {
@@ -2189,8 +2169,8 @@
21892169
}
21902170
}
21912171

2192-
status.dx = Math.max(Math.min(rect.right - elementOffset.right , page.x), rect.left + elementOffset.left) - page.x;
2193-
status.dy = Math.max(Math.min(rect.bottom - elementOffset.bottom, page.y), rect.top + elementOffset.top ) - page.y;
2172+
status.dx = Math.max(Math.min(rect.right - restrictOffset.right , page.x), rect.left + restrictOffset.left) - page.x;
2173+
status.dy = Math.max(Math.min(rect.bottom - restrictOffset.bottom, page.y), rect.top + restrictOffset.top ) - page.y;
21942174
status.restricted = true;
21952175

21962176
return status;
@@ -2313,13 +2293,39 @@
23132293
if (starting) {
23142294
prevEvent = downEvent;
23152295

2316-
var rect = target.getRect() || { left: 0, right: 0, top: 0, bottom: 0 };
2296+
var rect = target.getRect(),
2297+
snap = target.options.snap,
2298+
restrict = target.options.restrict;
23172299

2318-
startOffset.left = startCoords.pageX - rect.left;
2319-
startOffset.top = startCoords.pageY - rect.top;
2300+
if (rect) {
2301+
startOffset.left = startCoords.pageX - rect.left;
2302+
startOffset.top = startCoords.pageY - rect.top;
23202303

2321-
startOffset.right = rect.right - startCoords.pageX;
2322-
startOffset.bottom = rect.bottom - startCoords.pageY;
2304+
startOffset.right = rect.right - startCoords.pageX;
2305+
startOffset.bottom = rect.bottom - startCoords.pageY;
2306+
}
2307+
else {
2308+
startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;
2309+
}
2310+
2311+
if (rect && snap.elementOrigin) {
2312+
snapOffset.x = startOffset.left + (rect.width * snap.elementOrigin.x);
2313+
snapOffset.y = startOffset.top + (rect.height * snap.elementOrigin.y);
2314+
}
2315+
else {
2316+
snapOffset.x = snapOffset.y = 0;
2317+
}
2318+
2319+
if (rect && restrict.elementRect) {
2320+
restrictOffset.left = startOffset.left - (rect.width * restrict.elementRect.left);
2321+
restrictOffset.top = startOffset.top - (rect.height * restrict.elementRect.top);
2322+
2323+
restrictOffset.right = startOffset.right - (rect.width * (1 - restrict.elementRect.right));
2324+
restrictOffset.bottom = startOffset.bottom - (rect.height * (1 - restrict.elementRect.bottom));
2325+
}
2326+
else {
2327+
restrictOffset.left = restrictOffset.top = restrictOffset.right = restrictOffset.bottom = 0;
2328+
}
23232329
}
23242330

23252331
if (!shouldRestrict) {

0 commit comments

Comments
 (0)