index.vue 15 KB

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