Guest User

Untitled

a guest
Nov 22nd, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.26 KB | None | 0 0
  1. /**
  2. * table 使用的指令,用于固定表头
  3. * @param {Number} 可接受一个数字类型参数,表示 table 上边框离浏览器窗口多少px开始fix头部,默认 0
  4. */
  5. const ElementTableCtx = '__ElementTableHeaderCtx';
  6. function setFixed(el, fixed, height) {
  7. if (fixed) {
  8. el.style.position = 'relative';
  9. el.style.top = height + 'px';
  10. el.style.zIndex = 100;
  11. } else {
  12. el.style.position = 'relative';
  13. el.style.top = '0';
  14. el.style.zIndex = 'inherit';
  15. }
  16. }
  17. function setFixedHeaderFixed(el, fixed, height) {
  18. if (fixed) {
  19. el.style.top = height + 'px';
  20. el.style.zIndex = 100;
  21. } else {
  22. el.style.top = '0';
  23. el.style.zIndex = 'inherit';
  24. }
  25. }
  26. function setFirstRowFixed(el, fixed, height = 0) {
  27. if (fixed) {
  28. el.style.top = height + 'px';
  29. el.style.zIndex = 99;
  30. el.style.borderBottom = '2px solid #e0e6ed';
  31. } else {
  32. el.style.top = '0';
  33. el.style.zIndex = 'inherit';
  34. el.style.borderBottom = '1px solid #e0e6ed';
  35. }
  36. }
  37.  
  38. export default function install(Vue) {
  39. Vue.directive('fixed-header', {
  40. bind(el, binding, vnode) {
  41. const startFixed = binding.value || 0;
  42. const headerWrapper = el.querySelector('.el-table__header-wrapper');
  43.  
  44. if (typeof startFixed !== 'number') {
  45. throw TypeError('fixed-header needs number value');
  46. }
  47.  
  48. const onScroll = () => {
  49. const pos = el.getBoundingClientRect();
  50.  
  51. if (pos.top - startFixed < 0) {
  52. setFixed(headerWrapper, true, Math.abs(pos.top - startFixed));
  53. } else {
  54. setFixed(headerWrapper, false);
  55. }
  56. };
  57. window.addEventListener('scroll', onScroll);
  58.  
  59. el[ElementTableCtx] = {
  60. onScroll,
  61. fixedScroll: null
  62. };
  63. },
  64. inserted(el, binding, vnode) {
  65. },
  66. componentUpdated(el, binding, vnode) {
  67. let {fixedScroll} = el[ElementTableCtx];
  68.  
  69. if (fixedScroll) {
  70. window.removeEventListener('scroll', fixedScroll);
  71. }
  72.  
  73. setTimeout(() => {
  74. const fixedHeaderWrappers = el.querySelectorAll('.el-table__fixed-header-wrapper');
  75. const fixedRightHeaderWrappers = el.querySelectorAll('.el-table__fixed-right > .el-table__fixed-header-wrapper'); // eslint-disable-line max-len
  76. const startFixed = binding.value;
  77.  
  78. if (fixedHeaderWrappers.length || fixedRightHeaderWrappers.length) {
  79. el.querySelector('.el-table__fixed') && (el.querySelector('.el-table__fixed').style.zIndex = 100);
  80. el.querySelector('.el-table__fixed-right') && (el.querySelector('.el-table__fixed-right').style.zIndex = 101);
  81.  
  82. fixedScroll = () => {
  83. const pos = el.getBoundingClientRect();
  84.  
  85. if (binding.modifiers.first) {
  86. const firstRows = el.querySelectorAll('.el-table__body .sum-row > td');
  87. Array.prototype.slice.call(firstRows).forEach((firstRow, index) => {
  88. if (pos.top - startFixed < 0) {
  89. setFirstRowFixed(firstRow, true, Math.abs(pos.top - startFixed));
  90.  
  91. } else {
  92. setFirstRowFixed(firstRow, false);
  93.  
  94. }
  95. });
  96. }
  97.  
  98. Array.prototype.slice.call(fixedHeaderWrappers).forEach((fixedHeaderWrapper) => {
  99. if (pos.top - startFixed < 0) {
  100. el[ElementTableCtx].fixedHeaderFixed = true;
  101.  
  102. setFixedHeaderFixed(fixedHeaderWrapper, true, Math.abs(pos.top - startFixed));
  103. } else {
  104.  
  105. setFixedHeaderFixed(fixedHeaderWrapper, false);
  106. }
  107. });
  108. Array.prototype.slice.call(fixedRightHeaderWrappers).forEach((fixedRightHeaderWrapper) => {
  109. if (pos.top - startFixed < 0) {
  110. el[ElementTableCtx].fixedHeaderFixed = true;
  111.  
  112. setFixedHeaderFixed(fixedRightHeaderWrapper, true, Math.abs(pos.top - startFixed));
  113. } else {
  114.  
  115. setFixedHeaderFixed(fixedRightHeaderWrapper, false);
  116. }
  117. });
  118. };
  119.  
  120. window.addEventListener('scroll', fixedScroll);
  121. el[ElementTableCtx].fixedScroll = fixedScroll;
  122. }
  123. }, 0);
  124.  
  125. },
  126. unbind(el) {
  127. const {fixedScroll, onScroll} = el[ElementTableCtx];
  128. window.removeEventListener('scroll', onScroll);
  129. window.removeEventListener('scroll', fixedScroll);
  130. }
  131. });
  132. }
Add Comment
Please, Sign In to add comment