|
1 | 1 | /*!
|
2 |
| - * jQuery Smooth Scroll - v2.0.1 - 2016-09-07 |
| 2 | + * jQuery Smooth Scroll - v2.1.1 - 2017-01-01 |
3 | 3 | * https://github.com/kswedberg/jquery-smooth-scroll
|
4 |
| - * Copyright (c) 2016 Karl Swedberg |
| 4 | + * Copyright (c) 2017 Karl Swedberg |
5 | 5 | * Licensed MIT
|
6 | 6 | */
|
7 | 7 |
|
|
18 | 18 | }
|
19 | 19 | }(function($) {
|
20 | 20 |
|
21 |
| - var version = '2.0.1'; |
| 21 | + var version = '2.1.1'; |
22 | 22 | var optionOverrides = {};
|
23 | 23 | var defaults = {
|
24 | 24 | exclude: [],
|
|
124 | 124 | return scrollable;
|
125 | 125 | };
|
126 | 126 |
|
| 127 | + var rRelative = /^([\-\+]=)(\d+)/; |
127 | 128 | $.fn.extend({
|
128 | 129 | scrollable: function(dir) {
|
129 | 130 | var scrl = getScrollable.call(this, {dir: dir});
|
|
222 | 223 | }
|
223 | 224 | });
|
224 | 225 |
|
| 226 | + var getExplicitOffset = function(val) { |
| 227 | + var explicit = {relative: ''}; |
| 228 | + var parts = typeof val === 'string' && rRelative.exec(val); |
| 229 | + |
| 230 | + if (typeof val === 'number') { |
| 231 | + explicit.px = val; |
| 232 | + } else if (parts) { |
| 233 | + explicit.relative = parts[1]; |
| 234 | + explicit.px = parseFloat(parts[2]) || 0; |
| 235 | + } |
| 236 | + |
| 237 | + return explicit; |
| 238 | + }; |
| 239 | + |
225 | 240 | $.smoothScroll = function(options, px) {
|
226 | 241 | if (options === 'options' && typeof px === 'object') {
|
227 | 242 | return $.extend(optionOverrides, px);
|
228 | 243 | }
|
229 |
| - var opts, $scroller, scrollTargetOffset, speed, delta; |
| 244 | + var opts, $scroller, speed, delta; |
| 245 | + var explicitOffset = getExplicitOffset(options); |
| 246 | + var scrollTargetOffset = {}; |
230 | 247 | var scrollerOffset = 0;
|
231 | 248 | var offPos = 'offset';
|
232 | 249 | var scrollDir = 'scrollTop';
|
233 | 250 | var aniProps = {};
|
234 | 251 | var aniOpts = {};
|
235 | 252 |
|
236 |
| - if (typeof options === 'number') { |
| 253 | + console.log(explicitOffset); |
| 254 | + |
| 255 | + if (explicitOffset.px) { |
237 | 256 | opts = $.extend({link: null}, $.fn.smoothScroll.defaults, optionOverrides);
|
238 |
| - scrollTargetOffset = options; |
239 | 257 | } else {
|
240 | 258 | opts = $.extend({link: null}, $.fn.smoothScroll.defaults, options || {}, optionOverrides);
|
241 | 259 |
|
|
246 | 264 | opts.scrollElement.css('position', 'relative');
|
247 | 265 | }
|
248 | 266 | }
|
| 267 | + |
| 268 | + if (px) { |
| 269 | + explicitOffset = getExplicitOffset(px); |
| 270 | + } |
249 | 271 | }
|
250 | 272 |
|
251 | 273 | scrollDir = opts.direction === 'left' ? 'scrollLeft' : scrollDir;
|
252 | 274 |
|
253 | 275 | if (opts.scrollElement) {
|
254 | 276 | $scroller = opts.scrollElement;
|
255 | 277 |
|
256 |
| - if (!(/^(?:HTML|BODY)$/).test($scroller[0].nodeName)) { |
| 278 | + if (!explicitOffset.px && !(/^(?:HTML|BODY)$/).test($scroller[0].nodeName)) { |
257 | 279 | scrollerOffset = $scroller[scrollDir]();
|
258 | 280 | }
|
259 | 281 | } else {
|
|
263 | 285 | // beforeScroll callback function must fire before calculating offset
|
264 | 286 | opts.beforeScroll.call($scroller, opts);
|
265 | 287 |
|
266 |
| - scrollTargetOffset = (typeof options === 'number') ? options : |
267 |
| - px || |
268 |
| - ($(opts.scrollTarget)[offPos]() && |
269 |
| - $(opts.scrollTarget)[offPos]()[opts.direction]) || |
270 |
| - 0; |
| 288 | + scrollTargetOffset = explicitOffset.px ? explicitOffset : { |
| 289 | + relative: '', |
| 290 | + px: ($(opts.scrollTarget)[offPos]() && $(opts.scrollTarget)[offPos]()[opts.direction]) || 0 |
| 291 | + }; |
| 292 | + |
| 293 | + aniProps[scrollDir] = scrollTargetOffset.relative + (scrollTargetOffset.px + scrollerOffset + opts.offset); |
271 | 294 |
|
272 |
| - aniProps[scrollDir] = scrollTargetOffset + scrollerOffset + opts.offset; |
273 | 295 | speed = opts.speed;
|
274 | 296 |
|
275 | 297 | // automatically calculate the speed of the scroll based on distance / coefficient
|
|
0 commit comments