dimensions.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. /**
  2. * angular-strap
  3. * @version v2.3.9 - 2016-06-10
  4. * @link http://mgcrea.github.io/angular-strap
  5. * @author Olivier Louvignes <olivier@mg-crea.com> (https://github.com/mgcrea)
  6. * @license MIT License, http://www.opensource.org/licenses/MIT
  7. */
  8. 'use strict';
  9. angular.module('mgcrea.ngStrap.helpers.dimensions', []).factory('dimensions', function() {
  10. var fn = {};
  11. var nodeName = fn.nodeName = function(element, name) {
  12. return element.nodeName && element.nodeName.toLowerCase() === name.toLowerCase();
  13. };
  14. fn.css = function(element, prop, extra) {
  15. var value;
  16. if (element.currentStyle) {
  17. value = element.currentStyle[prop];
  18. } else if (window.getComputedStyle) {
  19. value = window.getComputedStyle(element)[prop];
  20. } else {
  21. value = element.style[prop];
  22. }
  23. return extra === true ? parseFloat(value) || 0 : value;
  24. };
  25. fn.offset = function(element) {
  26. var boxRect = element.getBoundingClientRect();
  27. var docElement = element.ownerDocument;
  28. return {
  29. width: boxRect.width || element.offsetWidth,
  30. height: boxRect.height || element.offsetHeight,
  31. top: boxRect.top + (window.pageYOffset || docElement.documentElement.scrollTop) - (docElement.documentElement.clientTop || 0),
  32. left: boxRect.left + (window.pageXOffset || docElement.documentElement.scrollLeft) - (docElement.documentElement.clientLeft || 0)
  33. };
  34. };
  35. fn.setOffset = function(element, options, i) {
  36. var curPosition;
  37. var curLeft;
  38. var curCSSTop;
  39. var curTop;
  40. var curOffset;
  41. var curCSSLeft;
  42. var calculatePosition;
  43. var position = fn.css(element, 'position');
  44. var curElem = angular.element(element);
  45. var props = {};
  46. if (position === 'static') {
  47. element.style.position = 'relative';
  48. }
  49. curOffset = fn.offset(element);
  50. curCSSTop = fn.css(element, 'top');
  51. curCSSLeft = fn.css(element, 'left');
  52. calculatePosition = (position === 'absolute' || position === 'fixed') && (curCSSTop + curCSSLeft).indexOf('auto') > -1;
  53. if (calculatePosition) {
  54. curPosition = fn.position(element);
  55. curTop = curPosition.top;
  56. curLeft = curPosition.left;
  57. } else {
  58. curTop = parseFloat(curCSSTop) || 0;
  59. curLeft = parseFloat(curCSSLeft) || 0;
  60. }
  61. if (angular.isFunction(options)) {
  62. options = options.call(element, i, curOffset);
  63. }
  64. if (options.top !== null) {
  65. props.top = options.top - curOffset.top + curTop;
  66. }
  67. if (options.left !== null) {
  68. props.left = options.left - curOffset.left + curLeft;
  69. }
  70. if ('using' in options) {
  71. options.using.call(curElem, props);
  72. } else {
  73. curElem.css({
  74. top: props.top + 'px',
  75. left: props.left + 'px'
  76. });
  77. }
  78. };
  79. fn.position = function(element) {
  80. var offsetParentRect = {
  81. top: 0,
  82. left: 0
  83. };
  84. var offsetParentEl;
  85. var offset;
  86. if (fn.css(element, 'position') === 'fixed') {
  87. offset = element.getBoundingClientRect();
  88. } else {
  89. offsetParentEl = offsetParentElement(element);
  90. offset = fn.offset(element);
  91. if (!nodeName(offsetParentEl, 'html')) {
  92. offsetParentRect = fn.offset(offsetParentEl);
  93. }
  94. offsetParentRect.top += fn.css(offsetParentEl, 'borderTopWidth', true);
  95. offsetParentRect.left += fn.css(offsetParentEl, 'borderLeftWidth', true);
  96. }
  97. return {
  98. width: element.offsetWidth,
  99. height: element.offsetHeight,
  100. top: offset.top - offsetParentRect.top - fn.css(element, 'marginTop', true),
  101. left: offset.left - offsetParentRect.left - fn.css(element, 'marginLeft', true)
  102. };
  103. };
  104. function offsetParentElement(element) {
  105. var docElement = element.ownerDocument;
  106. var offsetParent = element.offsetParent || docElement;
  107. if (nodeName(offsetParent, '#document')) return docElement.documentElement;
  108. while (offsetParent && !nodeName(offsetParent, 'html') && fn.css(offsetParent, 'position') === 'static') {
  109. offsetParent = offsetParent.offsetParent;
  110. }
  111. return offsetParent || docElement.documentElement;
  112. }
  113. fn.height = function(element, outer) {
  114. var value = element.offsetHeight;
  115. if (outer) {
  116. value += fn.css(element, 'marginTop', true) + fn.css(element, 'marginBottom', true);
  117. } else {
  118. value -= fn.css(element, 'paddingTop', true) + fn.css(element, 'paddingBottom', true) + fn.css(element, 'borderTopWidth', true) + fn.css(element, 'borderBottomWidth', true);
  119. }
  120. return value;
  121. };
  122. fn.width = function(element, outer) {
  123. var value = element.offsetWidth;
  124. if (outer) {
  125. value += fn.css(element, 'marginLeft', true) + fn.css(element, 'marginRight', true);
  126. } else {
  127. value -= fn.css(element, 'paddingLeft', true) + fn.css(element, 'paddingRight', true) + fn.css(element, 'borderLeftWidth', true) + fn.css(element, 'borderRightWidth', true);
  128. }
  129. return value;
  130. };
  131. return fn;
  132. });