ToolTip.js 4.7 KB

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