Mercurial > pub > site.implab
diff public_html/static/js/implab/sticky.js @ 12:d9551c7e7101
improved dox library
author | sergey |
---|---|
date | Fri, 16 May 2014 16:47:50 +0400 |
parents | 2d1a0a75fc49 |
children |
line wrap: on
line diff
--- a/public_html/static/js/implab/sticky.js Thu May 15 18:24:02 2014 +0400 +++ b/public_html/static/js/implab/sticky.js Fri May 16 16:47:50 2014 +0400 @@ -1,49 +1,88 @@ 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 pos = g.position(sticker, true); + var clientWidth = g.position(document.body).w; + var stickRight = options ? options.stick == 'right' : false; - var origLeft = css.get(sticker,'left'); - var left = pos.x + 'px'; + var origPos = css.get(sticker, stickRight ? 'right' : 'left'); + + var fixPos = (stickRight ? clientWidth - pos.w - pos.x : pos.x) + 'px'; - if (options && options.along) { - var along = g.position(options.along,true); - dh = along.y + along.h - pos.h - pos.y; - } else { - dh = window.scrollMaxY - pos.h - pos.y; - } + 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) + if (!options || !options.along) dh = window.scrollMaxY - pos.h - pos.y; if (window.scrollY >= pos.y && window.scrollY <= pos.y + dh) { if (!fixed) { - css.set(sticker, { top : 0, left: left, position : '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; - - css.set(sticker, { position : 'relative', left: origLeft }); + + 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' }); + css.set(sticker, { + top : 'auto' + }); } else { - css.set(sticker, { top : dh + 'px' }); + css.set(sticker, { + top : dh + 'px' + }); } } } }; - + + dhcalc(); stfn(); - on(window, 'scroll', stfn ); + on(window, 'scroll', stfn); + on(window, 'resize', dhcalc); }; }); \ No newline at end of file