vue特效之翻牌动画


Posted in Vue.js onApril 20, 2022

本文实例为大家分享了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>

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

Vue.js 相关文章推荐
vue表单验证之禁止input输入框输入空格
Dec 03 Vue.js
Vue 组件注册全解析
Dec 17 Vue.js
如何在VUE中使用vue-awesome-swiper
Jan 04 Vue.js
jenkins自动构建发布vue项目的方法步骤
Jan 04 Vue.js
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
Jan 22 Vue.js
vue backtop组件的实现完整代码
Apr 07 Vue.js
Vue + iView实现Excel上传功能的完整代码
Jun 22 Vue.js
浅谈Vue的computed计算属性
Mar 21 Vue.js
vue使用refs获取嵌套组件中的值过程
Mar 31 Vue.js
Vue+Flask实现图片传输功能
Apr 01 Vue.js
Vue组件化(ref,props, mixin,.插件)详解
May 15 Vue.js
vue递归实现树形组件
Jul 15 Vue.js
解决vue中provide inject的响应式监听
Apr 19 #Vue.js
vue3种table表格选项个数的控制方法
Apr 14 #Vue.js
vue项目配置sass及引入外部scss文件
Apr 14 #Vue.js
解决vue-router的beforeRouteUpdate不能触发
Apr 14 #Vue.js
vue3语法糖内的defineProps及defineEmits
Apr 14 #Vue.js
vue使用localStorage持久性存储实现评论列表
Apr 14 #Vue.js
vue项目proxyTable配置和部署服务器
Apr 14 #Vue.js
You might like
php中的实现trim函数代码
2007/03/19 PHP
常见php数据文件缓存类汇总
2014/12/05 PHP
Javascript 中介者模式实例
2009/12/16 Javascript
javascript淡入淡出效果的实现思路
2012/03/31 Javascript
ExtJs设置GridPanel表格文本垂直居中示例
2013/07/15 Javascript
jQuery图片轮播的具体实现
2013/09/11 Javascript
JSON传递bool类型数据的处理方式介绍
2013/09/18 Javascript
jquery数据验证插件(自制,简单,练手)实例代码
2013/10/24 Javascript
js获得参数的getParameter使用示例
2014/02/26 Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
2014/04/23 Javascript
如何用javascript计算文本框还能输入多少个字符
2015/07/29 Javascript
AngularJS基础 ng-srcset 指令简单示例
2016/08/03 Javascript
详解js实现线段交点的三种算法
2016/08/09 Javascript
nodejs微信公众号支付开发
2016/09/19 NodeJs
Javascript使用SWFUpload进行多文件上传
2016/11/16 Javascript
浅谈javascript中的事件冒泡和事件捕获
2016/12/28 Javascript
jquery实现自适应banner焦点图
2017/02/16 Javascript
基于zepto.js实现手机相册功能
2017/07/11 Javascript
select获取下拉框的值 下拉框默认选中方法
2018/02/28 Javascript
如何使用puppet替换文件中的string
2018/12/06 Javascript
面试题:react和vue的区别分析
2019/04/08 Javascript
React组件设计模式之组合组件应用实例分析
2020/04/29 Javascript
[53:38]OG vs LGD 2018国际邀请赛淘汰赛BO3 第三场 8.26
2018/08/30 DOTA
机器学习python实战之手写数字识别
2017/11/01 Python
Python中数组,列表:冒号的灵活用法介绍(np数组,列表倒序)
2018/04/18 Python
用python3读取python2的pickle数据方式
2019/12/25 Python
python3.7添加dlib模块的方法
2020/07/01 Python
python 多线程死锁问题的解决方案
2020/08/25 Python
英国皇室御用百货:福南梅森(Fortnum & Mason)
2017/12/03 全球购物
以实惠的价格提供高品质的时尚:Newchic
2018/01/18 全球购物
综合办公室个人的自我评价
2013/12/22 职场文书
电子商务专业学生职业生涯规划
2014/03/07 职场文书
2014年党员公开承诺践诺书
2014/03/25 职场文书
八年级上册语文教学计划
2015/01/22 职场文书
canvas 中如何实现物体的框选
2022/08/05 Javascript
解决ubuntu安装软件时,status-code=409报错的问题
2022/12/24 Servers