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-drawer-layout实现手势滑出菜单栏
Nov 19 Vue.js
基于vue与element实现创建试卷相关功能(实例代码)
Dec 07 Vue.js
基于vuex实现购物车功能
Jan 10 Vue.js
Vue中的nextTick作用和几个简单的使用场景
Jan 25 Vue.js
vue.js实现点击图标放大离开时缩小的代码
Jan 27 Vue.js
vue实现简单数据双向绑定
Apr 28 Vue.js
vue 实现上传组件
May 31 Vue.js
详解Vue router路由
Nov 20 Vue.js
Vue elementUI表单嵌套表格并对每行进行校验详解
Feb 18 Vue.js
vue-cil之axios的二次封装与proxy反向代理使用说明
Apr 07 Vue.js
vue项目配置sass及引入外部scss文件
Apr 14 Vue.js
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
Apr 30 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
上传文件先创建目录 再上传到目录里面去
2010/12/29 PHP
php中全局变量global的使用演示代码
2011/05/18 PHP
thinkphp普通查询与表达式查询实例分析
2014/11/24 PHP
php实现图片按比例截取的方法
2017/02/06 PHP
PHP+jQuery实现双击修改table表格功能示例
2019/02/21 PHP
ZeroClipboard插件实现多浏览器复制功能(支持firefox、chrome、ie6)
2014/08/30 Javascript
javascript 动态创建表格的2种方法总结
2015/03/04 Javascript
javascript实现支持移动设备画廊
2015/08/24 Javascript
实例讲解jquery与json的结合
2016/01/07 Javascript
JavaScript和jQuery获取input框的绝对位置实现方法
2016/10/13 Javascript
vue init失败简单解决方法(终极版)
2017/12/22 Javascript
vue 实现的树形菜的实例代码
2018/03/19 Javascript
Vue 页面跳转不用router-link的实现代码
2018/04/12 Javascript
Vue开发之封装分页组件与使用示例
2019/04/25 Javascript
jQuery使用jsonp实现百度搜索的示例代码
2020/07/08 jQuery
antd design table更改某行数据的样式操作
2020/10/31 Javascript
Nest.js 授权验证的方法示例
2021/02/22 Javascript
[05:04]完美世界携手游戏风云打造 卡尔工作室地图界面篇
2013/04/23 DOTA
python通过装饰器检查函数参数数据类型的方法
2015/03/13 Python
Python3.6笔记之将程序运行结果输出到文件的方法
2018/04/22 Python
完美解决python中ndarray 默认用科学计数法显示的问题
2018/07/14 Python
python GUI库图形界面开发之PyQt5滚动条控件QScrollBar详细使用方法与实例
2020/03/06 Python
BeautifulSoup中find和find_all的使用详解
2020/12/07 Python
一文带你掌握Pyecharts地理数据可视化的方法
2021/02/06 Python
纯CSS3实现的阴影效果
2014/12/24 HTML / CSS
Backcountry旗下的户外商品闪购网站:steep&cheap
2016/09/22 全球购物
颇特女士香港官网:NET-A-PORTER香港
2021/03/08 全球购物
公司门卫管理制度
2014/02/01 职场文书
单位委托书格式范本
2014/09/29 职场文书
优秀党员个人总结
2015/02/14 职场文书
综合素质评价思想道德自我评价
2015/03/09 职场文书
会计简历自我评价
2015/03/10 职场文书
公司放假通知范文
2015/04/14 职场文书
《圆的周长》教学反思
2016/02/17 职场文书
Nginx+SpringBoot实现负载均衡的示例
2021/03/31 Servers
python异步的ASGI与Fast Api实现
2021/07/16 Python