index.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433
  1. <template>
  2. <view>
  3. <u-navbar :placeholder="true" bgColor="#fff" :autoBack="true" :border="true" title="盲票开启"></u-navbar>
  4. <view class="rolling">
  5. <!-- 奖品滚动 -->
  6. <view class="rolling-prize">
  7. <view ref="rolling" class="rolling-prize-list" :animation="animationData">
  8. <view class="rolling-prize-list-item flex" v-for="(item, index) in list" :key="index">
  9. <view class="rolling-prize-list-item__items flex">
  10. <view class="content flex" v-for="(items, indexs) in item" :key="indexs">
  11. <image :src="items.url" mode="aspectFit"></image>
  12. <view class="content-title ells">{{ items.title }}</view>
  13. <view class="content-price">¥{{ $numberFormat(items.price) }}</view>
  14. </view>
  15. </view>
  16. </view>
  17. </view>
  18. <view class="rolling-prize-list" :animation="animationData">
  19. <view class="rolling-prize-list-item flex" v-for="(item, index) in list" :key="index">
  20. <view class="rolling-prize-list-item__items flex">
  21. <view class="content flex" v-for="(items, indexs) in item" :key="indexs">
  22. <image :src="items.url" mode="aspectFit"></image>
  23. <view class="content-title ells">{{ items.title }}</view>
  24. <view class="content-price">¥{{ $numberFormat(items.price) }}</view>
  25. </view>
  26. </view>
  27. </view>
  28. </view>
  29. </view>
  30. <!-- 按钮 -->
  31. <view class="rolling-btn flex">
  32. <view class="rolling-btn-content flex" :class="{ 'btn-stop': btnIng }" @click="stop">
  33. <image src="../../static/ticketBox/ticket_btn_center.png" mode="scaleToFill"></image>
  34. <view class="rolling-btn-content-title">停止滚动</view>
  35. </view>
  36. </view>
  37. <!-- 倒计时 -->
  38. <view class="rolling-time flex">
  39. <view class="num">{{ num }}</view>
  40. </view>
  41. </view>
  42. </view>
  43. </template>
  44. <script>
  45. import env from '../../config/env.js'
  46. import $http from '@/utils/request.js'
  47. export default {
  48. data() {
  49. return {
  50. animationData: {}, // 动画信息
  51. num: 8, // 动画倒计时
  52. num2: 0, // 动画持续时间
  53. time: null, // 定时器
  54. list: [
  55. [
  56. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软显示(Miceosoft)日版Xbox Seies S', price: 2999 },
  57. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  58. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  59. ],
  60. [
  61. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软显示(Miceosoft)日版Xbox Seies S', price: 2999 },
  62. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  63. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  64. ],
  65. [
  66. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软显示(Miceosoft)日版Xbox Seies S', price: 2999 },
  67. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  68. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  69. ],
  70. [
  71. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软显示(Miceosoft)日版Xbox Seies S', price: 2999 },
  72. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  73. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  74. ],
  75. [
  76. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软显示(Miceosoft)日版Xbox Seies S', price: 2999 },
  77. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  78. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  79. ],
  80. [
  81. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软显示(Miceosoft)日版Xbox Seies S', price: 2999 },
  82. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  83. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  84. ],
  85. [
  86. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软显示(Miceosoft)日版Xbox Seies S', price: 2999 },
  87. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  88. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  89. ],
  90. [
  91. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软显示(Miceosoft)日版Xbox Seies S', price: 2999 },
  92. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  93. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  94. ],
  95. [
  96. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软显示(Miceosoft)日版Xbox Seies S', price: 2999 },
  97. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  98. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  99. ],
  100. [
  101. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软显示(Miceosoft)日版Xbox Seies S', price: 2999 },
  102. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  103. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  104. ],
  105. [
  106. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软显示(Miceosoft)日版Xbox Seies S', price: 2999 },
  107. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  108. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  109. ],
  110. [
  111. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软显示(Miceosoft)日版Xbox Seies S', price: 2999 },
  112. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  113. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  114. ],
  115. [
  116. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软显示(Miceosoft)日版Xbox Seies S', price: 2999 },
  117. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  118. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  119. ],
  120. [
  121. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软显示(Miceosoft)日版Xbox Seies S', price: 2999 },
  122. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  123. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  124. ],
  125. [
  126. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软显示(Miceosoft)日版Xbox Seies S', price: 2999 },
  127. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  128. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  129. ],
  130. [
  131. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软显示(Miceosoft)日版Xbox Seies S', price: 2999 },
  132. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  133. { url: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '微软(Miceosoft)日版Xbox Seies S', price: 2999 },
  134. ],
  135. ],
  136. btnIng: false,
  137. }
  138. },
  139. onLoad() {
  140. // 创建动画实例
  141. this.animation = uni.createAnimation()
  142. },
  143. onUnload() {
  144. // 移除动画
  145. this.animationData = {}
  146. },
  147. mounted() {
  148. this.running()
  149. },
  150. methods: {
  151. // 动画开始
  152. running() {
  153. // #ifdef H5
  154. // 获取滚动奖品列表长度
  155. this.data = this.$refs.rolling.$el.clientWidth
  156. // 调用 step() 来表示一组动画完成
  157. this.animation.translateX(-this.data).step({
  158. duration: 8000,
  159. timingFunction: 'linear'
  160. })
  161. // export方法导出动画数据
  162. this.animationData = this.animation.export()
  163. // 倒计时
  164. this.time = setInterval(() => {
  165. // 开奖倒计时、页面显示
  166. this.num--
  167. // 记录动画执行时间,停止动画计算移动距离时使用
  168. this.num2++
  169. if (this.num == 0) {
  170. clearInterval(this.time)
  171. }
  172. }, 1000)
  173. // 不手动停止动画,自动停止
  174. setTimeout(() => {
  175. this.stop()
  176. }, 8000);
  177. // #endif
  178. // #ifdef MP-WEIXIN
  179. // 元素详细信息
  180. uni.createSelectorQuery().in(this).select(".rolling-prize-list").boundingClientRect(info => {
  181. this.data = info.width
  182. // 调用 step() 来表示一组动画完成
  183. this.animation.translateX(-this.data).step({
  184. duration: 8000,
  185. timingFunction: 'linear'
  186. })
  187. // export方法导出动画数据
  188. this.animationData = this.animation.export()
  189. // 倒计时
  190. this.time = setInterval(() => {
  191. // 开奖倒计时、页面显示
  192. this.num--
  193. // 记录动画执行时间,停止动画计算移动距离时使用
  194. this.num2++
  195. if (this.num == 0) {
  196. clearInterval(this.time)
  197. }
  198. }, 1000)
  199. }).exec();
  200. // 不手动停止动画,自动停止
  201. setTimeout(() => {
  202. this.num = 0
  203. this.stop()
  204. }, 8000);
  205. // #endif
  206. },
  207. // 停止动画
  208. stop() {
  209. // 获取屏幕距离,用于计算停止动画移动距离计算
  210. let screenWidth = null
  211. uni.getSystemInfo({
  212. success: function(res) {
  213. screenWidth = res.screenWidth;
  214. }
  215. });
  216. this.btnIng = true
  217. /**
  218. * 0秒:下标4
  219. * 1秒:下标6
  220. * 2秒:下标8
  221. * 3秒:下标10
  222. * 4秒:下标12
  223. * 5秒:下标14
  224. * 6秒:下标16
  225. * 7秒:下标2
  226. * 8秒:下标2
  227. * */
  228. clearInterval(this.time)
  229. this.animationData = {}
  230. if (this.num2 == 0) {
  231. this.list[3][1].url = 'https://cdn.uviewui.com/uview/album/4.jpg'
  232. } else if (this.num2 == 1) {
  233. this.list[5][1].url = 'https://cdn.uviewui.com/uview/album/4.jpg'
  234. } else if (this.num2 == 2) {
  235. this.list[7][1].url = 'https://cdn.uviewui.com/uview/album/4.jpg'
  236. } else if (this.num2 == 3) {
  237. this.list[9][1].url = 'https://cdn.uviewui.com/uview/album/4.jpg'
  238. } else if (this.num2 == 4) {
  239. this.list[11][1].url = 'https://cdn.uviewui.com/uview/album/4.jpg'
  240. } else if (this.num2 == 5) {
  241. this.list[13][1].url = 'https://cdn.uviewui.com/uview/album/4.jpg'
  242. } else if (this.num2 == 6) {
  243. this.list[15][1].url = 'https://cdn.uviewui.com/uview/album/4.jpg'
  244. } else if (this.num2 == 7) {
  245. // this.list[1][1].url = 'https://cdn.uviewui.com/uview/album/4.jpg'
  246. this.$set(this.list[1][1], 'url', 'https://cdn.uviewui.com/uview/album/4.jpg')
  247. console.log(this.list[1][1]);
  248. } else if (this.num2 == 8) {
  249. // #ifdef MP-WEIXIN
  250. // this.list[1][1].url = 'https://cdn.uviewui.com/uview/album/4.jpg'
  251. this.$set(this.list[1][1], 'url', 'https://cdn.uviewui.com/uview/album/4.jpg')
  252. // #endif
  253. // #ifdef H5
  254. this.$set(this.list[3][1], 'url', 'https://cdn.uviewui.com/uview/album/4.jpg')
  255. console.log(this.list[3][1]);
  256. // this.list[3][1].url = 'https://cdn.uviewui.com/uview/album/4.jpg'
  257. // #endif
  258. }
  259. // #ifdef H5
  260. /**
  261. * 根据动画时间移动到指定位置
  262. * this.data / 8 :动画平均移动距离
  263. * this.num2 : 动画执行时间
  264. * screenWidth * 3 :移动3个屏幕距离
  265. */
  266. this.animation.translateX(-(this.data / 8 * this.num2 + screenWidth * 3)).step({
  267. duration: 4000,
  268. timingFunction: 'ease'
  269. })
  270. this.animationData = this.animation.export()
  271. // #endif
  272. // #ifdef MP-WEIXIN
  273. uni.createSelectorQuery().in(this).select(".rolling-prize-list").boundingClientRect(info => {
  274. this.data = info.width
  275. this.animation.translateX(-(this.data / 8 * this.num2 + screenWidth * 3)).step({
  276. duration: 4000,
  277. timingFunction: 'ease'
  278. })
  279. this.animationData = this.animation.export()
  280. }).exec();
  281. // #endif
  282. }
  283. },
  284. }
  285. </script>
  286. <style lang="scss" scoped>
  287. .rolling {
  288. width: 100%;
  289. height: calc(100vh - 44px);
  290. background: url(https://mp-public-1310078123.cos.ap-shanghai.myqcloud.com/v2/prize_bkg1.png) center center no-repeat;
  291. background-size: 100vw calc(100vh - 44px);
  292. overflow: hidden;
  293. // 奖品滚动
  294. &-prize {
  295. display: flex;
  296. margin-top: 30vh;
  297. height: 28vh;
  298. background: url(https://mp-public-1310078123.cos.ap-shanghai.myqcloud.com/v2/prize_bkg2.png) center center no-repeat;
  299. background-size: 100vw 28vh;
  300. margin-bottom: 42rpx;
  301. &-list {
  302. display: flex;
  303. margin-top: 76rpx;
  304. height: calc(100% - 76rpx);
  305. &-item {
  306. width: 100vw;
  307. height: 100%;
  308. &__items {
  309. align-items: flex-start;
  310. justify-content: space-evenly;
  311. width: 100vw;
  312. height: 100%;
  313. .content {
  314. flex-direction: column;
  315. width: 30%;
  316. height: 85%;
  317. image {
  318. width: 100%;
  319. height: 60%;
  320. margin-bottom: 16rpx;
  321. }
  322. &-title {
  323. width: 100%;
  324. line-height: 34rpx;
  325. font-size: 26rpx;
  326. text-align: center;
  327. margin-bottom: 20rpx;
  328. }
  329. &-price {
  330. width: 100%;
  331. line-height: 26rpx;
  332. font-size: 26rpx;
  333. text-align: center;
  334. }
  335. }
  336. // .content:nth-child(2) {
  337. // justify-content: flex-start;
  338. // color: #333;
  339. // image {
  340. // width: 100%;
  341. // height: 60%;
  342. // }
  343. // .content-title {
  344. // font-weight: bold;
  345. // }
  346. // .content-price {
  347. // font-weight: bold;
  348. // }
  349. // }
  350. }
  351. }
  352. }
  353. }
  354. // 按钮
  355. &-btn {
  356. height: 160rpx;
  357. margin-bottom: 36rpx;
  358. &-content {
  359. position: relative;
  360. height: 100%;
  361. image {
  362. width: 486rpx;
  363. height: 100%;
  364. }
  365. &-title {
  366. position: absolute;
  367. top: 30rpx;
  368. font-size: 72rpx;
  369. font-family: YouSheBiaoTiHei;
  370. font-weight: 400;
  371. color: #FFFFFF;
  372. line-height: 72rpx;
  373. opacity: 0.99;
  374. }
  375. }
  376. .btn-stop {
  377. animation: scaleBtn 0.2s linear;
  378. }
  379. // 放大缩小动画
  380. @keyframes scaleBtn {
  381. from {
  382. transform: scale(0.9);
  383. }
  384. to {
  385. transform: scale(1);
  386. }
  387. }
  388. }
  389. // 倒计时
  390. &-time {
  391. .num {
  392. font-size: 110rpx;
  393. font-family: YouSheBiaoTiHei;
  394. font-weight: 400;
  395. color: #FFFFFF;
  396. line-height: 110rpx;
  397. }
  398. }
  399. }
  400. </style>