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基于Echarts的拖拽数据可视化功能实现
Dec 04 Vue.js
Vue $attrs &amp; inheritAttr实现button禁用效果案例
Dec 07 Vue.js
vue添加自定义右键菜单的完整实例
Dec 08 Vue.js
详解template标签用法(含vue中的用法总结)
Jan 12 Vue.js
详解实现vue的数据响应式原理
Jan 20 Vue.js
vue3 watch和watchEffect的使用以及有哪些区别
Jan 26 Vue.js
如何在vue中使用video.js播放m3u8格式的视频
Feb 01 Vue.js
vue中三级导航的菜单权限控制
Mar 31 Vue.js
关于Vue Router的10条高级技巧总结
May 06 Vue.js
解读Vue组件注册方式
May 15 Vue.js
Vue全局事件总线你了解吗
Feb 24 Vue.js
Vue如何清空对象
Mar 03 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
IP攻击升级,程序改进以对付新的攻击
2010/11/23 PHP
ThinkPHP3.1新特性之查询条件预处理简介
2014/06/19 PHP
新浪SAE搭建PHP项目教程
2015/01/28 PHP
微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法
2016/01/12 PHP
Thinkphp3.2实用篇之计算型验证码示例
2017/02/09 PHP
PHP各种常见经典算法总结【排序、查找、翻转等】
2019/08/05 PHP
javascript动画效果类封装代码
2007/08/28 Javascript
基于jquery插件制作左右按钮与标题文字图片切换效果
2013/11/07 Javascript
jquery自定义滚动条插件示例分享
2014/02/21 Javascript
javascript使用prototype完成单继承
2014/12/24 Javascript
jQuery老黄历完整实现方法
2015/01/16 Javascript
javascript数组排序汇总
2015/07/07 Javascript
跟我学习javascript的作用域与作用域链
2015/11/19 Javascript
AngularJS指令与控制器之间的交互功能示例
2016/12/14 Javascript
JavaScript 限制文本框不可输入英文单双引号的方法
2016/12/20 Javascript
前端面试知识点锦集(JavaScript篇)
2016/12/28 Javascript
BootStrap学习笔记之nav导航栏和面包屑导航
2017/01/03 Javascript
vue和react等项目中更简单的实现展开收起更多等效果示例
2018/02/22 Javascript
一次让你了解全部JavaScript的作用域
2019/06/24 Javascript
Vue中的transition封装组件的实现方法
2019/08/13 Javascript
Python 私有函数的实例详解
2017/09/11 Python
python/sympy求解矩阵方程的方法
2018/11/08 Python
pytorch如何冻结某层参数的实现
2020/01/10 Python
Selenium向iframe富文本框输入内容过程图解
2020/04/10 Python
Python unittest单元测试框架实现参数化
2020/04/29 Python
python 数据类型强制转换的总结
2021/01/25 Python
解决HTML5中的audio在手机端和微信端的不能自动播放问题
2019/11/04 HTML / CSS
旧时光糖果:Old Time Candy
2018/02/05 全球购物
e路東瀛(JAPANiCAN)香港:日本旅游、日本酒店和温泉旅馆预订
2018/11/21 全球购物
英国排名第一的停车场运营商:NCP
2019/08/26 全球购物
迎新晚会邀请函
2014/02/01 职场文书
仓库管理员岗位职责
2014/03/19 职场文书
2014党员学习习主席讲话思想汇报
2014/09/15 职场文书
九寨沟导游词
2015/02/02 职场文书
社区公民道德宣传日活动总结
2015/03/23 职场文书
如何搭建 MySQL 高可用高性能集群
2021/06/21 MySQL