annotate core/misc/displace.js @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 1fec387a4317
rev   line source
Chris@0 1 /**
Chris@0 2 * DO NOT EDIT THIS FILE.
Chris@0 3 * See the following change record for more information,
Chris@0 4 * https://www.drupal.org/node/2815083
Chris@0 5 * @preserve
Chris@0 6 **/
Chris@0 7
Chris@0 8 (function ($, Drupal, debounce) {
Chris@0 9 var offsets = {
Chris@0 10 top: 0,
Chris@0 11 right: 0,
Chris@0 12 bottom: 0,
Chris@0 13 left: 0
Chris@0 14 };
Chris@0 15
Chris@0 16 Drupal.behaviors.drupalDisplace = {
Chris@0 17 attach: function attach() {
Chris@0 18 if (this.displaceProcessed) {
Chris@0 19 return;
Chris@0 20 }
Chris@0 21 this.displaceProcessed = true;
Chris@0 22
Chris@0 23 $(window).on('resize.drupalDisplace', debounce(displace, 200));
Chris@0 24 }
Chris@0 25 };
Chris@0 26
Chris@0 27 function displace(broadcast) {
Chris@0 28 offsets = Drupal.displace.offsets = calculateOffsets();
Chris@0 29 if (typeof broadcast === 'undefined' || broadcast) {
Chris@0 30 $(document).trigger('drupalViewportOffsetChange', offsets);
Chris@0 31 }
Chris@0 32 return offsets;
Chris@0 33 }
Chris@0 34
Chris@0 35 function calculateOffsets() {
Chris@0 36 return {
Chris@0 37 top: calculateOffset('top'),
Chris@0 38 right: calculateOffset('right'),
Chris@0 39 bottom: calculateOffset('bottom'),
Chris@0 40 left: calculateOffset('left')
Chris@0 41 };
Chris@0 42 }
Chris@0 43
Chris@0 44 function calculateOffset(edge) {
Chris@0 45 var edgeOffset = 0;
Chris@0 46 var displacingElements = document.querySelectorAll('[data-offset-' + edge + ']');
Chris@0 47 var n = displacingElements.length;
Chris@0 48 for (var i = 0; i < n; i++) {
Chris@0 49 var el = displacingElements[i];
Chris@0 50
Chris@0 51 if (el.style.display === 'none') {
Chris@0 52 continue;
Chris@0 53 }
Chris@0 54
Chris@0 55 var displacement = parseInt(el.getAttribute('data-offset-' + edge), 10);
Chris@0 56
Chris@0 57 if (isNaN(displacement)) {
Chris@0 58 displacement = getRawOffset(el, edge);
Chris@0 59 }
Chris@0 60
Chris@0 61 edgeOffset = Math.max(edgeOffset, displacement);
Chris@0 62 }
Chris@0 63
Chris@0 64 return edgeOffset;
Chris@0 65 }
Chris@0 66
Chris@0 67 function getRawOffset(el, edge) {
Chris@0 68 var $el = $(el);
Chris@0 69 var documentElement = document.documentElement;
Chris@0 70 var displacement = 0;
Chris@0 71 var horizontal = edge === 'left' || edge === 'right';
Chris@0 72
Chris@0 73 var placement = $el.offset()[horizontal ? 'left' : 'top'];
Chris@0 74
Chris@0 75 placement -= window['scroll' + (horizontal ? 'X' : 'Y')] || document.documentElement['scroll' + (horizontal ? 'Left' : 'Top')] || 0;
Chris@0 76
Chris@0 77 switch (edge) {
Chris@0 78 case 'top':
Chris@0 79 displacement = placement + $el.outerHeight();
Chris@0 80 break;
Chris@0 81
Chris@0 82 case 'left':
Chris@0 83 displacement = placement + $el.outerWidth();
Chris@0 84 break;
Chris@0 85
Chris@0 86 case 'bottom':
Chris@0 87 displacement = documentElement.clientHeight - placement;
Chris@0 88 break;
Chris@0 89
Chris@0 90 case 'right':
Chris@0 91 displacement = documentElement.clientWidth - placement;
Chris@0 92 break;
Chris@0 93
Chris@0 94 default:
Chris@0 95 displacement = 0;
Chris@0 96 }
Chris@0 97 return displacement;
Chris@0 98 }
Chris@0 99
Chris@0 100 Drupal.displace = displace;
Chris@0 101 $.extend(Drupal.displace, {
Chris@0 102 offsets: offsets,
Chris@0 103
Chris@0 104 calculateOffset: calculateOffset
Chris@0 105 });
Chris@0 106 })(jQuery, Drupal, Drupal.debounce);