vue实现卡牌数字动态翻牌效果

vue实现卡牌数字动态翻牌效果

1. 实现效果

在大屏项目中,我们尝尝会遇到卡牌式数字显示且能动态翻牌的效果,效果图如下:

在这里插入图片描述

2. 实现代码

<template>
	<div class="days-box">
		<div class="operating-title">安全运行天数</div>
		<div class="box-item">
		  <li
		    :class="{
		      'number-item': !isNaN(item),
		      'mark-item': isNaN(item),
		    }"
		    v-for="(item, index) in runningDays"
		    :key="index"
		  >
		    <span v-if="!isNaN(item)">
		      <i ref="numberItem">0123456789</i>
		    </span>
		    <span class="comma" v-else>{{ item }}</span>
		  </li>
		</div>
	</div>
</template>
<script>
	export default {
		data() {
		   return {
		      runningDays: ['0', '0', '0', '0', '0', '0', '0', '0'], 
		   }
  		},
  		mounted () {
		    // 获取当前日期
		    var today = new Date()
		    // 设置起始日期
		    var startDate = new Date("2023-04-24")
		    // 计算天数差
		    var timeDiff = Math.abs(today.getTime() - startDate.getTime())
		    var diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24))
		    this.$nextTick(() => {
		      this.toRunningNum(diffDays) // 这里输入数字即可调用
		      this.setNumberTransform()
		    })
	    },
	    methods: {
			// 设置文字滚动
		    setNumberTransform () {
		      const numberItems = this.$refs.numberItem // 拿到数字的ref,计算元素数量
		      const numberArr = this.runningDays.filter(item => !isNaN(item))
		      // 结合CSS 对数字字符进行滚动,显示订单数量
		      for (let index = 0; index < numberItems.length; index++) {
		        const elem = numberItems[index]
		        elem.style.transform = `translate(-50%, -${numberArr[index] * 10}%)`
		      }
		    },
		    // 处理数字
		    toRunningNum (num) {
		      num = num.toString()
		      this.runningDays= num.split('') // 将其便变成数据,渲染至滚动数组
		    },
		}
	}
</script>
<style lang="scss" scoped>
/*滚动数字设置*/
.operating-title {
  color: #b5c5d4;
  font-size: 16px;
  margin-bottom: 10px;
}
.box-item {
  position: relative;
  height: 80px;
  font-size: 54px;
  line-height: 41px;
  text-align: center;
  list-style: none;
  // color: #2d7cff;
  color: #fff;
  writing-mode: vertical-lr;
  text-orientation: upright;
  /*文字禁止编辑*/
  -moz-user-select: none; /*火狐*/
  -webkit-user-select: none; /*webkit浏览器*/
  -ms-user-select: none; /*IE10*/
  -khtml-user-select: none; /*早期浏览器*/
  user-select: none;
  /* overflow: hidden; */
}

/* 默认逗号设置 */
.mark-item {
  width: 10px;
  height: 100px;
  margin-right: 5px;
  line-height: 10px;
  font-size: 48px;
  position: relative;
  & > span {
    position: absolute;
    width: 100%;
    bottom: 0;
    writing-mode: vertical-rl;
    text-orientation: upright;
  }
}

/*滚动数字设置*/
.number-item {
  width: 41px;
  height: 75px;
  background: #ccc;
  list-style: none;
  margin-right: 5px;
  background: rgb(7, 50, 207);
  border-radius: 4px;
  border: 1px solid rgba(7, 50, 207, 1);
  & > span {
    position: relative;
    display: inline-block;
    margin-right: 10px;
    width: 100%;
    height: 100%;
    writing-mode: vertical-rl;
    text-orientation: upright;
    overflow: hidden;
    & > i {
      font-style: normal;
      position: absolute;
      top: 11px;
      left: 50%;
      transform: translate(-50%, 0);
      transition: transform 1s ease-in-out;
      letter-spacing: 10px;
    }
  }
}
</style>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
实现效果可以使用CSS3的transform属性和transition属性来实现。下面是一个简单的Vue组件示例,实现效果: ```vue <template> <div class="flip-card" :class="{ flipped: flipped }" @click="flipCard"> <div class="flip-card-inner"> <div class="flip-card-front"> <slot name="front"></slot> </div> <div class="flip-card-back"> <slot name="back"></slot> </div> </div> </div> </template> <script> export default { data() { return { flipped: false, }; }, methods: { flipCard() { this.flipped = !this.flipped; }, }, }; </script> <style> .flip-card { position: relative; width: 200px; height: 200px; transition: transform 0.5s; transform-style: preserve-3d; } .flip-card.flipped { transform: rotateY(180deg); } .flip-card-inner { position: absolute; width: 100%; height: 100%; text-align: center; transition: transform 0.5s; transform-style: preserve-3d; } .flip-card-front, .flip-card-back { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; } .flip-card-back { transform: rotateY(180deg); } </style> ``` 在这个组件中,使用了一个div元素作为的容器,内部包含两个div元素作为正反面。使用了一个flipped属性来控制的状态,点击容器时会切换状态。CSS样式中,使用了transform属性来实现3D旋转,transition属性来控制过渡效果。在正反面div元素中,使用了backface-visibility属性来控制背面的可见性。 在需要使用效果的地方,可以像下面这样使用组件: ```vue <flip-card> <template v-slot:front> <div>正面内容</div> </template> <template v-slot:back> <div>反面内容</div> </template> </flip-card> ``` 其中,使用了Vue的插槽功能来传递正反面内容。在组件中,使用了slot元素来定义插槽,并且使用了v-slot指令来指定插槽的名称。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端~初学者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值