carousel.vue 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. <template>
  2. <div class="area-carousel">
  3. <!-- left -->
  4. <div class="area-left" @click="state.page_show = '总邀请者页'">
  5. <div>
  6. <img :src="require('@/assets/svg/icon-user1.svg')" alt="" />
  7. <span>{{ state.detail.receiveCountWithAmount }}</span>
  8. </div>
  9. <div>Get Money</div>
  10. </div>
  11. <div class="area-right">
  12. <div class="area-success-message" @mouseover="mouseOver" @mouseleave="mouseLeave">
  13. <div class="content-success-message" ref="content_success_message">
  14. <div class="success-message" v-for="item, index in state.success_message_list" :key="index"
  15. @click="clickItem(item)">
  16. <img :src="item.userInfo.avatarUrl" alt="" />
  17. <span>Get</span> &nbsp;
  18. <span>${{ item.amountUsdValue }}</span>
  19. </div>
  20. </div>
  21. </div>
  22. </div>
  23. </div>
  24. </template>
  25. <script setup>
  26. import { inject, ref, onMounted, watch } from 'vue'
  27. import { receiveListV2 } from '@/http/treasure.js'
  28. let content_success_message = ref(null)
  29. let state = inject('state')
  30. let global_refresh = inject('global_refresh')
  31. // ---- 走马灯
  32. state.success_message_list = []
  33. watch(global_refresh, () => {
  34. if (global_refresh.value) {
  35. init()
  36. }
  37. })
  38. onMounted(() => {
  39. init()
  40. })
  41. const init = () => {
  42. receiveListV2({
  43. params: {
  44. postId: state.postId,
  45. pageNum: 1,
  46. pageSize: 1000,
  47. }
  48. }).then((res) => {
  49. if (res.code == 0) {
  50. state.success_message_list = res.data
  51. state.success_message_list = state.success_message_list.concat(state.success_message_list)
  52. while (state.success_message_list.length < 10 && state.success_message_list.length > 0) {
  53. state.success_message_list = state.success_message_list.concat(state.success_message_list)
  54. }
  55. if (content_success_message && content_success_message.value) {
  56. let dom = content_success_message.value
  57. let s = state.success_message_list.length * 4
  58. dom.style.animationDuration = s + 's'
  59. }
  60. }
  61. })
  62. }
  63. const clickItem = (item) => {
  64. window.open(`https://twitter.com/${item.userInfo.nickName}`)
  65. }
  66. const mouseOver = () => {
  67. if (content_success_message && content_success_message.value && content_success_message.value.style) {
  68. content_success_message.value.style.animationPlayState = 'paused'
  69. }
  70. }
  71. const mouseLeave = () => {
  72. if (content_success_message && content_success_message.value && content_success_message.value.style) {
  73. content_success_message.value.style.animationPlayState = 'running'
  74. }
  75. }
  76. </script>
  77. <style lang="scss" scoped>
  78. .area-carousel {
  79. width: 100%;
  80. display: flex;
  81. .area-left {
  82. cursor: pointer;
  83. user-select: none;
  84. width: 78px;
  85. div:nth-child(1) {
  86. display: flex;
  87. align-items: center;
  88. img {
  89. width: 16px;
  90. height: 16px;
  91. margin-left: 14px;
  92. margin-right: 6px;
  93. }
  94. span {
  95. color: #FFFFFF;
  96. font-weight: 600;
  97. font-size: 12px;
  98. }
  99. }
  100. div:nth-child(2) {
  101. margin: 6px 0;
  102. text-align: center;
  103. color: #FFFFFF;
  104. opacity: 0.4;
  105. font-weight: 400;
  106. }
  107. }
  108. .area-right {
  109. flex: 1;
  110. overflow: hidden;
  111. .area-success-message {
  112. height: 30px;
  113. width: 100%;
  114. .content-success-message {
  115. width: fit-content;
  116. display: flex;
  117. animation: rolling 18s linear infinite;
  118. animation-duration: 10s;
  119. animation-play-state: running;
  120. .success-message {
  121. cursor: pointer;
  122. width: fit-content;
  123. height: 30px;
  124. padding: 0 9px;
  125. border-radius: 100px;
  126. background: rgba(255, 255, 255, 0.1);
  127. display: flex;
  128. align-items: center;
  129. overflow: hidden;
  130. margin-right: 10px;
  131. img {
  132. width: 20px;
  133. height: 20px;
  134. border-radius: 100px;
  135. margin-right: 5px;
  136. }
  137. span {
  138. font-style: normal;
  139. font-weight: 500;
  140. font-size: 12px;
  141. line-height: 14px;
  142. white-space: nowrap;
  143. }
  144. span:nth-child(2) {
  145. color: #FFFFFF;
  146. opacity: 0.5;
  147. }
  148. span:nth-child(3) {
  149. color: #FFFFFF;
  150. }
  151. }
  152. }
  153. }
  154. }
  155. }
  156. @keyframes rolling {
  157. from {
  158. transform: translateX(0);
  159. }
  160. to {
  161. transform: translateX(-50%);
  162. }
  163. }
  164. </style>