diff --git a/core/misc/displace.js b/core/misc/displace.js index e787cc2..9ca72f5 100644 --- a/core/misc/displace.js +++ b/core/misc/displace.js @@ -10,12 +10,7 @@ left: 0 }; - var displacingElements = { - top: [], - right: [], - bottom: [], - left: [] - } + var displacingElements = []; /** * Informs listeners of the current offset dimensions. @@ -38,36 +33,38 @@ /** * Registers elements that should be used to determine viewport offset sizes. */ - displace.registerElements = function (elementsByEdge) { - // Go through each edge in elementsByEdge. - for (var edge in elementsByEdge) { - if (elementsByEdge.hasOwnProperty(edge)) { - // Each element or set of elements must be listed under an edge - // property. - if ($.inArray(edge, ['top', 'right', 'bottom', 'left']) === -1) { - continue; - } - var elements = elementsByEdge[edge]; - // Wrap the elements in an array if just one element is provided. - elements = (!'length' in elements) ? [elements] : elements; - // Loop through each element and add it to the list of displacing - // elements for the given edge. - for (var i = 0, n = elements.length; i < n; i++) { - // The elements will be stored as DOM nodes for consistency. - var el = ('get' in elements[i]) ? elements[i].get() : elements[i]; - displacingElements[edge].push(el); - } - // Sort the displacing elements for the edge and remove duplicates. - displacingElements[edge] = $.unique(displacingElements[edge]); - } + displace.registerElements = function (elements) { + // Wrap the elements in an array if just one element is provided. + elements = (!'length' in elements) ? [elements] : elements; + // Loop through each element and add it to the list of displacing + // elements for the given edge. + for (var i = 0, n = elements.length; i < n; i++) { + // The elements will be stored as DOM nodes for consistency. + var element = ('get' in elements[i]) ? elements[i].get() : elements[i]; + displacingElements.push(element); } + + // Remove duplicates. + displacingElements = $.unique(displacingElements); }; /** * Removes elements from the list of displacing elements for an edge. */ - displace.removeElements = function (elementsByEdge) { - // @todo provide a way to remove elements from the set of displacing elements. + displace.removeElements = function (elements) { + var remove = []; + + // Wrap the elements in an array if just one element is provided. + elements = (!'length' in elements) ? [elements] : elements; + for (var i = 0, n = elements.length; i < n; i++) { + var el = ('get' in elements[i]) ? elements[i].get() : elements[i]; + remove.push(el); + } + + // Filter displacingElements by provided elements + displacingElements = $.grep(displacingElements, function(el) { + return $.inArray(el, remove) === -1; + }); }; /** @@ -81,25 +78,38 @@ * Determines the viewport offsets. */ function calculateOffsets () { - // Go through each edge and add up the displacements. - for (var edge in displacingElements) { - if (displacingElements.hasOwnProperty(edge)) { - var displacement = 0; - // 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')) { + // Perform the calculations on a local varialbe + var offset = { + top: 0, + right: 0, + bottom: 0, + left: 0 + } + // Go through the displacing elements on each edge and calculate the + // offset. + for (var i = 0, n = displacingElements.length; i < n; i++) { + var $el = $(displacingElements[i]); + // If the element is not visble, do not use its dimensions. + if (!$el.is(':visible')) { + continue; + } + // Go through each edge and add up the displacements. + for (var edge in offset) { + if (offset.hasOwnProperty(edge)) { + var displacement = 0; + // If the offset data attribute contains a displacing value, use it. + displacement = $el.attr('data-offset-' + edge); + // If the element's offset data attribute does not exists + // then move to another edge + if (typeof displacement === 'undefined') { 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) { + // Try to parse displacement to number + displacement = parseInt(displacement, 10); + // If the element's offset data attribute exits + // but is not a valid number then get the displacement + // dimensions directly form the element + if (typeof displacement !== 'number' || isNaN(displacement) || displacement < 0) { var size = 0; var docSize = 0; // Get the offset of the element itself. @@ -137,13 +147,13 @@ } // 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; - } + offset[edge] = Math.max(offset[edge], displacement); } } } + console.log(offset); + // Store the calculated offset + offsets = offset; } /** diff --git a/core/modules/toolbar/js/toolbar.js b/core/modules/toolbar/js/toolbar.js index 33c7133..e4e929d 100644 --- a/core/modules/toolbar/js/toolbar.js +++ b/core/modules/toolbar/js/toolbar.js @@ -86,10 +86,8 @@ Drupal.behaviors.toolbar = { var setHeight = Drupal.debounce(Drupal.toolbar.setHeight, 200); // Register elements with Drupal.displace that could affect the size and // placement of other UI components. - Drupal.displace.registerElements({ - top: $toolbar, - left: $trays - }); + Drupal.displace.registerElements($toolbar); + Drupal.displace.registerElements($trays); // Attach behavior to the window. $(window) .on('resize.toolbar', setHeight);