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 的 v-model用法实例
Nov 23 Vue.js
Vue如何实现验证码输入交互
Dec 07 Vue.js
vue从后台渲染文章列表以及根据id跳转文章详情详解
Dec 14 Vue.js
8个非常实用的Vue自定义指令
Dec 15 Vue.js
vue下拉刷新组件的开发及slot的使用详解
Dec 23 Vue.js
WebStorm无法正确识别Vue3组合式API的解决方案
Feb 18 Vue.js
一篇文章学会Vue中间件管道
Jun 20 Vue.js
SSM VUE Axios详解
Oct 05 Vue.js
关于Vue中的options选项
Mar 22 Vue.js
vue项目proxyTable配置和部署服务器
Apr 14 Vue.js
详解Vue3使用axios的配置教程
Apr 29 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 网页游戏开发入门教程一(webgame+design)
2009/10/26 PHP
PHP设计模式之装饰者模式
2012/02/29 PHP
curl不使用文件存取cookie php使用curl获取cookie示例
2014/01/26 PHP
php实现excel中rank函数功能的方法
2015/01/20 PHP
ajax更新数据后,jquery、jq失效问题
2011/03/16 Javascript
require.js的用法详解
2015/10/20 Javascript
AngularJs Understanding the Model Component
2016/09/02 Javascript
文件上传插件SWFUpload的使用指南
2016/11/29 Javascript
vue.js在标签属性中插入变量参数的方法
2018/03/06 Javascript
使用live-server快速搭建本地服务器+自动刷新的方法
2018/03/09 Javascript
JS简单获取并修改input文本框内容的方法示例
2018/04/08 Javascript
webpack项目轻松混用css module的方法
2018/06/12 Javascript
微信小程序将字符串生成二维码图片的操作方法
2018/07/17 Javascript
浅谈Vue初学之props的驼峰命名
2018/07/19 Javascript
jquery获取select选中值的文本,并赋值给另一个输入框的方法
2018/08/21 jQuery
详解axios中封装使用、拦截特定请求、判断所有请求加载完毕)
2019/04/09 Javascript
深入理解JS异步编程-Promise
2019/06/03 Javascript
前端Vue项目详解--初始化及导航栏
2019/06/24 Javascript
JS实现在线ps功能详解
2019/07/31 Javascript
JS使用H5实现图片预览功能
2019/09/30 Javascript
OpenLayers3加载常用控件使用方法详解
2020/09/25 Javascript
[04:11]2014DOTA2国际邀请赛 CIS遗憾出局梦想不灭
2014/07/09 DOTA
[03:26]《DAC最前线》之EG经理自述DOTA2经历
2015/02/02 DOTA
python中引用与复制用法实例分析
2015/06/04 Python
漂亮的Django Markdown富文本app插件的实现
2019/01/02 Python
windows支持哪个版本的python
2020/07/03 Python
利用CSS3伪元素实现逐渐发光的方格边框
2017/05/07 HTML / CSS
Smashbox英国官网:美国知名彩妆品牌
2017/11/13 全球购物
草莓网官网:StrawberryNET
2019/08/21 全球购物
项目总经理岗位职责
2014/02/14 职场文书
联片教研活动总结
2014/07/01 职场文书
2014年社区矫正工作总结
2014/11/18 职场文书
本科毕业论文导师评语
2014/12/31 职场文书
大学生个人年度总结范文
2015/02/15 职场文书
公司承诺书格式范文
2015/04/28 职场文书
Python 详解通过Scrapy框架实现爬取百度新冠疫情数据流程
2021/11/11 Python