_bubble.scss 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. .bubble {
  2. --arrow-width: 45px;
  3. --arrow-height: 32px;
  4. --back-color: rgba(27, 27, 28, 0.8);
  5. --border-color-fill: 0, 0, 0;
  6. --border-color: rgb(var(--border-color-fill));
  7. --radius: 8px;
  8. --padding: 20px 20px;
  9. --bottom-left: 40px;
  10. position: absolute;
  11. z-index: 9;
  12. transition: transform .3s ease, opacity .3s ease;
  13. >.bubble-layer {
  14. // backdrop-filter: blur(4px);
  15. position: relative;
  16. padding: var(--padding);
  17. min-width: calc(3 * var(--arrow-width));
  18. min-height: calc(3 * var(--arrow-height));
  19. background: var(--back-color);
  20. box-shadow: 0px 0px 10px 0px rgba(var(--border-color-fill), 0.3);
  21. // border: 1px solid var(--border-color);
  22. border-radius: var(--radius);
  23. > .bubble-arr {
  24. position: absolute;
  25. display: block;
  26. pointer-events: none;
  27. margin-left: 1px;
  28. z-index: 99;
  29. width: 0;
  30. height: 0;
  31. border-style: solid;
  32. border-color: transparent;
  33. border-width: calc(var(--arrow-width) / 2);
  34. }
  35. }
  36. &.left,
  37. &.right {
  38. &::after {
  39. content: '';
  40. position: absolute;
  41. z-index: 1;
  42. width: calc(var(--arrow-width) / 1.4);
  43. height: calc(var(--arrow-width) / 1.3);
  44. top: 50%;
  45. transform: translateY(calc(-50% + 0.5px));
  46. }
  47. top: 50%;
  48. transform: translateY(calc(-50% + 0.5px));
  49. >.bubble-layer > .bubble-arr {
  50. top: 50%;
  51. transform: translateY(calc(-50% + 0.5px));
  52. border-width: calc(var(--arrow-width) / 3);
  53. }
  54. &.fade-enter-active,
  55. &.fade-leave-active {
  56. transform: translateY(calc(-50% + 0.5px)) scale(1);
  57. opacity: 1;
  58. }
  59. &.fade-enter-from,
  60. &.fade-leave-to {
  61. transform: translateY(calc(-50% + 0.5px)) scale(0);
  62. opacity: 0;
  63. }
  64. }
  65. &.left {
  66. transform-origin: center right;
  67. margin-right: var(--arrow-width);
  68. right: 50%;
  69. &::after {
  70. left: 100%;
  71. }
  72. >.bubble-layer > .bubble-arr {
  73. left: calc(100% - 1px);
  74. right: calc(-1 * var(--arrow-width) * 1.1);
  75. border-left-color: var(--back-color);
  76. border-left-width: calc(var(--arrow-width) / 1.3);
  77. }
  78. }
  79. &.right {
  80. transform-origin: center left;
  81. margin-left: var(--arrow-width);
  82. left: 50%;
  83. &::after {
  84. right: 100%;
  85. }
  86. >.bubble-layer > .bubble-arr {
  87. right: 100%;
  88. left: calc(-1 * var(--arrow-width) * 1.1);
  89. border-right-color: var(--back-color);
  90. border-right-width: calc(var(--arrow-width) / 1.3);
  91. }
  92. }
  93. &.bottom,
  94. &.top {
  95. &.fade-enter-active,
  96. &.fade-leave-active {
  97. transform: scale(1);
  98. opacity: 1;
  99. }
  100. &.fade-enter-from,
  101. &.fade-leave-to {
  102. transform: scale(0);
  103. opacity: 0;
  104. }
  105. }
  106. &.bottom {
  107. top: 100%;
  108. left: calc(50% - var(--bottom-left));
  109. padding-top: var(--arrow-width);
  110. transform-origin: var(--bottom-left) top;
  111. >.bubble-layer > .bubble-arr {
  112. border-width: calc(var(--arrow-width) / 3);
  113. border-bottom-width: calc(var(--arrow-width) / 1.3);
  114. border-bottom-color: var(--back-color);
  115. left: 0;
  116. top: calc(-1 * var(--arrow-width));
  117. bottom: 100%;
  118. transform: translateX(calc(-50% + 0.5px));
  119. margin-left: var(--bottom-left);
  120. // clip-path: polygon(0 100%, 50% 0, 100% 100%);
  121. }
  122. }
  123. &.top {
  124. bottom: 100%;
  125. left: calc(50% - var(--bottom-left));
  126. padding-bottom: var(--arrow-width);
  127. transform-origin: var(--bottom-left) bottom;
  128. >.bubble-layer > .bubble-arr {
  129. border-width: calc(var(--arrow-width) / 3);
  130. border-top-width: calc(var(--arrow-width) / 1.3);
  131. border-top-color: var(--back-color);
  132. left: 0;
  133. top: 100%;
  134. transform: translateX(calc(-50% + 0.5px));
  135. margin-left: var(--bottom-left);
  136. // clip-path: polygon(0 100%, 50% 0, 100% 100%);
  137. }
  138. }
  139. }