Skip to content

Commit 91e3fa0

Browse files
committed
Add relative scroll feature
1 parent 80e9fc7 commit 91e3fa0

File tree

1 file changed

+32
-10
lines changed

1 file changed

+32
-10
lines changed

src/jquery.smooth-scroll.js

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@
105105
return scrollable;
106106
};
107107

108+
var rRelative = /^([\-\+]=)(\d+)/;
108109
$.fn.extend({
109110
scrollable: function(dir) {
110111
var scrl = getScrollable.call(this, {dir: dir});
@@ -203,20 +204,37 @@
203204
}
204205
});
205206

207+
var getExplicitOffset = function(val) {
208+
var explicit = {relative: ''};
209+
var parts = typeof val === 'string' && rRelative.exec(val);
210+
211+
if (typeof val === 'number') {
212+
explicit.px = val;
213+
} else if (parts) {
214+
explicit.relative = parts[1];
215+
explicit.px = parseFloat(parts[2]) || 0;
216+
}
217+
218+
return explicit;
219+
};
220+
206221
$.smoothScroll = function(options, px) {
207222
if (options === 'options' && typeof px === 'object') {
208223
return $.extend(optionOverrides, px);
209224
}
210-
var opts, $scroller, scrollTargetOffset, speed, delta;
225+
var opts, $scroller, speed, delta;
226+
var explicitOffset = getExplicitOffset(options);
227+
var scrollTargetOffset = {};
211228
var scrollerOffset = 0;
212229
var offPos = 'offset';
213230
var scrollDir = 'scrollTop';
214231
var aniProps = {};
215232
var aniOpts = {};
216233

217-
if (typeof options === 'number') {
234+
console.log(explicitOffset);
235+
236+
if (explicitOffset.px) {
218237
opts = $.extend({link: null}, $.fn.smoothScroll.defaults, optionOverrides);
219-
scrollTargetOffset = options;
220238
} else {
221239
opts = $.extend({link: null}, $.fn.smoothScroll.defaults, options || {}, optionOverrides);
222240

@@ -227,14 +245,18 @@
227245
opts.scrollElement.css('position', 'relative');
228246
}
229247
}
248+
249+
if (px) {
250+
explicitOffset = getExplicitOffset(px);
251+
}
230252
}
231253

232254
scrollDir = opts.direction === 'left' ? 'scrollLeft' : scrollDir;
233255

234256
if (opts.scrollElement) {
235257
$scroller = opts.scrollElement;
236258

237-
if (!(/^(?:HTML|BODY)$/).test($scroller[0].nodeName)) {
259+
if (!explicitOffset.px && !(/^(?:HTML|BODY)$/).test($scroller[0].nodeName)) {
238260
scrollerOffset = $scroller[scrollDir]();
239261
}
240262
} else {
@@ -244,13 +266,13 @@
244266
// beforeScroll callback function must fire before calculating offset
245267
opts.beforeScroll.call($scroller, opts);
246268

247-
scrollTargetOffset = (typeof options === 'number') ? options :
248-
px ||
249-
($(opts.scrollTarget)[offPos]() &&
250-
$(opts.scrollTarget)[offPos]()[opts.direction]) ||
251-
0;
269+
scrollTargetOffset = explicitOffset.px ? explicitOffset : {
270+
relative: '',
271+
px: ($(opts.scrollTarget)[offPos]() && $(opts.scrollTarget)[offPos]()[opts.direction]) || 0
272+
};
273+
274+
aniProps[scrollDir] = scrollTargetOffset.relative + (scrollTargetOffset.px + scrollerOffset + opts.offset);
252275

253-
aniProps[scrollDir] = scrollTargetOffset + scrollerOffset + opts.offset;
254276
speed = opts.speed;
255277

256278
// automatically calculate the speed of the scroll based on distance / coefficient

0 commit comments

Comments
 (0)