index.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797
  1. <template>
  2. <view>
  3. <!-- #ifdef MP-ALIPAY -->
  4. <u-navbar :placeholder="true" bgColor="#fff" :autoBack="true" :border="true" title="盲票开启" v-if="rollingShow"
  5. leftIconSize="0"></u-navbar>
  6. <!-- #endif -->
  7. <!-- #ifndef MP-ALIPAY -->
  8. <u-navbar :placeholder="true" bgColor="#fff" :autoBack="true" :border="true" title="盲票开启" v-if="rollingShow">
  9. </u-navbar>
  10. <!-- #endif -->
  11. <view class="rolling" v-if="rollingShow">
  12. <!-- 奖品滚动 -->
  13. <view class="rolling-prize">
  14. <view ref="rolling" class="rolling-prize-list" :animation="animationData">
  15. <view class="rolling-prize-list-item flex" v-for="(item, index) in list" :key="index">
  16. <view class="rolling-prize-list-item__items flex">
  17. <view class="content flex" v-for="(items, indexs) in item" :key="indexs">
  18. <image :src="items.picUrl" mode="aspectFit"></image>
  19. <view class="content-title ells-one"
  20. v-if="items.prizeType && items.prizeType.value != 'coin'">{{ items.title }}</view>
  21. <view class="content-title ells-one" v-else>盲豆</view>
  22. <view class="content-price" v-if="items.prizeType && items.prizeType.value != 'coin'">
  23. ¥{{ $numberFormat(items.value) }}</view>
  24. <view class="content-price" v-else>{{ items.value }}个</view>
  25. </view>
  26. </view>
  27. </view>
  28. </view>
  29. <view class="rolling-prize-list" :animation="animationData">
  30. <view class="rolling-prize-list-item flex" v-for="(item, index) in list" :key="index">
  31. <view class="rolling-prize-list-item__items flex">
  32. <view class="content flex" v-for="(items, indexs) in item" :key="indexs">
  33. <image :src="items.picUrl" mode="aspectFit"></image>
  34. <view class="content-title ells-one"
  35. v-if="items.prizeType && items.prizeType.value != 'coin'">{{ items.title }}</view>
  36. <view class="content-title ells-one" v-else>盲豆</view>
  37. <view class="content-price" v-if="items.prizeType && items.prizeType.value != 'coin'">
  38. ¥{{ $numberFormat(items.value) }}</view>
  39. <view class="content-price" v-else>{{ items.value }}个</view>
  40. </view>
  41. </view>
  42. </view>
  43. </view>
  44. </view>
  45. <!-- 按钮 -->
  46. <view class="rolling-btn flex">
  47. <view class="rolling-btn-content flex" :class="{ 'btn-stop': btnIng }" @click="stop" v-show="btnShow">
  48. <image src="../../static/ticketBox/ticket_btn_center.png" mode="scaleToFill"></image>
  49. <view class="rolling-btn-content-title">停止滚动</view>
  50. </view>
  51. </view>
  52. <!-- 倒计时 -->
  53. <view class="rolling-time flex">
  54. <view class="num">{{ num }}</view>
  55. </view>
  56. </view>
  57. <!-- 奖品显示 -->
  58. <view class="prize" v-else>
  59. <!-- #ifndef MP-ALIPAY -->
  60. <view class="prize-navLeft flex" :style="{ top: statusHeight + 'px' }" @click="back">
  61. <u-icon size="19" color="#fff" name="arrow-left"></u-icon>
  62. </view>
  63. <!-- #endif -->
  64. <view class="prize-title flex">
  65. <image src="../../packagePrize/static/rolling_title.png" mode="scaleToFill"></image>
  66. </view>
  67. <view class="prize-box flex">
  68. <view class="prize-box-popup flex">
  69. <view class="prize-box-popup__image flex">
  70. <image :src="prizeInfo.picUrl" mode="aspectFit"></image>
  71. </view>
  72. <image class="prize-box-popup__rotate" src="../static/rolling_bg1.png" mode="scaleToFill"
  73. v-if="rotateShow" />
  74. <image class="prize-box-popup__circular" src="../static/rolling_bg2.png" mode="scaleToFill"
  75. v-if="circularShow" />
  76. </view>
  77. </view>
  78. <view class="prize-info flex">
  79. <view class="prize-info-content">
  80. <view class="prize-info-content-price"
  81. v-if="prizeInfo.prizeType && prizeInfo.prizeType.value != 'coin'">
  82. <text>¥</text>{{ $numberFormat(prizeInfo.value) }}</view>
  83. <view class="prize-info-content-price" v-else>{{ prizeInfo.value }}个</view>
  84. <!-- #ifdef MP-ALIPAY -->
  85. <view class="prize-info-content-titletwo"
  86. v-if="prizeInfo.prizeType && prizeInfo.prizeType.value != 'coin'">{{ prizeInfo.title }}</view>
  87. <view class="prize-info-content-titletwo" v-else>盲豆</view>
  88. <!-- #endif -->
  89. <!-- #ifndef MP-ALIPAY -->
  90. <view class="prize-info-content-title ells-one"
  91. v-if="prizeInfo.prizeType && prizeInfo.prizeType.value != 'coin'">{{ prizeInfo.title }}</view>
  92. <view class="prize-info-content-title" v-else>盲豆</view>
  93. <!-- #endif -->
  94. <view class="prize-info-content-btn flex">
  95. <view class="prize-info-content-btn-content flex" v-if="isTry == 0">
  96. <image src="../../packagePrize/static/rolling_btn.png" mode="aspectFit"></image>
  97. <view class="prize-info-content-btn-content-txt" @click="toPrize(prizeInfo.prizeType)"
  98. v-if="prizeInfo.prizeType && prizeInfo.prizeType.value != 'coin'">去查看我的奖品</view>
  99. <view class="prize-info-content-btn-content-txt" @click="toPrize(prizeInfo.prizeType)"
  100. v-else>去商城兑换商品</view>
  101. </view>
  102. <view class="prize-info-content-btn-content flex" v-else @click="back">
  103. <image src="../../packagePrize/static/rolling_btn.png" mode="aspectFit"></image>
  104. <view class="prize-info-content-btn-content-txt">来把真的</view>
  105. </view>
  106. </view>
  107. </view>
  108. </view>
  109. <view class="prize-tip flex" v-if="isTry == 0" @click="back">
  110. <view class="txt">再来一张</view>
  111. </view>
  112. </view>
  113. </view>
  114. </template>
  115. <script>
  116. import env from '../../config/env.js'
  117. import $http from '@/utils/request.js'
  118. export default {
  119. data() {
  120. return {
  121. animationData: {}, // 动画信息
  122. num: 8, // 动画倒计时
  123. num2: 0, // 动画持续时间
  124. time: null, // 定时器
  125. stopTime: null, //自动停止
  126. list: [],
  127. prizeInfo: {},
  128. btnIng: false,
  129. rollingShow: true,
  130. statusHeight: 30,
  131. btnShow: false,
  132. boxId: null,
  133. isTry: null,
  134. orderId: '',
  135. ticketId: '',
  136. rotateShow: true,
  137. circularShow: true
  138. }
  139. },
  140. onLoad(options) {
  141. if (options) {
  142. this.boxId = options.boxId
  143. this.isTry = Number(options.isTry)
  144. this.orderId = options.orderId
  145. this.ticketId = options.ticketId
  146. }
  147. // 创建动画实例
  148. this.animation = uni.createAnimation()
  149. // #ifdef MP-WEIXIN
  150. const res = uni.getMenuButtonBoundingClientRect()
  151. this.statusHeight = res.top //胶囊距离顶部
  152. // #endif
  153. },
  154. onUnload() {
  155. // 移除动画
  156. this.animationData = {}
  157. },
  158. mounted() {
  159. this.getList()
  160. },
  161. methods: {
  162. getList() {
  163. let _this = this
  164. let data = {
  165. boxId: _this.boxId,
  166. isTry: _this.isTry,
  167. orderId: _this.orderId,
  168. ticketId: _this.ticketId
  169. }
  170. let num = 0
  171. let time = setInterval(() => {
  172. num++
  173. uni.showLoading({
  174. title: '加载中'
  175. });
  176. $http.post('/api/v1/mp/user/ticket/autoCashPrize', data).then(res => {
  177. if (res.code == 0) {
  178. clearInterval(time)
  179. _this.list = res.data.ticketAwardsPrizeList
  180. _this.list.forEach(item => {
  181. item.forEach(ele => {
  182. ele.picUrl = env.filePublic + ele.picUrl.split(',')[
  183. 0] + '?imageView2/2/w/170'
  184. ele.prizeType = JSON.parse(ele.prizeType)
  185. })
  186. })
  187. _this.prizeInfo = {
  188. ...res.data,
  189. picUrl: env.filePublic + res.data.picUrl.split(',')[0] +
  190. '?imageView2/2/w/340',
  191. prizeType: JSON.parse(res.data.prizeType)
  192. }
  193. setTimeout(() => {
  194. uni.hideLoading();
  195. _this.btnShow = true
  196. _this.running()
  197. }, 500)
  198. } else if (res.code == 401) {
  199. uni.hideLoading();
  200. clearInterval(time)
  201. uni.navigateBack({
  202. delta: 2
  203. })
  204. } else if (res.code == 500) {
  205. uni.hideLoading();
  206. clearInterval(time)
  207. uni.navigateBack({
  208. delta: 1
  209. })
  210. }
  211. if (num == 10) {
  212. uni.hideLoading();
  213. clearInterval(time)
  214. }
  215. }).catch(() => {
  216. uni.hideLoading();
  217. clearInterval(time)
  218. uni.navigateBack({
  219. delta: 1
  220. })
  221. })
  222. }, 1000)
  223. },
  224. // 动画开始
  225. running() {
  226. // #ifdef H5
  227. // 获取滚动奖品列表长度
  228. this.data = this.$refs.rolling.$el.clientWidth
  229. // 调用 step() 来表示一组动画完成
  230. this.animation.translateX(-this.data).step({
  231. duration: 8000,
  232. timingFunction: 'linear'
  233. })
  234. // export方法导出动画数据
  235. this.animationData = this.animation.export()
  236. // 倒计时
  237. this.time = setInterval(() => {
  238. // 开奖倒计时、页面显示
  239. this.num--
  240. // 记录动画执行时间,停止动画计算移动距离时使用
  241. this.num2++
  242. if (this.num == 0) {
  243. clearInterval(this.time)
  244. }
  245. }, 1000)
  246. // 不手动停止动画,自动停止
  247. this.stopTime = setTimeout(() => {
  248. this.stop()
  249. }, 8000);
  250. // #endif
  251. // #ifdef MP-ALIPAY
  252. my.createSelectorQuery().select('.rolling-prize-list').boundingClientRect().exec(info => {
  253. this.data = info[0].width
  254. // 调用 step() 来表示一组动画完成
  255. this.animation.translateX(-this.data).step({
  256. duration: 8000,
  257. timingFunction: 'linear'
  258. })
  259. // export方法导出动画数据
  260. this.animationData = this.animation.export()
  261. // 倒计时
  262. this.time = setInterval(() => {
  263. // 开奖倒计时、页面显示
  264. this.num--
  265. // 记录动画执行时间,停止动画计算移动距离时使用
  266. this.num2++
  267. if (this.num == 0) {
  268. clearInterval(this.time)
  269. }
  270. }, 1000)
  271. })
  272. // 不手动停止动画,自动停止
  273. this.stopTime = setTimeout(() => {
  274. this.num = 0
  275. this.stop()
  276. }, 8000);
  277. // #endif
  278. // #ifdef MP-WEIXIN
  279. // 元素详细信息
  280. uni.createSelectorQuery().in(this).select(".rolling-prize-list").boundingClientRect(info => {
  281. this.data = info.width
  282. // 调用 step() 来表示一组动画完成
  283. this.animation.translateX(-this.data).step({
  284. duration: 8000,
  285. timingFunction: 'linear'
  286. })
  287. // export方法导出动画数据
  288. this.animationData = this.animation.export()
  289. // 倒计时
  290. this.time = setInterval(() => {
  291. // 开奖倒计时、页面显示
  292. this.num--
  293. // 记录动画执行时间,停止动画计算移动距离时使用
  294. this.num2++
  295. if (this.num == 0) {
  296. clearInterval(this.time)
  297. }
  298. }, 1000)
  299. }).exec();
  300. // 不手动停止动画,自动停止
  301. this.stopTime = setTimeout(() => {
  302. this.num = 0
  303. this.stop()
  304. }, 8000);
  305. // #endif
  306. },
  307. // 停止动画
  308. stop() {
  309. if (this.btnIng) return
  310. this.btnIng = true
  311. // 获取屏幕距离,用于计算停止动画移动距离计算
  312. // #ifndef MP-ALIPAY
  313. let screenWidth = null
  314. uni.getSystemInfo({
  315. success: function(res) {
  316. screenWidth = res.screenWidth;
  317. }
  318. });
  319. // #endif
  320. /**
  321. * 0秒:下标4
  322. * 1秒:下标6
  323. * 2秒:下标8
  324. * 3秒:下标10
  325. * 4秒:下标12
  326. * 5秒:下标14
  327. * 6秒:下标16
  328. * 7秒:下标2
  329. * 8秒:下标2
  330. * */
  331. clearInterval(this.time)
  332. clearTimeout(this.stopTime)
  333. this.animationData = {}
  334. // #ifdef MP-ALIPAY
  335. this.list[3][1] = JSON.parse(JSON.stringify(this.prizeInfo))
  336. // #endif
  337. // #ifndef MP-ALIPAY
  338. if (this.num2 == 0) {
  339. this.list[3][1] = JSON.parse(JSON.stringify(this.prizeInfo))
  340. } else if (this.num2 == 1) {
  341. this.list[5][1] = JSON.parse(JSON.stringify(this.prizeInfo))
  342. } else if (this.num2 == 2) {
  343. this.list[7][1] = JSON.parse(JSON.stringify(this.prizeInfo))
  344. } else if (this.num2 == 3) {
  345. this.list[9][1] = JSON.parse(JSON.stringify(this.prizeInfo))
  346. } else if (this.num2 == 4) {
  347. this.list[11][1] = JSON.parse(JSON.stringify(this.prizeInfo))
  348. } else if (this.num2 == 5) {
  349. this.list[13][1] = JSON.parse(JSON.stringify(this.prizeInfo))
  350. } else if (this.num2 == 6) {
  351. this.list[15][1] = JSON.parse(JSON.stringify(this.prizeInfo))
  352. } else if (this.num2 == 7) {
  353. this.list[1][1] = JSON.parse(JSON.stringify(this.prizeInfo))
  354. } else if (this.num2 == 8) {
  355. // #ifdef MP-WEIXIN
  356. this.list[1][1] = JSON.parse(JSON.stringify(this.prizeInfo))
  357. // #endif
  358. // #ifdef H5
  359. this.list[3][1] = JSON.parse(JSON.stringify(this.prizeInfo))
  360. // #endif
  361. }
  362. // #endif
  363. // #ifdef H5
  364. /**
  365. * 根据动画时间移动到指定位置
  366. * this.data / 8 :动画平均移动距离
  367. * this.num2 : 动画执行时间
  368. * screenWidth * 3 :移动3个屏幕距离
  369. */
  370. this.animation.translateX(-(this.data / 8 * this.num2 + screenWidth * 3)).step({
  371. duration: 4000,
  372. timingFunction: 'ease'
  373. })
  374. this.animationData = this.animation.export()
  375. setTimeout(() => {
  376. this.rollingShow = false
  377. }, 4500)
  378. setTimeout(() => {
  379. this.circularShow = false
  380. }, 5100)
  381. setTimeout(() => {
  382. this.rotateShow = false
  383. }, 7500)
  384. // #endif
  385. // #ifdef MP-ALIPAY
  386. let _this = this
  387. uni.getSystemInfo({
  388. success: (res) => {
  389. let windowWidth = res.windowWidth;
  390. my.createSelectorQuery().select('.rolling-prize-list').boundingClientRect().exec(
  391. info => {
  392. _this.data = info[0].width //动画移动距离
  393. _this.animation.translateX(-(_this.data + windowWidth * 3)).step({
  394. duration: 4000,
  395. timingFunction: 'ease'
  396. })
  397. _this.animationData = _this.animation.export()
  398. })
  399. setTimeout(() => {
  400. _this.rollingShow = false
  401. }, 4500)
  402. setTimeout(() => {
  403. _this.circularShow = false
  404. }, 5100)
  405. setTimeout(() => {
  406. _this.rotateShow = false
  407. }, 7500)
  408. }
  409. });
  410. // #endif
  411. // #ifdef MP-WEIXIN
  412. uni.createSelectorQuery().in(this).select(".rolling-prize-list").boundingClientRect(info => {
  413. this.data = info.width
  414. this.animation.translateX(-(this.data / 8 * this.num2 + screenWidth * 3)).step({
  415. duration: 4000,
  416. timingFunction: 'ease'
  417. })
  418. this.animationData = this.animation.export()
  419. }).exec();
  420. setTimeout(() => {
  421. this.rollingShow = false
  422. }, 4500)
  423. setTimeout(() => {
  424. this.circularShow = false
  425. }, 5100)
  426. setTimeout(() => {
  427. this.rotateShow = false
  428. }, 7500)
  429. // #endif
  430. },
  431. back() {
  432. uni.navigateBack({
  433. delta: 1
  434. })
  435. },
  436. toPrize(data) {
  437. if (data.value == 'goods') {
  438. uni.redirectTo({
  439. url: '/packagePrize/prize/index'
  440. })
  441. }
  442. if (data.value == 'coupon') {
  443. uni.redirectTo({
  444. url: '/packagePrize/prize/index?coupon=1'
  445. })
  446. }
  447. if (data.value == 'coupon_pkg') {
  448. uni.redirectTo({
  449. url: '/packagePrize/prize/index?coupon=1'
  450. })
  451. }
  452. if (data.value == 'coin') {
  453. uni.switchTab({
  454. url: '/pages/core/index'
  455. })
  456. }
  457. },
  458. },
  459. }
  460. </script>
  461. <style lang="scss" scoped>
  462. .rolling {
  463. width: 100%;
  464. height: calc(100vh - 44px);
  465. background: url(https://mp-public-1310078123.cos.ap-shanghai.myqcloud.com/v2/prize_bkg1.png) center center no-repeat;
  466. background-size: 100vw calc(100vh - 44px);
  467. overflow: hidden;
  468. // 奖品滚动
  469. &-prize {
  470. display: flex;
  471. margin-top: 28vh;
  472. height: 28vh;
  473. background: url(https://mp-public-1310078123.cos.ap-shanghai.myqcloud.com/v2/prize_bkg2.png) center center no-repeat;
  474. background-size: 100vw 28vh;
  475. margin-bottom: 82rpx;
  476. &-list {
  477. display: flex;
  478. margin-top: 76rpx;
  479. height: calc(100% - 76rpx);
  480. &-item {
  481. width: 100vw;
  482. height: 100%;
  483. &__items {
  484. align-items: flex-start;
  485. justify-content: space-evenly;
  486. width: 100vw;
  487. height: 100%;
  488. .content {
  489. flex-direction: column;
  490. width: 30%;
  491. height: 85%;
  492. image {
  493. width: 100%;
  494. height: 60%;
  495. margin-bottom: 16rpx;
  496. }
  497. &-title {
  498. width: 100%;
  499. line-height: 34rpx;
  500. font-size: 26rpx;
  501. text-align: center;
  502. margin-bottom: 20rpx;
  503. }
  504. &-price {
  505. width: 100%;
  506. line-height: 26rpx;
  507. font-size: 26rpx;
  508. text-align: center;
  509. }
  510. }
  511. // .content:nth-child(2) {
  512. // justify-content: flex-start;
  513. // color: #333;
  514. // image {
  515. // width: 100%;
  516. // height: 60%;
  517. // }
  518. // .content-title {
  519. // font-weight: bold;
  520. // }
  521. // .content-price {
  522. // font-weight: bold;
  523. // }
  524. // }
  525. }
  526. }
  527. }
  528. }
  529. // 按钮
  530. &-btn {
  531. height: 160rpx;
  532. margin-bottom: 36rpx;
  533. &-content {
  534. position: relative;
  535. height: 100%;
  536. image {
  537. width: 486rpx;
  538. height: 100%;
  539. }
  540. &-title {
  541. position: absolute;
  542. top: 30rpx;
  543. font-size: 72rpx;
  544. font-family: YouSheBiaoTiHei;
  545. font-weight: 400;
  546. color: #FFFFFF;
  547. line-height: 72rpx;
  548. opacity: 0.99;
  549. }
  550. }
  551. .btn-stop {
  552. animation: scaleBtn 0.2s linear;
  553. }
  554. // 放大缩小动画
  555. @keyframes scaleBtn {
  556. from {
  557. transform: scale(0.9);
  558. }
  559. to {
  560. transform: scale(1);
  561. }
  562. }
  563. }
  564. // 倒计时
  565. &-time {
  566. .num {
  567. font-size: 110rpx;
  568. font-family: YouSheBiaoTiHei;
  569. font-weight: 400;
  570. color: #FFFFFF;
  571. line-height: 110rpx;
  572. }
  573. }
  574. }
  575. // 奖品显示
  576. .prize {
  577. position: relative;
  578. width: 100%;
  579. height: 100vh;
  580. background: url(https://mp-public-1310078123.cos.ap-shanghai.myqcloud.com/v2/hit_bkg.png) center center no-repeat;
  581. background-size: 100vw 100vh;
  582. overflow: hidden;
  583. &-navLeft {
  584. position: absolute;
  585. left: 34rpx;
  586. width: 66rpx;
  587. height: 66rpx;
  588. background-color: rgba(255, 255, 255, .36);
  589. border-radius: 50%;
  590. }
  591. &-title {
  592. padding-top: 15vh;
  593. margin-bottom: 120rpx;
  594. image {
  595. width: 484rpx;
  596. height: 108rpx;
  597. }
  598. }
  599. &-box {
  600. margin-bottom: 34rpx;
  601. &-popup {
  602. position: relative;
  603. flex-direction: column;
  604. width: 75vw;
  605. height: 38vh;
  606. background-color: #FFFFFF;
  607. border-radius: 22rpx;
  608. &__image {
  609. position: relative;
  610. z-index: 10;
  611. width: 65%;
  612. height: 65%;
  613. image {
  614. width: 100%;
  615. height: 100%;
  616. }
  617. }
  618. &__rotate {
  619. position: absolute;
  620. width: 100%;
  621. height: 100%;
  622. z-index: 5;
  623. animation: rotateBg 3s linear;
  624. }
  625. &__circular {
  626. position: absolute;
  627. width: 600rpx;
  628. height: 600rpx;
  629. z-index: 5;
  630. animation: scaleBg 0.7s linear;
  631. }
  632. // 旋转动画
  633. @keyframes rotateBg {
  634. from {
  635. transform: rotate(0);
  636. }
  637. to {
  638. transform: rotate(360deg);
  639. }
  640. }
  641. // 放大动画
  642. @keyframes scaleBg {
  643. from {
  644. transform: scale(0.8);
  645. }
  646. to {
  647. transform: scale(1.8);
  648. }
  649. }
  650. }
  651. }
  652. &-info {
  653. margin-bottom: 40rpx;
  654. &-content {
  655. width: 70vw;
  656. &-price {
  657. text-align: center;
  658. font-size: 40rpx;
  659. line-height: 40rpx;
  660. font-family: PingFang SC;
  661. font-weight: bold;
  662. color: #FFFFFF;
  663. margin-bottom: 20rpx;
  664. text {
  665. font-size: 28rpx;
  666. }
  667. }
  668. &-title {
  669. height: 36rpx;
  670. overflow: hidden;
  671. text-align: center;
  672. font-size: 36rpx;
  673. line-height: 36rpx;
  674. color: #FFFFFF;
  675. margin-bottom: 50rpx;
  676. }
  677. &-titletwo {
  678. height: 36rpx;
  679. text-align: center;
  680. font-size: 36rpx;
  681. line-height: 36rpx;
  682. color: #FFFFFF;
  683. margin-bottom: 50rpx;
  684. white-space: nowrap;
  685. overflow: hidden;
  686. text-overflow: ellipsis;
  687. }
  688. &-btn {
  689. &-content {
  690. position: relative;
  691. width: 70vw;
  692. image {
  693. width: 70vw;
  694. height: 112rpx;
  695. }
  696. &-txt {
  697. position: absolute;
  698. top: 0;
  699. height: 112rpx;
  700. line-height: 112rpx;
  701. font-size: 30rpx;
  702. text-align: center;
  703. color: #FFFFFF;
  704. }
  705. }
  706. }
  707. }
  708. }
  709. &-tip {
  710. .txt {
  711. width: 332rpx;
  712. height: 66rpx;
  713. line-height: 66rpx;
  714. text-align: center;
  715. background: rgba(255, 211, 157, .3);
  716. border-radius: 34rpx;
  717. font-size: 34rpx;
  718. font-weight: 500;
  719. color: #FB930D;
  720. }
  721. }
  722. }
  723. </style>