Mercurial > pub > site.implab
comparison 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 |
comparison
equal
deleted
inserted
replaced
| 11:573272ec604b | 12:d9551c7e7101 |
|---|---|
| 1 define([ 'dojo/on', 'dojo/dom-geometry', 'dojo/dom-style' ], function(on, g, | 1 define([ 'dojo/on', 'dojo/dom-geometry', 'dojo/dom-style' ], function(on, g, |
| 2 css) { | 2 css) { |
| 3 | 3 |
| 4 /** | |
| 5 * @param [Dom|string] | |
| 6 * stiker element to become a sticker | |
| 7 */ | |
| 4 return function(sticker, options) { | 8 return function(sticker, options) { |
| 5 var dh, pos; | 9 var dh, pos; |
| 6 | 10 |
| 7 var pos = g.position(sticker,true); | 11 var pos = g.position(sticker, true); |
| 12 var clientWidth = g.position(document.body).w; | |
| 13 var stickRight = options ? options.stick == 'right' : false; | |
| 8 | 14 |
| 9 var origLeft = css.get(sticker,'left'); | 15 var origPos = css.get(sticker, stickRight ? 'right' : 'left'); |
| 10 var left = pos.x + 'px'; | |
| 11 | 16 |
| 12 if (options && options.along) { | 17 var fixPos = (stickRight ? clientWidth - pos.w - pos.x : pos.x) + 'px'; |
| 13 var along = g.position(options.along,true); | 18 |
| 14 dh = along.y + along.h - pos.h - pos.y; | 19 var dhcalc = function() { |
| 15 } else { | 20 if (options && options.along) { |
| 16 dh = window.scrollMaxY - pos.h - pos.y; | 21 var along = g.position(options.along, true); |
| 17 } | 22 dh = along.y + along.h - pos.h - pos.y; |
| 23 if (options.alongContent) | |
| 24 // respect bottom padding and border | |
| 25 dh -= g.getPadExtents(options.along).t | |
| 26 + g.getBorderExtents(options.along).t; | |
| 27 } else { | |
| 28 dh = window.scrollMaxY - pos.h - pos.y; | |
| 29 } | |
| 30 }; | |
| 18 | 31 |
| 19 var fixed = false; | 32 var fixed = false; |
| 20 | 33 |
| 21 var stfn = function() { | 34 var stfn = function() { |
| 22 if(!options || !options.along) | 35 if (!options || !options.along) |
| 23 dh = window.scrollMaxY - pos.h - pos.y; | 36 dh = window.scrollMaxY - pos.h - pos.y; |
| 24 | 37 |
| 25 if (window.scrollY >= pos.y && window.scrollY <= pos.y + dh) { | 38 if (window.scrollY >= pos.y && window.scrollY <= pos.y + dh) { |
| 26 if (!fixed) { | 39 if (!fixed) { |
| 27 css.set(sticker, { top : 0, left: left, position : 'fixed' }); | 40 if (stickRight) |
| 41 css.set(sticker, { | |
| 42 top : 0, | |
| 43 right : fixPos, | |
| 44 position : 'fixed' | |
| 45 }); | |
| 46 else | |
| 47 css.set(sticker, { | |
| 48 top : 0, | |
| 49 left : fixPos, | |
| 50 position : 'fixed' | |
| 51 }); | |
| 28 fixed = true; | 52 fixed = true; |
| 29 } | 53 } |
| 30 } else { | 54 } else { |
| 31 if (fixed) { | 55 if (fixed) { |
| 32 fixed = false; | 56 fixed = false; |
| 33 | 57 |
| 34 css.set(sticker, { position : 'relative', left: origLeft }); | 58 if (stickRight) |
| 59 css.set(sticker, { | |
| 60 position : 'relative', | |
| 61 right : origPos | |
| 62 }); | |
| 63 else | |
| 64 css.set(sticker, { | |
| 65 position : 'relative', | |
| 66 left : origPos | |
| 67 }); | |
| 35 | 68 |
| 36 if (window.scrollY < pos.y) { | 69 if (window.scrollY < pos.y) { |
| 37 css.set(sticker, { top : 'auto' }); | 70 css.set(sticker, { |
| 71 top : 'auto' | |
| 72 }); | |
| 38 } else { | 73 } else { |
| 39 css.set(sticker, { top : dh + 'px' }); | 74 css.set(sticker, { |
| 75 top : dh + 'px' | |
| 76 }); | |
| 40 } | 77 } |
| 41 } | 78 } |
| 42 } | 79 } |
| 43 }; | 80 }; |
| 44 | 81 |
| 82 dhcalc(); | |
| 45 stfn(); | 83 stfn(); |
| 46 | 84 |
| 47 on(window, 'scroll', stfn ); | 85 on(window, 'scroll', stfn); |
| 86 on(window, 'resize', dhcalc); | |
| 48 }; | 87 }; |
| 49 }); | 88 }); |
