m-audio.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. <template>
  2. <view class="flex_c">
  3. <view class="flex_r" :class="{ text_box: isMy }">
  4. <view class="text-box" @tap.stop="onClick">
  5. <view
  6. class="text_30 flex_r fa_c text"
  7. :class="isMy ? 'text_r' : 'text_l'"
  8. :style="{ width: setWidth }"
  9. :hover-class="isMy ? 'hover_classr' : 'hover_classl'"
  10. :hover-stay-time="60"
  11. >
  12. <view class="text-icon" v-if="value.pause !== 3">
  13. <image
  14. class="img"
  15. src="data:image/svg+xml;base64,PHN2ZyBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PHBhdGggZD0iTTY3NC44MDYgNzcuMTI2YTQ2LjAwOCA0Ni4wMDggMCAwIDAtNjYuMTc2IDAgNDYuMDA4IDQ2LjAwOCAwIDAgMCAwIDYzLjAyNSA1MjAuNTg4IDUyMC41ODggMCAwIDEgMCA3MzUuNTA0IDQ3LjI2OSA0Ny4yNjkgMCAwIDAgMCA2Ni44MDcgNDcuMjY5IDQ3LjI2OSAwIDAgMCA2Ni44MDcgMCA2MTQuNDk2IDYxNC40OTYgMCAwIDAtLjYzLTg2NS4zMzZ6Ii8+PHBhdGggZD0iTTQ2Ny40NTMgMjQyLjg4MmE0Ny4yNjkgNDcuMjY5IDAgMCAwLTYzLjAyNSAwIDQ2LjYzOSA0Ni42MzkgMCAwIDAgMCA2My4wMjYgMjk5LjM3IDI5OS4zNyAwIDAgMSAwIDQyMi4yNjggNDcuMjY5IDQ3LjI2OSAwIDAgMCAwIDYzLjAyNiA0Ni42MzkgNDYuNjM5IDAgMCAwIDYzLjAyNSAwIDM5My45MDggMzkzLjkwOCAwIDAgMCAwLTU0OC4zMnptLTI3Ny4zMSAyMTQuOTE2YTc4LjE1MSA3OC4xNTEgMCAwIDAgMCAxMTAuOTI1IDc4Ljc4MiA3OC43ODIgMCAxIDAgMC0xMTAuOTI1eiIvPjwvc3ZnPg=="
  16. mode="aspectFill"
  17. ></image>
  18. </view>
  19. <view class="text-icon" v-if="value.pause == 3">
  20. <image class="img" style="transform: scale(1.35)" :src="require('@/static/image/play.gif')" mode="aspectFill"></image>
  21. </view>
  22. <view class="text-duration">{{ Math.ceil(value.payload.duration) || 1 }}''</view>
  23. </view>
  24. </view>
  25. </view>
  26. </view>
  27. </template>
  28. <script>
  29. export default {
  30. components: {},
  31. props: {
  32. isMy: {
  33. type: [Boolean, Number],
  34. default: false
  35. },
  36. value: {
  37. type: Object,
  38. default: {}
  39. }
  40. },
  41. data() {
  42. return {};
  43. },
  44. computed: {
  45. setWidth() {
  46. let width = 0;
  47. const duration = Math.ceil(this.value.payload.duration);
  48. // 基础长度
  49. let basis = duration - 10;
  50. if (basis >= 0) {
  51. width = 10 * 8 + 60;
  52. width = width + basis * 2;
  53. } else {
  54. width = duration * 8 + 60;
  55. }
  56. return `${width}px`;
  57. }
  58. },
  59. methods: {
  60. onClick() {
  61. this.$emit('onClick');
  62. }
  63. }
  64. };
  65. </script>
  66. <style scoped lang="scss">
  67. .row_ {
  68. flex-direction: row-reverse;
  69. }
  70. .text_box {
  71. flex-direction: row-reverse;
  72. }
  73. .text-box {
  74. border-radius: 8rpx;
  75. }
  76. .text {
  77. position: relative;
  78. z-index: 99;
  79. box-sizing: border-box;
  80. padding: 18rpx 16rpx;
  81. border-radius: 8rpx;
  82. word-break: break-all;
  83. vertical-align: center;
  84. .text-icon {
  85. width: 32rpx;
  86. height: 32rpx;
  87. margin: 0 4rpx;
  88. }
  89. .text-duration {
  90. margin: 0 8rpx;
  91. }
  92. }
  93. .text_r {
  94. position: relative;
  95. z-index: 2;
  96. background-color: #95ec6a;
  97. flex-direction: row-reverse;
  98. .text-icon {
  99. transform: rotate(180deg);
  100. }
  101. }
  102. .text_l {
  103. position: relative;
  104. z-index: 2;
  105. background-color: #fff;
  106. }
  107. .text_r::after {
  108. position: absolute;
  109. z-index: -1;
  110. content: '';
  111. top: 28rpx;
  112. right: -8rpx;
  113. width: 18rpx;
  114. height: 18rpx;
  115. border-radius: 2px;
  116. transform: rotate(45deg);
  117. background-color: #95ec6a;
  118. }
  119. .text_l::after {
  120. position: absolute;
  121. z-index: -1;
  122. content: '';
  123. top: 28rpx;
  124. left: -8rpx;
  125. width: 18rpx;
  126. height: 18rpx;
  127. border-radius: 2px;
  128. transform: rotate(45deg);
  129. background-color: #fff;
  130. }
  131. .hover_classr {
  132. background-color: #89d961;
  133. }
  134. .hover_classl {
  135. background-color: #e2e2e2;
  136. }
  137. .hover_classr::after {
  138. position: absolute;
  139. z-index: -1;
  140. content: '';
  141. top: 28rpx;
  142. right: -8rpx;
  143. width: 18rpx;
  144. height: 18rpx;
  145. border-radius: 2px;
  146. transform: rotate(45deg);
  147. background-color: #89d961;
  148. }
  149. .hover_classl::after {
  150. position: absolute;
  151. z-index: -1;
  152. content: '';
  153. top: 28rpx;
  154. left: -8rpx;
  155. width: 18rpx;
  156. height: 18rpx;
  157. border-radius: 2px;
  158. transform: rotate(45deg);
  159. background-color: #e2e2e2;
  160. }
  161. </style>