ResizeSensor.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. var SingleEmitter = require('./SingleEmitter');
  2. var h = require('./h');
  3. var $event = require('./$event');
  4. var $css = require('./$css');
  5. var contain = require('./contain');
  6. var extend = require('./extend');
  7. var root = require('./root');
  8. if (root.ResizeObserver && !false) {
  9. exports = SingleEmitter.extend({
  10. initialize: function ResizeSensor(el) {
  11. var _this = this;
  12. if (el._resizeSensor) {
  13. return el._resizeSensor;
  14. }
  15. this.callSuper(SingleEmitter, 'initialize');
  16. var resizeObserver = new root.ResizeObserver(function() {
  17. return _this.emit();
  18. });
  19. resizeObserver.observe(el);
  20. el._resizeSensor = this;
  21. this._resizeObserver = resizeObserver;
  22. this._el = el;
  23. },
  24. destroy: function() {
  25. var el = this._el;
  26. if (!el._resizeSensor) {
  27. return;
  28. }
  29. this.rmAllListeners();
  30. delete el._resizeSensor;
  31. this._resizeObserver.unobserve(el);
  32. }
  33. });
  34. } else {
  35. exports = SingleEmitter.extend({
  36. initialize: function ResizeSensor(el) {
  37. if (el._resizeSensor) {
  38. return el._resizeSensor;
  39. }
  40. this.callSuper(SingleEmitter, 'initialize');
  41. this._el = el;
  42. el._resizeSensor = this;
  43. if (
  44. !contain(
  45. ['absolute', 'relative', 'fixed', 'sticky'],
  46. $css(el, 'position')
  47. )
  48. ) {
  49. $css(el, 'position', 'relative');
  50. }
  51. this._appendResizeSensor();
  52. this._bindEvent();
  53. },
  54. destroy: function() {
  55. var el = this._el;
  56. if (!el._resizeSensor) {
  57. return;
  58. }
  59. this.rmAllListeners();
  60. delete el._resizeSensor;
  61. el.removeChild(this._resizeSensorEl);
  62. },
  63. _appendResizeSensor: function() {
  64. var el = this._el;
  65. var style = {
  66. pointerEvents: 'none',
  67. position: 'absolute',
  68. left: '0px',
  69. top: '0px',
  70. right: '0px',
  71. bottom: '0px',
  72. overflow: 'hidden',
  73. zIndex: '-1',
  74. visibility: 'hidden',
  75. maxWidth: '100%'
  76. };
  77. var styleChild = {
  78. position: 'absolute',
  79. left: '0px',
  80. top: '0px',
  81. transition: '0s'
  82. };
  83. var expandChildEl = h('div', {
  84. style: styleChild
  85. });
  86. var expandEl = h(
  87. 'div.resize-sensor-expand',
  88. {
  89. style: style
  90. },
  91. expandChildEl
  92. );
  93. var shrinkEl = h(
  94. 'div.resize-sensor-shrink',
  95. {
  96. style: style
  97. },
  98. h('div', {
  99. style: extend(
  100. {
  101. width: '200%',
  102. height: '200%'
  103. },
  104. styleChild
  105. )
  106. })
  107. );
  108. var resizeSensorEl = h(
  109. 'div.resize-sensor',
  110. {
  111. dir: 'ltr',
  112. style: style
  113. },
  114. expandEl,
  115. shrinkEl
  116. );
  117. this._expandEl = expandEl;
  118. this._expandChildEl = expandChildEl;
  119. this._shrinkEl = shrinkEl;
  120. this._resizeSensorEl = resizeSensorEl;
  121. el.appendChild(resizeSensorEl);
  122. this._resetExpandShrink();
  123. },
  124. _bindEvent: function() {
  125. var _this2 = this;
  126. $event.on(this._expandEl, 'scroll', function() {
  127. return _this2._onScroll();
  128. });
  129. $event.on(this._shrinkEl, 'scroll', function() {
  130. return _this2._onScroll();
  131. });
  132. },
  133. _onScroll: function() {
  134. this.emit();
  135. this._resetExpandShrink();
  136. },
  137. _resetExpandShrink: function() {
  138. var el = this._el;
  139. var width = el.offsetWidth;
  140. var height = el.offsetHeight;
  141. $css(this._expandChildEl, {
  142. width: width + 10,
  143. height: height + 10
  144. });
  145. extend(this._expandEl, {
  146. scrollLeft: width + 10,
  147. scrollTop: height + 10
  148. });
  149. extend(this._shrinkEl, {
  150. scrollLeft: width + 10,
  151. scrollTop: height + 10
  152. });
  153. }
  154. });
  155. }
  156. module.exports = exports;