ToolTip.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import {computePosition, offset, flip, shift, arrow} from '@floating-ui/dom';
  2. let tooltipNode = null
  3. const Tooltip = {
  4. beforeMount(el, binding) {
  5. if (!binding.value) {
  6. return
  7. }
  8. el.addEventListener('mouseenter', function (e) {
  9. tooltipNode = document.createElement('div')
  10. tooltipNode.style.position = 'fixed'
  11. tooltipNode.style.zIndex = 2147483647
  12. tooltipNode.style.backgroundColor = 'rgba(0,0,0,1)'
  13. tooltipNode.style.border = '1px solid rgba(151, 151, 151, 0.2)'
  14. tooltipNode.style.borderRadius = '3px'
  15. tooltipNode.style.border = '1px solid rgba(151, 151, 151, 0.2)'
  16. tooltipNode.style.boxShadow = '0px 2px 12px 0px rgba(0, 0, 0, 0.06)'
  17. tooltipNode.style.padding = '8px 8px'
  18. tooltipNode.style.fontSize = '12px'
  19. tooltipNode.style.cursor = 'default'
  20. tooltipNode.style.pointerEvents = 'none'
  21. tooltipNode.style.wordBreak = 'keep-all'
  22. tooltipNode.style.whiteSpace = 'pre'
  23. tooltipNode.style.fontSize = '12px'
  24. tooltipNode.style.lineHeight = '17px'
  25. tooltipNode.style.color = '#ffffff'
  26. tooltipNode.innerText = binding.value
  27. const arrowNode = document.createElement('div')
  28. arrowNode.style.position = 'absolute'
  29. arrowNode.style.backgroundColor = 'inherit'
  30. arrowNode.style.boxSizing = 'border-box'
  31. arrowNode.style.width = '12px'
  32. arrowNode.style.height = '12px'
  33. arrowNode.style.border = '1px solid transparent'
  34. arrowNode.style.borderRight = 'inherit'
  35. arrowNode.style.borderBottom = 'inherit'
  36. arrowNode.style.transform = 'rotate(45deg)'
  37. tooltipNode.appendChild(arrowNode)
  38. document.body.appendChild(tooltipNode)
  39. computePosition(el, tooltipNode, {
  40. placement: 'top',
  41. middleware: [
  42. offset(13),
  43. flip(),
  44. shift({ padding: 12 }),
  45. arrow({
  46. element: arrowNode,
  47. padding: 3,
  48. }),
  49. ],
  50. }).then(({ x, y, placement, middlewareData }) => {
  51. Object.assign(tooltipNode.style, {
  52. left: `${x}px`,
  53. top: `${y}px`,
  54. });
  55. const { x: arrowX, y: arrowY } = middlewareData.arrow;
  56. const staticSide = {
  57. top: 'bottom',
  58. right: 'left',
  59. bottom: 'top',
  60. left: 'right',
  61. }[placement.split('-')[0]];
  62. Object.assign(arrowNode.style, {
  63. left: arrowX != null ? `${arrowX}px` : '',
  64. [staticSide]: '-6px',
  65. });
  66. });
  67. }, {
  68. passive: false,
  69. })
  70. el.addEventListener('mouseleave', function () {
  71. try {
  72. tooltipNode && document.body.removeChild(tooltipNode)
  73. } catch (e) {
  74. // console.log('尝试从DOM上移除tooltip元素失败,通常是因为已经在其他回调中被移除了,不需处理:', e);
  75. }
  76. })
  77. el.addEventListener('mousedown', function () {
  78. try {
  79. tooltipNode && document.body.removeChild(tooltipNode)
  80. } catch (e) {
  81. // console.log('尝试从DOM上移除tooltip元素失败,通常是因为已经在其他回调中被移除了,不需处理:', e);
  82. }
  83. })
  84. el.addEventListener('keydown', function () {
  85. try {
  86. tooltipNode && document.body.removeChild(tooltipNode)
  87. } catch (e) {
  88. // console.log('尝试从DOM上移除tooltip元素失败,通常是因为已经在其他回调中被移除了,不需处理:', e);
  89. }
  90. })
  91. el.addEventListener('scroll', function () {
  92. try {
  93. tooltipNode && document.body.removeChild(tooltipNode)
  94. } catch (e) {
  95. // console.log('尝试从DOM上移除tooltip元素失败,通常是因为已经在其他回调中被移除了,不需处理:', e);
  96. }
  97. })
  98. el.addEventListener('dragstart', function () {
  99. try {
  100. tooltipNode && document.body.removeChild(tooltipNode)
  101. } catch (e) {
  102. // console.log('尝试从DOM上移除tooltip元素失败,通常是因为已经在其他回调中被移除了,不需处理:', e);
  103. }
  104. })
  105. el.addEventListener('dragstart', function () {
  106. try {
  107. tooltipNode && document.body.removeChild(tooltipNode)
  108. } catch (e) {
  109. // console.log('尝试从DOM上移除tooltip元素失败,通常是因为已经在其他回调中被移除了,不需处理:', e);
  110. }
  111. })
  112. el.addEventListener('dragleave', function () {
  113. try {
  114. tooltipNode && document.body.removeChild(tooltipNode)
  115. } catch (e) {
  116. // console.log('尝试从DOM上移除tooltip元素失败,通常是因为已经在其他回调中被移除了,不需处理:', e);
  117. }
  118. })
  119. },
  120. updated(el, binding) {
  121. },
  122. unmounted() {
  123. try {
  124. console.log(tooltipNode);
  125. tooltipNode && document.body.removeChild(tooltipNode)
  126. } catch (e) {
  127. // console.log('尝试从DOM上移除tooltip元素失败,通常是因为已经在其他回调中被移除了,不需处理:', e);
  128. }
  129. },
  130. }
  131. export default Tooltip