Skip to content

Commit 23eee88

Browse files
committed
implemented scroll event input & background position rendering output
made option prehandling function turn preset callback names into the actual function objects to speed up internal processing and fix option consistency
1 parent fdd40bf commit 23eee88

File tree

3 files changed

+29
-27
lines changed

3 files changed

+29
-27
lines changed

jcp-layer.js

+10-11
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@ jcparallax.Layer = function(viewport, el, options)
1717
// setup instance options
1818
this.viewport = viewport;
1919
this.element = el;
20-
this.options = options;
21-
22-
jcparallax.Viewport._calcMovementRanges(this.options);
20+
this.options = jcparallax.Viewport._inferMovementRanges(options);
2321

2422
// store animation event handler to be called by our Viewport
2523
if ($.isFunction(this.options.animHandler)) {
@@ -84,6 +82,7 @@ $.extend(jcparallax.Layer.prototype, {
8482
} else {
8583
yRange = this._calculateMovementRange(yRangeOrCb);
8684
}
85+
8786
this.minX = xRange[0];
8887
this.rangeX = xRange[1] - xRange[0];
8988
this.minY = yRange[0];
@@ -136,7 +135,9 @@ jcparallax.Layer.animHandlers = {
136135

137136
background : function(xVal, yVal)
138137
{
139-
138+
return {
139+
'background-position' : (this.minX + (xVal * this.rangeX)) + 'px ' + (this.minY + (yVal * this.rangeY)) + 'px',
140+
};
140141
},
141142

142143
stretch : function(xVal, yVal)
@@ -163,24 +164,22 @@ jcparallax.Layer.rangeCalculators = {
163164

164165
width : function(el, vp)
165166
{
166-
var wDelta = vp.sizeX - el.width();
167-
return [0, wDelta];
167+
return [0, vp.sizeX - el.width()];
168168
},
169169

170170
height : function(el, vp)
171171
{
172-
var hDelta = vp.sizeY - el.height();
173-
return [hDelta, 0];
172+
return [vp.sizeY - el.height(), 0];
174173
},
175174

176175
scrollWidth : function(el, vp)
177176
{
178-
return [0, el.attr('scrollWidth')];
177+
return [-(el.get(0).scrollWidth - vp.sizeX), 0];
179178
},
180179

181180
scrollHeight : function(el, vp)
182181
{
183-
return [0, el.attr('scrollHeight')];
182+
return [0, el.get(0).scrollHeight - vp.sizeY];
184183
},
185184

186185
fontSize : function(el, vp)
@@ -190,7 +189,7 @@ jcparallax.Layer.rangeCalculators = {
190189

191190
lineHeight : function(el, vp)
192191
{
193-
return [0, el.css('line-height')];
192+
return [el.css('line-height'), 0];
194193
},
195194

196195
opacity : function(el, vp)

jcp-viewport.js

+16-16
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ jcparallax.Viewport = function(el, options, layerOptions)
3838
};
3939

4040
// determine layer movement ranges if set to automatic
41-
this.options = jcparallax.Viewport._calcMovementRanges($.extend(true, defaults, options));
41+
this.options = jcparallax.Viewport._inferMovementRanges($.extend(true, defaults, options));
4242

4343
// set layer opts for passing on to child layers
4444
this.layerOptions = layerOptions;
@@ -81,7 +81,7 @@ $.extend(jcparallax.Viewport, {
8181
* @param {object} options incoming options object
8282
* @return the processed options
8383
*/
84-
_calcMovementRanges : function(options)
84+
_inferMovementRanges : function(options)
8585
{
8686
// set default range calculation callbacks
8787
if (options.movementRangeX === true || options.movementRangeY === true && !$.isFunction(options.animHandler)) {
@@ -93,23 +93,23 @@ $.extend(jcparallax.Viewport, {
9393
case 'background':
9494
case 'stretch':
9595
switch (options.inputHandler) {
96-
case 'mousemove':
97-
options.movementRangeX = 'width';
98-
options.movementRangeY = 'height';
99-
break;
10096
case 'scroll':
101-
options.movementRangeX = 'scrollWidth';
102-
options.movementRangeY = 'scrollHeight';
97+
options.movementRangeX = jcparallax.Layer.rangeCalculators.scrollWidth;
98+
options.movementRangeY = jcparallax.Layer.rangeCalculators.scrollHeight;
99+
break;
100+
default:
101+
options.movementRangeX = jcparallax.Layer.rangeCalculators.width;
102+
options.movementRangeY = jcparallax.Layer.rangeCalculators.height;
103103
break;
104104
}
105105
break;
106106
case 'textShadow':
107-
options.movementRangeX = 'fontSize';
108-
options.movementRangeY = 'lineHeight';
107+
options.movementRangeX = jcparallax.Layer.rangeCalculators.fontSize;
108+
options.movementRangeY = jcparallax.Layer.rangeCalculators.lineHeight;
109109
break;
110110
case 'opacity':
111-
options.movementRangeX = 0;
112-
options.movementRangeY = 'opacity';
111+
options.movementRangeX = [0, 0];
112+
options.movementRangeY = jcparallax.Layer.rangeCalculators.opacity;
113113
break;
114114
}
115115
}
@@ -146,7 +146,6 @@ $.extend(jcparallax.Viewport.prototype, {
146146
bindEvent : function(eventName, handler)
147147
{
148148
var that = this;
149-
150149
eventName += jcparallax.eventNamespace;
151150

152151
// detach old callback first if present
@@ -246,8 +245,8 @@ $.extend(jcparallax.Viewport.prototype, {
246245
this.offsetY = offset.top;
247246
this.sizeX = this.element.width();
248247
this.sizeY = this.element.height();
249-
this.scrollX = this.element.attr('scrollWidth');
250-
this.scrollY = this.element.attr('scrollHeight');
248+
this.scrollX = this.element[0].scrollWidth - this.sizeX;
249+
this.scrollY = this.element[0].scrollHeight - this.sizeY;
251250

252251
if (this.layers) {
253252
$.each(this.layers, function(i, layer) {
@@ -294,7 +293,8 @@ jcparallax.Viewport.inputHandlers = {
294293
var xPos = el.scrollLeft(),
295294
yPos = el.scrollTop();
296295

297-
this.updateLastSamplePos(xPos / this.scrollX, yPos / this.scrollY);
296+
// :NOTE: scroll offsets are often calculated smaller than the available space due to scrollbar space
297+
this.updateLastSamplePos(this.scrollX ? Math.min(1, xPos / this.scrollX) : 0, this.scrollY ? Math.min(1, yPos / this.scrollY) : 0);
298298
},
299299

300300
click : function(el, evt)

jcparallax.css

+3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
position: relative;
33
overflow: hidden;
44
}
5+
.jcp-viewport.scroll {
6+
overflow: auto;
7+
}
58
.jcp-layer {
69
position: absolute;
710
/* :NOTE: you will need to override these timings if changing the default frame duration in jc-parallax.js */

0 commit comments

Comments
 (0)