prize-flying.vue 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. <template>
  2. <view class="prize-flying">
  3. <template v-for="(flyLeft, index) in flyLeftList">
  4. <!-- <view :key="'fly-left-' + index" :class="['fly-prize', 'fly-left']" :style="flyStyle(flyLeft)"></view> -->
  5. <view :key="'fly-left-' + index" :class="['fly-prize', 'fly-left']" :style="{ '-webkit-animation-duration': flySpeed + 's', 'animation-duration': flySpeed + 's' }">
  6. <image :src="flyLeft.image" mode=""></image>
  7. </view>
  8. </template>
  9. <template v-for="(flyCenter, index) in flyCenterList">
  10. <!-- <view :key="'fly-center-' + index" :class="['fly-prize', 'fly-center']" :style="flyStyle(flyCenter)"></view> -->
  11. <view :key="'fly-center-' + index" :class="['fly-prize', 'fly-center']" :style="{ '-webkit-animation-duration': flySpeed + 's', 'animation-duration': flySpeed + 's' }">
  12. <image :src="flyCenter.image.indexOf('http') == -1 ? 'https://www.chaomangdao.com' + flyCenter.image : flyCenter.image" mode=""></image>
  13. </view>
  14. </template>
  15. <template v-for="(flyRight, index) in flyRightList">
  16. <!-- <view :key="'fly-right-' + index" :class="['fly-prize', 'fly-right']" :style="flyStyle(flyRight)"></view> -->
  17. <view :key="'fly-right-' + index" :class="['fly-prize', 'fly-right']" :style="{ '-webkit-animation-duration': flySpeed + 's', 'animation-duration': flySpeed + 's' }">
  18. <image :src="flyRight.image.indexOf('http') == -1 ? 'https://www.chaomangdao.com' + flyRight.image : flyRight.image" mode=""></image>
  19. </view>
  20. </template>
  21. </view>
  22. </template>
  23. <script>
  24. export default {
  25. name: 'prize-flying',
  26. props: {
  27. boxId: Number
  28. },
  29. data() {
  30. return {
  31. prizeList: [],
  32. flyLeftList: [],
  33. flyCenterList: [],
  34. flyRightList: [],
  35. indexRecord: 0, //记录奖品下标
  36. intervalTime: 2, //飞出频率 秒
  37. interval: null,
  38. flySpeed: 25 //飞行速度 秒 越小越快
  39. };
  40. },
  41. created() {
  42. this.loadPrizeList();
  43. },
  44. destroyed() {
  45. //销毁
  46. clearInterval(this.interval);
  47. },
  48. computed: {
  49. prizeLength() {
  50. return this.prizeList.length;
  51. }
  52. },
  53. methods: {
  54. //加载奖品列表
  55. loadPrizeList() {
  56. if (!this.boxId) return;
  57. this.$api.boximages({ box_id: this.boxId }).then(({ data }) => {
  58. this.prizeList = data.goodsimagelist;
  59. this.flyInterval();
  60. });
  61. },
  62. //循环
  63. flyInterval() {
  64. this.pushFlyList();
  65. this.interval = setInterval(() => {
  66. this.pushFlyList();
  67. }, this.intervalTime * 1000);
  68. },
  69. pushFlyList() {
  70. let count = 0;
  71. while (count < 3) {
  72. if (this.indexRecord == this.prizeLength - 1) {
  73. this.indexRecord = 0;
  74. } else {
  75. this.indexRecord++;
  76. }
  77. let prize = this.prizeList[this.indexRecord];
  78. switch (count) {
  79. case 0:
  80. this.flyLeftList.push(prize);
  81. break;
  82. case 1:
  83. this.flyCenterList.push(prize);
  84. break;
  85. case 2:
  86. this.flyRightList.push(prize);
  87. break;
  88. }
  89. count++;
  90. }
  91. },
  92. flyStyle(prize) {
  93. return {
  94. background: `url(${prize.image})`,
  95. '-webkit-animation-duration': `${this.flySpeed}s`,
  96. 'animation-duration': `${this.flySpeed}s`
  97. };
  98. }
  99. }
  100. };
  101. </script>
  102. <style lang="scss">
  103. .prize-flying {
  104. z-index: 99;
  105. width: 200rpx;
  106. position: absolute;
  107. bottom: 50%;
  108. left: 50%;
  109. transform: translateX(-50%);
  110. .fly-prize {
  111. text-align: center;
  112. position: absolute;
  113. top: 100%;
  114. opacity: 0;
  115. width: 78rpx;
  116. height: 78rpx;
  117. background-repeat: no-repeat !important;
  118. background-size: 100% 100% !important;
  119. border-radius: 50%;
  120. background: #fff;
  121. border: 1px solid #3277ff;
  122. padding: 14rpx;
  123. }
  124. .fly-left {
  125. left: 0px;
  126. z-index: 5;
  127. -webkit-animation: flyleft;
  128. animation: flyleft;
  129. }
  130. .fly-center {
  131. left: 60rpx;
  132. z-index: 3;
  133. -webkit-animation: flycenter;
  134. animation: flycenter;
  135. }
  136. .fly-right {
  137. right: 0px;
  138. z-index: 5;
  139. -webkit-animation: flyright;
  140. animation: flyright;
  141. }
  142. }
  143. // 动画
  144. @keyframes flyleft {
  145. 0% {
  146. // top: 100%;
  147. -webkit-transform: scale(0) translateX(0);
  148. transform: scale(0) translateX(0);
  149. opacity: 0.6;
  150. }
  151. 3% {
  152. // top: 95%;
  153. }
  154. 5% {
  155. -webkit-transform: scale(1) translateX(0) translateY(-80%);
  156. transform: scale(1) translateX(0) translateY(-80%);
  157. opacity: 0.8;
  158. }
  159. 20% {
  160. opacity: 1;
  161. }
  162. 30% {
  163. opacity: 0.2;
  164. }
  165. 32% {
  166. opacity: 0;
  167. visibility: hidden;
  168. }
  169. 50% {
  170. -webkit-transform: scale(1.9) translateX(-40px) translateY(-340%);
  171. transform: scale(1.9) translateX(-40px) translateY(-340%);
  172. }
  173. 100% {
  174. // top: 0%;
  175. -webkit-transform: translateX(-100px);
  176. transform: translateX(-100px);
  177. }
  178. }
  179. @keyframes flycenter {
  180. 0% {
  181. // top: 100%;
  182. -webkit-transform: scale(0) translateX(0);
  183. transform: scale(0) translateX(0);
  184. opacity: 0.6;
  185. }
  186. 3% {
  187. // top: 95%;
  188. }
  189. 5% {
  190. -webkit-transform: scale(1) translateX(0) translateY(-80%);
  191. transform: scale(1) translateX(0) translateY(-80%);
  192. opacity: 0.8;
  193. }
  194. 20% {
  195. opacity: 1;
  196. }
  197. 30% {
  198. opacity: 0.2;
  199. }
  200. 32% {
  201. opacity: 0;
  202. visibility: hidden;
  203. }
  204. 34% {
  205. opacity: 0;
  206. }
  207. 50% {
  208. -webkit-transform: scale(1.9) translateX(0) translateY(-340%);
  209. transform: scale(1.9) translateX(0) translateY(-340%);
  210. }
  211. 100% {
  212. // top: 0%;
  213. -webkit-transform: translateX(0);
  214. transform: translateX(0);
  215. }
  216. }
  217. @keyframes flyright {
  218. 0% {
  219. // top: 100%;
  220. -webkit-transform: scale(0) translateX(0);
  221. transform: scale(0) translateX(0);
  222. opacity: 0.6;
  223. }
  224. 3% {
  225. // top: 95%;
  226. }
  227. 5% {
  228. -webkit-transform: scale(1) translateX(0) translateY(-80%);
  229. transform: scale(1) translateX(0) translateY(-80%);
  230. opacity: 0.8;
  231. }
  232. 20% {
  233. opacity: 1;
  234. }
  235. 30% {
  236. opacity: 0.2;
  237. }
  238. 32% {
  239. opacity: 0;
  240. visibility: hidden;
  241. }
  242. 34% {
  243. opacity: 0;
  244. }
  245. 50% {
  246. -webkit-transform: scale(1.9) translateX(40px) translateY(-340%);
  247. transform: scale(1.9) translateX(40px) translateY(-340%);
  248. }
  249. 100% {
  250. // top: 0%;
  251. -webkit-transform: translateX(100px);
  252. transform: translateX(100px);
  253. }
  254. }
  255. </style>