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 }); |