vue实现翻牌动画

本文实例为大家分享了vue实现翻牌动画的具体代码,供大家参考,具体内容如下

应用场景

常用于大屏订单数量展示

原理

  • 利用css writing-mode: vertical-rl 使数字垂直排列
  • 利用css transform 使数字滚动

实现思路

  • 根据css先让数字垂直排列,总共设置8列
  • 根据组件传递的数值,如果不满8位,递归补零
  • 补零之后,循环根据 translate(-50%, -${numberArr[index] * 10}%,查看动画
<template>
    <div class="chartNum">
        <div class="box-item">
            <li
                :class="{'number-item':!isNaN(item),'mark-item':!isNaN(item)}"
                v-for="(item,index) in orderNum"
                :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 {
        name: "hChartNum",
        props:{
          num:{
              type:Number,
              default:1123
          }
        },
        data() {
            return {
                orderNum: ['0', '0', '0', '0', '0', '0', '0', '0'], // 默认订单总数
            }
        },
        mounted(){
            setTimeout(() => {
                this.toOrderNum(this.num) // 这里输入数字即可调用
            }, 500);
        },
        methods:{
            // 设置文字滚动
            setNumberTransform(){
                const numberItems = this.$refs.numberItem // 拿到数字的ref,计算元素数量
                const numberArr = this.orderNum.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}%)`
                }
            },

            // 处理订单数字
            toOrderNum(num){
                num = num.toString();
                if(num.length < 8){
                    num = '0' + num; // 未满8位,补零
                    this.toOrderNum(num); // 递归添加"0"补位
                }
                else if(num.length == 8){
                    this.orderNum = num.split('')
                }
                else{
                    // 数据量超过8位
                    this.$message.error('数据量过大');
                }
                this.setNumberTransform();
            }
        }
    }
</script>

<style scoped lang="less">
    .box-item{
        position: relative;
        height: 100px;
        font-size: 54px;
        line-height: 41px;
        text-align: center;
        list-style: none;
        color: #2D7CFF;
        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;
    }

    /*默认逗号设置*/
    .number-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: url(./img/bg.jpg) no-repeat center center;
        background-size: 100% 100%;
        list-style: none;
        margin-right: 5px;
        border-radius:4px;
        border:1px solid rgba(221,221,221,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;
            }
        }
    }
    .number-item:last-child {
        margin-right: 0;
    }
</style>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • vue实现数字动态翻牌器

    数字动态翻牌器 最近项目里使用到了数字翻牌器,于是自己写了一个,动态的翻牌器 第一步创建一个组件页面,NumberCount.vue 思路:大概就是显示几位数,然后从0开始滚动到当前的数值的位置,在每一个位置都有0-9的数,然后就是往上滚动当前数值的次数到当前的数,话不多说上代码 <template>   <div class="chartNum">     <div class="box-item">       <li

  • vue版数字翻牌器的封装

    本文实例为大家分享了vue版数字翻牌器的封装代码,供大家参考,具体内容如下 封装vue版数字翻牌器 <template>      <div class="number">          <ul id="dataNums">              <li v-for="(item,index) in list" :key="index">                 

  • vue3.0翻牌数字组件使用方法详解

    本文实例为大家分享了vue3.0翻牌数字组件使用的具体代码,供大家参考,具体内容如下 代码 <template>   <div class="number-count-wrap" :class="numberSize">     <!-- 标题 start -->     <div class="number-title" :style="{'text-align': titleAlign}&q

  • vue实现数字动态翻牌的效果(开箱即用)

    实现效果图 原理 将1~9的数字竖直排版,通过translate移动位置显示不同数字,使用transition控制transform属性有动画效果 技术点 css 属性 writing-mode: vertical-lr,使数字竖直排版 移动  transform: translate(-50%, -40%); y值控制移动至哪个数字 transition  控制transform属性有动画效果 实现代码(注释比较详细,不再赘述) <!-- * @Author: mat * @Date: 201

  • vue实现翻牌动画

    本文实例为大家分享了vue实现翻牌动画的具体代码,供大家参考,具体内容如下 应用场景 常用于大屏订单数量展示 原理 利用css writing-mode: vertical-rl 使数字垂直排列 利用css transform 使数字滚动 实现思路 根据css先让数字垂直排列,总共设置8列 根据组件传递的数值,如果不满8位,递归补零 补零之后,循环根据 translate(-50%, -${numberArr[index] * 10}%,查看动画 <template>     <div

  • Vue 过渡(动画)transition组件案例详解

    Vue过度(动画),本质走的是CSS3:transtion,animation. 控制器div显示/隐藏,代码如下: <div id="box"> <input type="button" value="按钮" @click="toggle"> <div id="div1" v-show="isShow"></div> </div&g

  • 简单谈谈vue的过渡动画(推荐)

    在vue中,实现过渡动画一般是下面这样: <transition name="fade"> <div></div> </transition> 用一个transition对元素或者组件进行封装. 在过渡的时候,会有 4 个(CSS)类名在 enter/leave 的过渡中切换. 1.v-enter: 定义进入过渡的开始状态.在元素被插入时生效,在下一个帧移除. 2.v-enter-active: 定义进入过渡的结束状态.在元素被插入时生效

  • Vue 进入/离开动画效果

    1.示例代码 (注:写到vue单文件中了) <template> <div> <button v-on:click="show = !show"> Toggle </button> <transition name="fade"> <p v-if="show">hello</p> </transition> </div> </temp

  • 解决vue的过渡动画无法正常实现问题

    前记:最近在写vue的一个项目要实现过渡的效果,虽然vue动画不是强项,库也多,但是基本的坑还是得踩扎实; 建议:先学习vue官方文档的进入/离开 & 列表过渡章节,那么我们来看bug; 首先上出现问题的代码 <!DOCTYPE html> <html> <head> <title></title> <style type="text/css"> .haha-leave-active { transitio

  • Vue中CSS动画原理的实现

    下面这段代码,是点击按钮实现hello world显示与隐藏 <div id="root"> <div v-if="show">hello world</div> <button @click="handleClick">按钮</button> </div> let vm = new Vue({ el: '#root', data: { show:true }, method

  • vue学习笔记之Vue中css动画原理简单示例

    本文实例讲述了Vue中css动画原理.分享给大家供大家参考,具体如下: 当transition包裹了一个元素之后,vue会自动分析元素的css样式,构建动画流程. so,我们需要定义style. vue中的css动画,其实就是某一个时间点,给元素再增加了一个css样式体现的. v-if.v-show.动态组件 都可以实现过渡效果. 如果没有给transition定义name,vue中默认是.v-enter..v-leave-to. <!DOCTYPE html> <html lang=&

  • vue实现旋转木马动画

    本文实例为大家分享了vue实现旋转木马动画的具体代码,供大家参考,具体内容如下 图片数量可为任意值都能正常处理 [1-无限个]: <!DOCTYPE html> <html> <head> <title></title> <meta charset="UTF-8"> <meta http-equiv="Access-Control-Allow-Origin" content="*

  • 微信小程序实现九宫格翻牌动画

    本文实例为大家分享了微信小程序实现九宫格翻牌的具体代码,供大家参考,具体内容如下 9宫格翻牌需求: 1.进来时平铺9个格子显示 2.点击开始抽奖时洗牌动作 3.洗完牌后呈现9个都是未翻牌的状态 4.点击任意一个牌子,有翻转的动作 5.翻转结束后出现中奖的弹窗 555,当时真的一点一点调动画 敲黑板~ wxml: <view class="main_border"> <view class="inside_border viewport-flip"&

  • vue或css动画实现列表向上无缝滚动

    本文实例为大家分享了vue或css动画实现列表向上无缝滚动的具体代码,供大家参考,具体内容如下 方法一:vue的实现方法 <div id="publishMain" class="b_list">  <div id="publishMain1">    <div class="b_item" v-for="(ac,acindex) in activityList" :key=&

随机推荐