123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- <template>
- <view class="tm-choujiangGrid">
- <view class="tm-choujiangGrid-bg"
- :style="{
- backgroundImage: `url(${them_data.bg})`
- }"
- >
- <view v-if="listData.length==8" class="tm-choujiangGrid-con">
- <view v-for="(item,index) in 3" :key="index" class="tm-choujiangGrid-grid">
- <block v-if="index==0">
- <view class="tm-choujiangGrid-item">
-
- <view class="tm-choujiangGrid-item-img flex-center">
- <tm-images :width="100" :src="listData[0].img"></tm-images>
- </view>
- <view :class="{on:(aniOff==false&&active==0)||(choujiangJieGuo&&aniOff&&active==0)}" class="tm-choujiangGrid-item-hover"></view>
- </view>
- <view class="tm-choujiangGrid-item">
- <view class="tm-choujiangGrid-item-img flex-center">
- <tm-images :width="100" :src="listData[1].img"></tm-images>
- </view>
- <view :class="{on:(aniOff==false&&active==1)||(choujiangJieGuo&&aniOff&&active==1)}" class="tm-choujiangGrid-item-hover"></view>
- </view>
- <view class="tm-choujiangGrid-item">
- <view class="tm-choujiangGrid-item-img flex-center">
- <tm-images :width="100" :src="listData[2].img"></tm-images>
- </view>
- <view :class="{on:(aniOff==false&&active==2)||(choujiangJieGuo&&aniOff&&active==2)}" class="tm-choujiangGrid-item-hover"></view>
- </view>
- </block>
- <block v-if="index==1">
- <view class="tm-choujiangGrid-item">
- <view class="tm-choujiangGrid-item-img flex-center">
- <tm-images :width="100" :src="listData[7].img"></tm-images>
- </view>
- <view :class="{on:(aniOff==false&&active==7)||(choujiangJieGuo&&aniOff&&active==7)}" class="tm-choujiangGrid-item-hover"></view>
- </view>
- <view @click="clickImgPlay" class="tm-choujiangGrid-item">
- <view class="tm-choujiangGrid-item-img flex-center tm-choujiangGrid-item-point">
- <tm-images :width="140" :src="them_data.point"></tm-images>
- </view>
- <view class="tm-choujiangGrid-item-hover"></view>
- </view>
-
- <view class="tm-choujiangGrid-item">
- <view class="tm-choujiangGrid-item-img flex-center">
- <tm-images :width="100" :src="listData[3].img"></tm-images>
- </view>
- <view :class="{on:(aniOff==false&&active==3)||(choujiangJieGuo&&aniOff&&active==3)}" class="tm-choujiangGrid-item-hover"></view>
- </view>
- </block>
- <block v-if="index==2">
-
- <view class="tm-choujiangGrid-item">
- <view class="tm-choujiangGrid-item-img flex-center">
- <tm-images :width="100" :src="listData[6].img"></tm-images>
- </view>
- <view :class="{on:(aniOff==false&&active==6)||(choujiangJieGuo&&aniOff&&active==6)}" class="tm-choujiangGrid-item-hover"></view>
- </view>
-
- <view class="tm-choujiangGrid-item">
- <view class="tm-choujiangGrid-item-img flex-center">
- <tm-images :width="100" :src="listData[5].img"></tm-images>
- </view>
- <view :class="{on:(aniOff==false&&active==5)||(choujiangJieGuo&&aniOff&&active==5)}" class="tm-choujiangGrid-item-hover"></view>
- </view>
- <view class="tm-choujiangGrid-item">
- <view class="tm-choujiangGrid-item-img flex-center">
- <tm-images :previmage="false" :width="100" :src="listData[4].img"></tm-images>
- </view>
- <view :class="{on:(aniOff==false&&active==4)||(choujiangJieGuo&&aniOff&&active==4)}" class="tm-choujiangGrid-item-hover"></view>
- </view>
- </block>
- </view>
- </view>
- </view>
- </view>
- </template>
- <script>
- /**
- * 转盘抽奖
- * @property {Number} theme-index = [] 默认0,主题索引,我已内置两套皮肤。
- * @property {Array} theme-list = [] 默认[已内置两套],主题列表数据,已有两套。
- * @property {Boolean} disabled = [] 默认 false,是否禁用
- * @property {Number} duration = [] 默认 3000,动画时长
- * @property {Boolean} disabledCenter = [] 默认 false,是否禁用点中间图片开始。
- * @property {Number} turns = [] 默认 2,转的圈数
- * @property {Number} specify = [] 默认 null,为整数时,即可指定奖品,始终中奖保持在这个位置。
- * @property {Array} list = [] 默认 [测试的数据],奖品数据。
- * @property {Function} start 游戏开始时触发。
- * @property {Function} end 游戏结束触发,并返回奖品数据。
- * @example <tm-choujiangGame ></tm-choujiangGame>
- */
- import tmImages from "@/tm-vuetify/components/tm-images/tm-images.vue"
- export default {
- components:{tmImages},
- name: 'tm-choujiangGrid',
- props: {
- themeIndex: {
- type: Number,
- default: 0
- },
- themeList: {
- type: Array,
- default: () => {
- return [
- {
- bg: 'https://jx2d.cn/yuwuimages/choujiangGrid_1.png?k=9',
- point: 'https://jx2d.cn/yuwuimages/choujiangGrid_1_0.png'
- },
- {
- bg: 'https://jx2d.cn/yuwuimages/choujiangGrid_2.png?k=9',
- point: 'https://jx2d.cn/yuwuimages/choujiangGrid_2_0.png'
- }
- ];
- }
- },
- disabled: {
- type: Boolean,
- default: false
- },
- //是否禁用点中间图片开始。
- disabledCenter:{
- type: Boolean,
- default: false
- },
- // 动画时长
- duration: {
- type: Number,
- default: 100
- },
- list: {
- type: Array,
- default: () => {
- return [
- { name: '1', gailv: 30, id: 1, img: 'https://jx2d.cn/yuwuimages/choujiangGrid_1_1.png' },
- { name: '2', gailv: 10, id: 2, img: 'https://jx2d.cn/yuwuimages/choujiangGrid_1_2.png' },
- { name: '3', gailv: 10, id: 3, img: 'https://jx2d.cn/yuwuimages/choujiangGrid_1_1.png' },
- { name: '4', gailv: 10, id: 4, img: 'https://jx2d.cn/yuwuimages/choujiangGrid_1_2.png' },
- { name: '5', gailv: 10, id: 5, img: 'https://jx2d.cn/yuwuimages/choujiangGrid_1_2.png' },
- { name: '6', gailv: 10, id: 7, img: 'https://jx2d.cn/yuwuimages/choujiangGrid_1_1.png' },
- { name: '7', gailv: 10, id: 8, img: 'https://jx2d.cn/yuwuimages/choujiangGrid_1_1.png' },
- { name: '8', gailv: 10, id: 9, img: 'https://jx2d.cn/yuwuimages/choujiangGrid_1_2.png' }
- ];
- }
- },
- // 转的圈数。
- turns:{
- type:Number,
- default:2
- },
- //指定中奖的奖品数组索引,从0开始
- specify:{
- type:Number,
- default:null
- }
- },
- data() {
- return {
-
- aniOff: true,
- active:0,
- choujiangJieGuo:null,
- listData: [],
- timeid:8564
-
- };
- },
- mounted() {
- this.listData = this.list;
- },
- destroyed() {
- clearTimeout(this.timeid)
- },
- computed: {
- them_index: function() {
- return this.themeIndex;
- },
- them_data: function() {
- return this.themeList[this.them_index];
- }
- },
- methods: {
- clickImgPlay(){
- if (this.disabledCenter) return;
- this.play();
- },
- chuliganlv() {
- var ml = new this.$tm.choujiang(this.listData);
- let zhongle = [];
- let xh = ml.getResult();
- let index = 0
- for(let j=0;j<this.listData.length;j++){
- if(this.listData[j].id === xh.id){
- index = j;
-
- break;
- }
- }
- let cisu = (this.listData.length-1)*this.turns+this.turns*2 + (this.specify!==null?this.specify:index);
- zhongle = {
- index:index,
- data:xh,
- playNum:cisu
- }
- return zhongle;
- },
- play() {
- let t = this;
- if (this.disabled) return;
- if (!this.aniOff) {
- console.warn('未结束动画,不能连续点击.');
- return;
- }
- // 开始动画.
- this.$emit('start');
- this.choujiangJieGuo = null;
- let zhongjiang = this.chuliganlv();
- this.$nextTick(function() {
- this.aniOff = false;
- let duration = this.duration;
- let playcCisu = 0; //总次数的序列。
- // 循环的内部索引.
- let nbIndex = 0;
- function aniOpen(){
- if(nbIndex>t.listData.length-1){
- nbIndex = 0;
- t.active = nbIndex;
- }else{
- t.active = nbIndex;
- nbIndex += 1;
- }
- clearTimeout(t.timeid);
- t.timeid = setTimeout(function() {
- playcCisu +=1;
- if(playcCisu > zhongjiang.playNum){
- t.$emit('end',{index:zhongjiang.index,data:zhongjiang.data})
- t.choujiangJieGuo = zhongjiang;
- t.aniOff = true;
- }else{
- aniOpen();
- }
- }, duration);
- }
- aniOpen();
- });
- },
- }
- };
- </script>
- <style lang="less" scoped>
- .tm-choujiangGrid {
- overflow: hidden;
- .tm-choujiangGrid-bg{
- width:600upx;
- height: 600upx;
- position: relative;
- margin: auto;
- background-repeat: no-repeat;
- background-size: cover;
- .tm-choujiangGrid-con{
- position: absolute;
-
- width: 450upx;
- height: 450upx;
- top: 75upx;
- left: 75upx;
- .tm-choujiangGrid-grid{
- display: flex;
- justify-content: space-between;
- .tm-choujiangGrid-item{
- width: 137upx;
- height: 130upx;
- border-radius: 20upx;
- overflow: hidden;
- margin-left: 10upx;
- position: relative;
- margin-bottom: 28upx;
- .tm-choujiangGrid-item-img{
- width: 100%;
- height: 100%;
- color: black;
- &.tm-choujiangGrid-item-point{
- animation: scalanit 1s linear infinite;
- }
- }
- .tm-choujiangGrid-item-hover{
- width: 100%;
- height: 100%;
- position: absolute;
- top: 0;
- left: 0;
- background-color: #ffaa17;
- opacity: 0;
- &.on{
- opacity: 0.6;
- }
- }
- }
- }
- }
- }
- }
- @keyframes scalanit {
- 0%{
- transform: scale(0.9);
- }
- 50%{
- transform: scale(1.1);
- }
- 100%{
- transform: scale(0.9);
- }
- }
- </style>
|