PageSourceSearch

https://www.desarrollarme.com/wp-content/themes/troika/js/SmoothScroll.js?ver=1.0.0

js desarrollarme.com collected 2026-10-08 11:45:26 UTC 12,214 bytes, 434 lines download raw bytes

vendor: 10,143 bytes, lines 1-356
1jQuery(document).ready(function($){
2
3// SmoothScroll v0.9.9
4// Licensed under the terms of the MIT license.
5
6// People involved
7// - Balazs Galambosi: maintainer (CHANGELOG.txt)
8// - Patrick Brunner ([email protected])
9// - Michael Herf: ssc_pulse Algorithm
10
11// Scroll Variables (tweakable)
12var ssc_framerate = 150; // [Hz]
13var ssc_animtime  = 500; // [px]
14var ssc_stepsize  = 150; // [px]
15
16// ssc_pulse (less tweakable)
17// ratio of "tail" to "acceleration"
18var ssc_pulseAlgorithm = true;
19var ssc_pulseScale     = 6;
20var ssc_pulseNormalize = 1;
21
22// Keyboard Settings
23var ssc_keyboardsupport = true;
24var ssc_arrowscroll     = 50; // [px]
25
26// Other Variables
27var ssc_frame = false;
28var ssc_direction = { x: 0, y: 0 };
29var ssc_initdone  = false;
30var ssc_fixedback = true;
31var ssc_root = document.documentElement;
32var ssc_activeElement;
33
34var ssc_key = { left: 37, up: 38, right: 39, down: 40, spacebar: 32, pageup: 33, pagedown: 34, end: 35, home: 36 };
35
36/***********************************************
37 * INITIALIZE
38 ***********************************************/
39
40/**
41 * Sets up scrolls array, determines if ssc_frames are involved.
42 */
43function ssc_init() {
44    
45    if (!document.body) return;
46
47    var body = document.body;
48    var html = document.documentElement;
49    var windowHeight = window.innerHeight; 
50    var scrollHeight = body.scrollHeight;
51    
52    // check compat mode for ssc_root element
53    ssc_root = (document.compatMode.indexOf('CSS') >= 0) ? html : body;
54    ssc_activeElement = body;
55    
56    ssc_initdone = true;
57
58    // Checks if this script is running in a ssc_frame
59    if (top != self) {
60        ssc_frame = true;
61    }
62
63    /**
64     * This fixes a bug where the areas left and right to 
65     * the content does not trigger the onmousewheel event
66     * on some pages. e.g.: html, body { height: 100% }
67     */
68    else if (scrollHeight > windowHeight &&
69            (body.offsetHeight <= windowHeight || 
70             html.offsetHeight <= windowHeight)) {
71        ssc_root.style.height = "auto";
72        if (ssc_root.offsetHeight <= windowHeight) {
73            var underlay = document.createElement("div"); 	
74            underlay.style.clear = "both";
75            body.appendChild(underlay);
76        }
77    }
78    
79    if (!ssc_fixedback) {
80        body.style.backgroundAttachment = "scroll";
81        html.style.backgroundAttachment = "scroll";
82    }
83    
84    if (ssc_keyboardsupport) {
85        ssc_addEvent("keydown", ssc_keydown);
86    }
87}
88
89
90/************************************************
91 * SCROLLING 
92 ************************************************/
93 
94var ssc_que = [];
95var ssc_pending = false;
96
97/**
98 * Pushes scroll actions to the scrolling queue.
99 */
100function ssc_scrollArray(elem, left, top, delay) {
101    
102    delay || (delay = 1000);
103    ssc_directionCheck(left, top);
104    
105    // push a scroll command
106    ssc_que.push({
107        x: left, 
108        y: top, 
109        lastX: (left < 0) ? 0.99 : -0.99,
110        lastY: (top  < 0) ? 0.99 : -0.99, 
111        start: +new Date
112    });
113        
114    // don't act if there's a ssc_pending queue
115    if (ssc_pending) {
116        return;
117    }
118            
119    var step = function() {
120        
121        var now = +new Date;
122        var scrollX = 0;
123        var scrollY = 0; 
124    
125        for (var i = 0; i < ssc_que.length; i++) {
126            
127            var item = ssc_que[i];
128            var elapsed  = now - item.start;
129            var finished = (elapsed >= ssc_animtime);
130            
131            // scroll position: [0, 1]
132            var position = (finished) ? 1 : elapsed / ssc_animtime;
133            
134            // easing [optional]
135            if (ssc_pulseAlgorithm) {
136                position = ssc_pulse(position);
137            }
138            
139            // only need the difference
140            var x = (item.x * position - item.lastX) >> 0;
141            var y = (item.y * position - item.lastY) >> 0;
142            
143            // add this to the total scrolling
144            scrollX += x;
145            scrollY += y;            
146            
147            // update last values
148            item.lastX += x;
149            item.lastY += y;
150        
151            // delete and step back if it's over
152            if (finished) {
153                ssc_que.splice(i, 1); i--;
154            }           
155        }
156
157        // scroll left
158        if (left) {
159            var lastLeft = elem.scrollLeft;
160            elem.scrollLeft += scrollX;
161            
162            // scroll left failed (edge)
163            if (scrollX && elem.scrollLeft === lastLeft) {
164                left = 0;
165            }
166        }
167
168        // scroll top
169        if (top) {
170            var lastTop = elem.scrollTop;
171            elem.scrollTop += scrollY;
172            
173            // scroll top failed (edge)
174            if (scrollY && elem.scrollTop === lastTop) {
175                top = 0;
176            }            
177        }
178        
179        // clean up if there's nothing left to do
180        if (!left && !top) {
181            ssc_que = [];
182        }
183        
184        if (ssc_que.length) { 
185            setTimeout(step, delay / ssc_framerate + 1);
186        } else { 
187            ssc_pending = false;
188        }
189    }
190    
191    // start a new queue of actions
192    setTimeout(step, 0);
193    ssc_pending = true;
194}
195
196
197/***********************************************
198 * EVENTS
199 ***********************************************/
200
201/**
202 * Mouse ssc_wheel handler.
203 * @param {Object} event
204 */
205function ssc_wheel(event) {
206
207    if (!ssc_initdone) {
208        init();
209    }
210    
211    var target = event.target;
212    var overflowing = ssc_overflowingAncestor(target);
213    
214    // use default if there's no overflowing
215    // element or default action is prevented    
216    if (!overflowing || event.defaultPrevented ||
217        ssc_isNodeName(ssc_activeElement, "embed") ||
218       (ssc_isNodeName(target, "embed") && /\.pdf/i.test(target.src))) {
219        return true;
220    }
221
222    var deltaX = event.wheelDeltaX || 0;
223    var deltaY = event.wheelDeltaY || 0;
224    
225    // use wheelDelta if deltaX/Y is not available
226    if (!deltaX && !deltaY) {
227        deltaY = event.wheelDelta || 0;
228    }
229
230    // scale by step size
231    // delta is 120 most of the time
232    // synaptics seems to send 1 sometimes
233    if (Math.abs(deltaX) > 1.2) {
234        deltaX *= ssc_stepsize / 120;
235    }
236    if (Math.abs(deltaY) > 1.2) {
237        deltaY *= ssc_stepsize / 120;
238    }
239    
240    ssc_scrollArray(overflowing, -deltaX, -deltaY);
241    event.preventDefault();
242}
243
244/**
245 * ssc_keydown event handler.
246 * @param {Object} event
247 */
248function ssc_keydown(event) {
249
250    var target   = event.target;
251    var modifier = event.ctrlKey || event.altKey || event.metaKey;
252    
253    // do nothing if user is editing text
254    // or using a modifier ssc_key (except shift)
255    if ( /input|textarea|embed/i.test(target.nodeName) ||
256         target.isContentEditable || 
257         event.defaultPrevented   ||
258         modifier ) {
259      return true;
260    }
261    // spacebar should trigger button press
262    if (ssc_isNodeName(target, "button") &&
263        event.keyCode === ssc_key.spacebar) {
264      return true;
265    }
266    
267    var shift, x = 0, y = 0;
268    var elem = ssc_overflowingAncestor(ssc_activeElement);
269    var clientHeight = elem.clientHeight;
270
271    if (elem == document.body) {
272        clientHeight = window.innerHeight;
273    }
274
275    switch (event.keyCode) {
276        case ssc_key.up:
277            y = -ssc_arrowscroll;
278            break;
279        case ssc_key.down:
280            y = ssc_arrowscroll;
281            break;         
282        case ssc_key.spacebar: // (+ shift)
283            shift = event.shiftKey ? 1 : -1;
284            y = -shift * clientHeight * 0.9;
285            break;
286        case ssc_key.pageup:
287            y = -clientHeight * 0.9;
288            break;
289        case ssc_key.pagedown:
290            y = clientHeight * 0.9;
291            break;
292        case ssc_key.home:
293            y = -elem.scrollTop;
294            break;
295        case ssc_key.end:
296            var damt = elem.scrollHeight - elem.scrollTop - clientHeight;
297            y = (damt > 0) ? damt+10 : 0;
298            break;
299        case ssc_key.left:
300            x = -ssc_arrowscroll;
301            break;
302        case ssc_key.right:
303            x = ssc_arrowscroll;
304            break;            
305        default:
306            return true; // a ssc_key we don't care about
307    }
308
309    ssc_scrollArray(elem, x, y);
310    event.preventDefault();
311}
312
313/**
314 * ssc_mousedown event only for updating ssc_activeElement
315 */
316function ssc_mousedown(event) {
317    ssc_activeElement = event.target;
318}
319
320
321/***********************************************
322 * OVERFLOW
323 ***********************************************/
324 
325var ssc_cache = {}; // cleared out every once in while
326setInterval(function(){ ssc_cache = {}; }, 10 * 1000);
327
328var ssc_uniqueID = (function() {
329    var i = 0;
330    return function (el) {
331        return el.ssc_uniqueID || (el.ssc_uniqueID = i++);
332    };
333})();
334
335function ssc_setCache(elems, overflowing) {
336    for (var i = elems.length; i--;)
337        ssc_cache[ssc_uniqueID(elems[i])] = overflowing;
338    return overflowing;
339}
340
341function ssc_overflowingAncestor(el) {
342    var elems = [];
343    var ssc_rootScrollHeight = ssc_root.scrollHeight;
344    do {
345        var cached = ssc_cache[ssc_uniqueID(el)];
346        if (cached) {
347            return ssc_setCache(elems, cached);
348        }
349        elems.push(el);
350        if (ssc_rootScrollHeight === el.scrollHeight) {
351            if (!ssc_frame || ssc_root.clientHeight + 10 < ssc_rootScrollHeight) {
352                return ssc_setCache(elems, document.body); // scrolling ssc_root in WebKit
353            }
354        } else if (el.clientHeight + 10 < el.scrollHeight) {
355            overflow = getComputedStyle(el, "").getPropertyValue("overflow");
356            if (overflow === "scroll" || overflow === "auto") {
357                return ssc_setCache(elems, el);
358            }
359        }
360    } while (el = el.parentNode);
361}
362
363
364/***********************************************
365 * HELPERS
366 ***********************************************/
367
368function ssc_addEvent(type, fn, bubble) {
369    window.addEventListener(type, fn, (bubble||false));
370}
371
372function ssc_removeEvent(type, fn, bubble) {
373    window.removeEventListener(type, fn, (bubble||false));  
374}
375
376function ssc_isNodeName(el, tag) {
377    return el.nodeName.toLowerCase() === tag.toLowerCase();
378}
379
380function ssc_directionCheck(x, y) {
381    x = (x > 0) ? 1 : -1;
382    y = (y > 0) ? 1 : -1;
383    if (ssc_direction.x !== x || ssc_direction.y !== y) {
384        ssc_direction.x = x;
385        ssc_direction.y = y;
386        ssc_que = [];
387    }
388}
389
390
391/***********************************************
392 * ssc_pulse
393 ***********************************************/
394 
395/**
396 * Viscous fluid with a ssc_pulse for part and decay for the rest.
397 * - Applies a fixed force over an interval (a damped acceleration), and
398 * - Lets the exponential bleed away the velocity over a longer interval
399 * - Michael Herf, http://stereopsis.com/stopping/
400 */
401function ssc_pulse_(x) {
402    var val, start, expx;
403    // test
404    x = x * ssc_pulseScale;
405    if (x < 1) { // acceleartion
406        val = x - (1 - Math.exp(-x));
407    } else {     // tail
408        // the previous animation ended here:
409        start = Math.exp(-1);
410        // simple viscous drag
411        x -= 1;
412        expx = 1 - Math.exp(-x);
413        val = start + (expx * (1 - start));
414    }
415    return val * ssc_pulseNormalize;
416}
417
418function ssc_pulse(x) {
419    if (x >= 1) return 1;
420    if (x <= 0) return 0;
421
422    if (ssc_pulseNormalize == 1) {
423        ssc_pulseNormalize /= ssc_pulse_(1);
424    }
425    return ssc_pulse_(x);
426}
427
428$.browser.chrome = /chrome/.test(navigator.userAgent.toLowerCase()); 
429if ( $.browser.chrome ) {
430	ssc_addEvent("mousedown", ssc_mousedown);
431	ssc_addEvent("mousewheel", ssc_wheel);
432	ssc_addEvent("load", ssc_init);
433 }
434});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.