Guest User

Untitled

a guest
Nov 22nd, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.34 KB | None | 0 0
  1. /**
  2. * table 使用的指令,当 table 列较多时,会出现横向滚动条
  3. * 添加了这个指令,能使底部滚动条不仅仅显示在表格底部,而是会在表格中间出现
  4. * @param {Number} 可接受一个数字类型参数,表示 table 上边框离浏览器窗口多少px开始fix底部滚动条,默认 0
  5. */
  6. const ElementTableCtx = '__ElementTableBottomCtx';
  7. function createScrollBar(root) {
  8. const docfrag = document.createDocumentFragment();
  9. const scrollWrap = document.createElement('div');
  10. const scroll = document.createElement('div');
  11. scrollWrap.style.position = 'absolute';
  12. scrollWrap.style.top = '9999px';
  13. scrollWrap.style.width = '100%';
  14. scrollWrap.style.height = '14px';
  15. scrollWrap.style.zIndex = '102';
  16. scrollWrap.style.display = 'block';
  17. scrollWrap.style.overflowX = 'scroll';
  18. scrollWrap.style.border = '1px solid #ccc';
  19. scrollWrap.style.backgroundColor = '#fff';
  20. scrollWrap.style.padding = '2px 0';
  21. scrollWrap.classList.add('scroll-wrap');
  22. scroll.classList.add('scroll-body');
  23. scroll.style.height = '1px';
  24. scrollWrap.appendChild(scroll);
  25. docfrag.appendChild(scrollWrap);
  26. root.appendChild(docfrag);
  27.  
  28. return scrollWrap;
  29. }
  30.  
  31. export default function install(Vue) {
  32. Vue.directive('fixed-bottom-scrollbar', {
  33. bind(el, binding, vnode) {
  34. const startFixed = binding.value || 0;
  35. const bodyWrapper = el.querySelector('.el-table__body-wrapper');
  36. const scrollWrap = createScrollBar(el);
  37.  
  38. if (typeof startFixed !== 'number') {
  39. throw TypeError('fixed-header needs number value');
  40. }
  41.  
  42. const bodyScroll = function bodyScroll() {
  43. bodyWrapper.scrollLeft = this.scrollLeft;
  44. };
  45. scrollWrap.addEventListener('scroll', bodyScroll);
  46.  
  47. const windowScroll = () => {
  48. const pos = el.getBoundingClientRect();
  49. const screenHeight = window.innerHeight;
  50. if (pos.top - startFixed < 0 && pos.bottom > screenHeight) {
  51. if (el[ElementTableCtx].fixed) {
  52. scrollWrap.style.top = screenHeight - pos.top - 16 + 'px';
  53. } else {
  54. scrollWrap.style.top = screenHeight - pos.top - 16 + 'px';
  55. scrollWrap.scrollLeft = bodyWrapper.scrollLeft;
  56. el[ElementTableCtx].fixed = true;
  57. }
  58. } else {
  59. scrollWrap.style.top = '9999px';
  60. el[ElementTableCtx].fixed = false;
  61. }
  62. };
  63. window.addEventListener('scroll', windowScroll);
  64.  
  65. el[ElementTableCtx] = {
  66. bodyScroll,
  67. windowScroll
  68. };
  69. },
  70. inserted(el, binding, vnode) {
  71. },
  72. componentUpdated(el, binding, vnode) {
  73.  
  74. setTimeout(() => {
  75. const tableWrapper = el.querySelector('.el-table__body');
  76. const scrollBody = el.querySelector('.scroll-body');
  77. const startFixed = binding.value || 0;
  78. const scrollWrap = el.querySelector('.scroll-wrap');
  79. scrollBody.style.width = tableWrapper.clientWidth + 'px';
  80.  
  81. const pos = el.getBoundingClientRect();
  82. const screenHeight = window.innerHeight;
  83. if (pos.top - startFixed < 0 && pos.bottom > screenHeight) {
  84. scrollWrap.style.top = screenHeight - pos.top - 16 + 'px';
  85. }
  86. }, 150);
  87.  
  88. },
  89. unbind(el) {
  90. const {windowScroll, onScroll} = el[ElementTableCtx];
  91. window.removeEventListener('scroll', onScroll);
  92. window.removeEventListener('scroll', windowScroll);
  93. }
  94. });
  95. }
Add Comment
Please, Sign In to add comment