diff --git a/core/misc/displace.js b/core/misc/displace.js index 3f96645..e787cc2 100644 --- a/core/misc/displace.js +++ b/core/misc/displace.js @@ -17,13 +17,6 @@ left: [] } - var displacingDimension = { - top: 'height', - right: 'width', - bottom: 'height', - left: 'width' - } - /** * Informs listeners of the current offset dimensions. */ @@ -92,26 +85,62 @@ for (var edge in displacingElements) { if (displacingElements.hasOwnProperty(edge)) { var displacement = 0; - if (displacingElements.hasOwnProperty(edge)) { - for (var i = 0, n = displacingElements[edge].length; i < n; i++) { - var $el = $(displacingElements[edge][i]); - // If the element is not visble, do not use its dimensions. - if (!$el.is(':visible')) { - continue; - } - // If the offset data attribute contains a displacing value, use it. - var value = parseInt($el.attr('data-offset-' + edge), 10); - if (typeof value === 'number' && !isNaN(value)) { - displacement += value; - } - // If the element's offset data attribute does not contain a value, - // try to get the displacing dimension from the element directly. - else { - displacement += $el[displacingDimension[edge]](); + // Zero out the offset for this edge. + offsets[edge] = 0; + // Go through the displacing elements on each edge and calculate the + // offset. + for (var i = 0, n = displacingElements[edge].length; i < n; i++) { + var $el = $(displacingElements[edge][i]); + // If the element is not visble, do not use its dimensions. + if (!$el.is(':visible')) { + continue; + } + // If the offset data attribute contains a displacing value, use it. + displacement = parseInt($el.attr('data-offset-' + edge), 10); + // If the element's offset data attribute does not contain a value, + // try to get the displacing dimension from the element directly. + if (typeof displacement === 'undefined' || typeof displacement !== 'number' || isNaN(displacement) || displacement < 0) { + var size = 0; + var docSize = 0; + // Get the offset of the element itself. + var placement = $el.offset()[(edge === 'left' || edge === 'right') ? 'left' : 'top']; + // Subtract scroll distance from placement to get the distance + // to the edge of the viewport. + placement = placement - window['scroll' + ((edge === 'right' || edge === 'left') ? 'X' : 'Y')]; + // Find the displacement value according to the edge. + switch (edge) { + // Left and top elements displace as a sum of their own offset value + // plus their size. + case 'top': + size = $el.outerHeight(); + // Total displacment is the sum of the elements placement and size. + displacement = placement + size; + break; + case 'left': + size = $el.outerWidth(); + // Total displacment is the sum of the elements placement and size. + displacement = placement + size; + break; + // Right and bottom elements displace according to their left and + // top offset. Their size isn't important. + case 'bottom': + docSize = document.documentElement.clientHeight; + displacement = docSize - placement; + break; + case 'right': + docSize = document.documentElement.clientWidth; + displacement = docSize - placement; + break; + default: + displacement = 0; } } - // Store the displacement vlaue in the closure's offsets variable. - offsets[edge] = displacement; + // If the displacement value is larger than the current value for this + // edge, use the value. + if (displacement >= 0 && displacement > offsets[edge]) { + // Store the displacement value in the closure's offsets variable. + offsets[edge] = displacement; + } } } }