vastwu-barrage.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. <template>
  2. <view class="">
  3. <view class="vastwu-barrage" :style="{width:width,height:height}" v-if="textList1.length">
  4. <block v-for="(item,index) in items" :key="index">
  5. <!-- 每个盒子不一定只放一个 -->
  6. <view class="barrages" :style="{top: `${trackList[index]}rpx`
  7. }">
  8. <view class="barrage" v-for="(tx,i) in item.textList" :key="i" @click="handleClick(tx)">
  9. {{tx.text}}
  10. </view>
  11. <view class="barrage" v-for="(tx,i) in item.textList" :key="i+99" @click="handleClick(tx)">
  12. {{tx.text}}
  13. </view>
  14. </view>
  15. </block>
  16. </view>
  17. <view v-else class="vastwu-barrage" :style="{width:width,height:height}"
  18. style="display: flex;justify-content: center;align-items: center;">
  19. <image src="@/static/images/err.png" mode="" style="width: 100rpx;;height: 80rpx;"></image>暂无热门提问,换一换试试~
  20. </view>
  21. </view>
  22. </template>
  23. <script>
  24. export default {
  25. name: 'vastwu-barrage',
  26. props: {
  27. textList1: {
  28. type: Array
  29. },
  30. trackList: {
  31. type: Array,
  32. default: function() {
  33. return [0, 100, 200]
  34. }
  35. },
  36. icon: {
  37. type: String,
  38. default: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-d0fe8d48-ece3-4582-a195-6929fb47a9c5/43a4f7a7-ff65-4460-b774-1249f31fbef7.png'
  39. },
  40. minTime: {
  41. type: Number,
  42. default: 7
  43. },
  44. maxTime: {
  45. type: Number,
  46. default: 10
  47. },
  48. width: {
  49. type: String,
  50. default: '750rpx'
  51. },
  52. height: {
  53. type: String,
  54. default: '100%'
  55. }
  56. },
  57. data() {
  58. return {
  59. items: [],
  60. values: '',
  61. textIndex: 0
  62. }
  63. },
  64. created() {
  65. this.values = this.items.length
  66. },
  67. watch: {
  68. textList1: {
  69. handler(n, o) {
  70. if (n != o) {
  71. console.log('textList1-----', n);
  72. this.init(n)
  73. }
  74. },
  75. immediate: true
  76. }
  77. },
  78. methods: {
  79. handleClick(item) {
  80. this.$emit('teplateItemClicked', item.text)
  81. },
  82. add(text = '', time = this.randomNum(this.minTime, this.maxTime)) {
  83. if (this.items.length >= this.trackList.length) {
  84. if (this.textIndex < this.trackList.length) {
  85. this.items[this.textIndex].textList.push(text);
  86. this.textIndex++;
  87. } else {
  88. this.textIndex = 0
  89. this.items[this.textIndex].textList.push(text);
  90. this.textIndex++;
  91. }
  92. } else {
  93. this.items.push({
  94. textList: [text],
  95. time,
  96. color: 'black',
  97. paused: '',
  98. });
  99. }
  100. },
  101. init(items = []) {
  102. this.items = [];
  103. let i = 0;
  104. this.values = items.length;
  105. for (let i = 0; i < items.length; i++) {
  106. let time = 10;
  107. time = this.randomNum(this.minTime, this.maxTime);
  108. this.add(items[i], time);
  109. }
  110. },
  111. //生成从minNum到maxNum的随机数
  112. randomNum(minNum, maxNum) {
  113. switch (arguments.length) {
  114. case 1:
  115. return parseInt(Math.random() * minNum + 1, 10);
  116. break;
  117. case 2:
  118. return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10);
  119. break;
  120. default:
  121. return 0;
  122. break;
  123. }
  124. }
  125. }
  126. }
  127. </script>
  128. <style>
  129. .barrages {
  130. position: absolute;
  131. white-space: nowrap;
  132. animation: mymove 15s linear infinite;
  133. animation-timing-function: linear;
  134. -webkit-animation-timing-function: linear;
  135. animation-fill-mode: forwards;
  136. -webkit-backface-visibility: hidden;
  137. -moz-backface-visibility: hidden;
  138. -ms-backface-visibility: hidden;
  139. backface-visibility: hidden;
  140. -webkit-perspective: 1000;
  141. -moz-perspective: 1000;
  142. -ms-perspective: 1000;
  143. perspective: 1000;
  144. /* Other transform properties here */
  145. }
  146. .barrage {
  147. position: relative;
  148. padding: 0 48rpx;
  149. border-radius: 32rpx;
  150. background-color: #E5E9EE;
  151. margin-right: 16rpx;
  152. display: inline-block;
  153. font-size: 24rpx;
  154. height: 56rpx;
  155. line-height: 56rpx;
  156. max-width: 480rpx;
  157. text-overflow: ellipsis;
  158. overflow: hidden;
  159. }
  160. .vastwu-barrage {
  161. z-index: 3;
  162. position: relative;
  163. overflow: hidden;
  164. }
  165. @keyframes mymove {
  166. from {
  167. /* left: 100%; */
  168. transform: translateX(0rpx);
  169. }
  170. to {
  171. /* left: -120%; */
  172. transform: translateX(-50%);
  173. }
  174. }
  175. @-moz-keyframes mymove
  176. /* Firefox */
  177. {
  178. from {
  179. /* left: 100%; */
  180. transform: translateX(0rpx);
  181. }
  182. to {
  183. /* left: -120%; */
  184. transform: translateX(-50%);
  185. }
  186. }
  187. @-webkit-keyframes mymove
  188. /* Safari and Chrome */
  189. {
  190. from {
  191. /* left: 100%; */
  192. transform: translateX(0rpx);
  193. }
  194. to {
  195. /* left: -120%; */
  196. transform: translateX(-50%);
  197. }
  198. }
  199. @-o-keyframes mymove
  200. /* Opera */
  201. {
  202. from {
  203. /* left: 100%; */
  204. transform: translateX(0rpx);
  205. }
  206. to {
  207. /* left: -120%; */
  208. transform: translateX(-50%);
  209. }
  210. }
  211. </style>