vue数字翻盘,翻转效果

数字翻转的效果

实现数字翻转的效果上面为出来的样子

下面为代码,使用的时候直接引入,还有就是把图片的路径自己换成自己或者先用颜色替代,传入num和numlength即可

<template>
  <div v-for="(item, index) in processedNums" :key="index" class="filp_box">
    <div
      class="card-container"
      :class="{ entry: flipState[index] }"
      v-if="item == '.'"
    >
      <!-- <div class="line"></div> -->
      <div class="card1 card-item">.</div>
      <div class="card2 card-item">.</div>
      <div class="card3 card-item">.</div>
      <div class="card4 card-item">.</div>
    </div>
    <div class="card-container" :class="{ entry: flipState[index] }" v-else>
      <!-- <div class="line"></div> -->
      <div class="card1 card-item">{{ item }}</div>
      <div class="card2 card-item">{{ item }}</div>
      <div class="card3 card-item">{{ item }}</div>
      <div class="card4 card-item">{{ item }}</div>
    </div>
  </div>
</template>

<script>
export default {
  props: {
    nums: {
      validator: function(value) {
      // 判断值是否为数字或者可以转换为数字的字符串
      return !isNaN(value) || typeof value === 'string';
      },
      required: true,
      default: () => 0,
    },
    numlength: {
      type: Number,
      default: 7,
    },
  },
  watch: {
    nums(newVal, oldVal) {
      // 重置所有翻转状态
      this.flipState = this.processedNums.map(() => false);
      let newnum = this.processedNumsWatch(newVal);
      let oldnum = this.processedNumsWatch(oldVal);
      // 使用$nextTick确保DOM已更新后再触发动画
      this.cleanTimer= setTimeout(() => {
        newnum.forEach((item, index) => {
          if (item != oldnum[index]) {
            this.flipState[index] = true;
          }
        });
      }, 50);
    },
    numlength(newVal, oldVal) {
      // 重置所有翻转状态
      this.flipState = this.processedNums.map(() => false);
    },
  },
  data() {
    return {
      flipState: [], // 用于记录每个数字容器的翻转状态
      cleanTimer: null,
    };
  },
  computed: {
    // 计算属性来处理nums,这里简单地假设处理逻辑是添加一个id字段
    processedNums() {
      let string = this.nums.toString();
      // 字符串转数组
      let array = Array.from(string);
      //   数组补0
      let valueArr = this.padArray(array, this.numlength);
      return valueArr;
    },
  },
  methods: {
    // 补0
    padArray(arr, max) {
      while (arr.length < max) {
        arr.unshift("0");
      }
      return arr;
    },
    processedNumsWatch(val) {
      let string = val.toString();
      // 字符串转数组
      let array = Array.from(string);
      //   数组补0
      let valueArr = this.padArray(array, this.numlength);
      return valueArr;
    },
  },
  beforeDestroy() {
    clearTimeout(this.cleanTimer);
  },
};
</script>
<style scoped>
.filp_box {
  display: inline-block;
  margin: 0 1px;
}
.card-container {
  width: 27px;
  height: 40px;
  /* backg
  round: #000000; */
  position: relative;
}
.line {
  position: absolute;
  z-index: 100;
  width: 100%;
  background-color: #fff;
  height: 3px;
  top: 49%;
}
.card-item {
  position: absolute;
  width: 100%;
  height: 50%;
  overflow: hidden;
}

.card1 {
  font-size: 36px;
  font-family: "myFontNum";
  font-weight: bold;
  line-height: 40px;
  text-align: center;
  color: #fff;
  background: url("./TTTT5.png") no-repeat center;
}

.card2 {
  font-size: 36px;
  font-family: "myFontNum";
  font-weight: bold;
  line-height: 0px;
  color: #fff;
  text-align: center;
  top: 50%;
  background: url("./BBBBBFD.png") no-repeat center;
  transform-origin: center top;
  backface-visibility: hidden;
  transform: rotateX(180deg);
  z-index: 2;
}

.card3 {
  font-size: 36px;
  font-family: "myFontNum";
  font-weight: bold;
  color: #fff;
  line-height: 40px;
  text-align: center;
  background: url("./TTTT5.png") no-repeat center;
  transform-origin: center bottom;
  backface-visibility: hidden;
  z-index: 2;
}

.card4 {
  font-size: 36px;
  font-family: "myFontNum";
  font-weight: bold;
  color: #fff;
  top: 50%;
  line-height: 0px;
  text-align: center;
  /* overflow: hidden; */
  background: url("./BBBBBFD.png") no-repeat center;
}

.card-container.entry .card2 {
  transition: 0.5s;
  transform: rotateX(0deg);
}

.card-container.entry .card3 {
  transition: 0.5s;
  transform: rotateX(-180deg);
}
</style>

使用示例

 <FlipCard :nums="propsnum" :numlength="7" />

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现图片翻转效果可以使用Vue的动画特性和CSS3的3D变换效果。下面是一个简单的例子,你可以根据自己的需求进行修改和扩展。 首先,我们需要在Vue组件中定义两个状态:正面和反面,并且使用`v-bind:class`来动态绑定组件的类名。然后,我们可以使用Vue的`transition`组件来定义动画的效果,如下所示: ```html <template> <div class="flip-container" @click="isFlipped = !isFlipped"> <div class="flipper" :class="{ flipped: isFlipped }"> <div class="front"> <img src="image.jpg"> </div> <div class="back"> <img src="image-flipped.jpg"> </div> </div> </div> </template> <script> export default { data() { return { isFlipped: false } } } </script> <style> .flip-container { perspective: 1000px; } .flipper { transition: 0.6s; transform-style: preserve-3d; position: relative; } .front, .back { backface-visibility: hidden; position: absolute; top: 0; left: 0; } .back { transform: rotateY(180deg); } .flipped { transform: rotateY(180deg); } </style> ``` 在上面的代码中,我们使用了CSS3的`perspective`属性来指定3D场景的观察距离,使得图片看起来更加逼真。然后,我们定义了两个状态:正面和反面,并且使用`v-bind:class`来动态绑定组件的类名。最后,我们使用了`transition`组件来定义动画的效果,并且使用`transform`属性来实现3D翻转效果。 你可以根据自己的需求修改和扩展上面的代码,来实现更加复杂的图片翻转效果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值