Mercurial > pub > site.implab
view public_html/static/js/implab/sticky.js @ 16:e69c970c3ddd default tip
sync
author | sergey |
---|---|
date | Tue, 20 May 2014 01:28:48 +0400 |
parents | d9551c7e7101 |
children |
line wrap: on
line source
define([ 'dojo/on', 'dojo/dom-geometry', 'dojo/dom-style' ], function(on, g, css) { /** * @param [Dom|string] * stiker element to become a sticker */ return function(sticker, options) { var dh, pos; var pos = g.position(sticker, true); var clientWidth = g.position(document.body).w; var stickRight = options ? options.stick == 'right' : false; var origPos = css.get(sticker, stickRight ? 'right' : 'left'); var fixPos = (stickRight ? clientWidth - pos.w - pos.x : pos.x) + 'px'; var dhcalc = function() { if (options && options.along) { var along = g.position(options.along, true); dh = along.y + along.h - pos.h - pos.y; if (options.alongContent) // respect bottom padding and border dh -= g.getPadExtents(options.along).t + g.getBorderExtents(options.along).t; } else { dh = window.scrollMaxY - pos.h - pos.y; } }; var fixed = false; var stfn = function() { if (!options || !options.along) dh = window.scrollMaxY - pos.h - pos.y; if (window.scrollY >= pos.y && window.scrollY <= pos.y + dh) { if (!fixed) { if (stickRight) css.set(sticker, { top : 0, right : fixPos, position : 'fixed' }); else css.set(sticker, { top : 0, left : fixPos, position : 'fixed' }); fixed = true; } } else { if (fixed) { fixed = false; if (stickRight) css.set(sticker, { position : 'relative', right : origPos }); else css.set(sticker, { position : 'relative', left : origPos }); if (window.scrollY < pos.y) { css.set(sticker, { top : 'auto' }); } else { css.set(sticker, { top : dh + 'px' }); } } } }; dhcalc(); stfn(); on(window, 'scroll', stfn); on(window, 'resize', dhcalc); }; });