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组件简易模拟实现购物车
Dec 21 Vue.js
vue中封装axios并实现api接口的统一管理
Dec 25 Vue.js
Vue过滤器,生命周期函数和vue-resource简单介绍
Jan 12 Vue.js
vue 组件基础知识总结
Jan 26 Vue.js
vue脚手架项目创建步骤详解
Mar 02 Vue.js
vue3.0 项目搭建和使用流程
Mar 04 Vue.js
vue组件的路由高亮问题解决方法
May 11 Vue.js
vue使用Google Recaptcha验证的实现示例
Aug 23 Vue.js
vue+iview实现手机号分段输入框
Mar 25 Vue.js
ant design vue的form表单取值方法
Jun 01 Vue.js
Vue深入理解插槽slot的使用
Aug 05 Vue.js
vue el-table实现递归嵌套的示例代码
Aug 14 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
Terran兵种介绍
2020/03/14 星际争霸
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
2014/05/15 PHP
windows下配置php5.5开发环境及开发扩展
2014/12/25 PHP
thinkphp中AJAX返回ajaxReturn()方法分析
2016/12/06 PHP
php微信公众号开发之快递查询
2018/10/20 PHP
在laravel中使用with实现动态添加where条件
2019/10/10 PHP
alixixi runcode.asp的代码不错的应用
2007/08/08 Javascript
表单元素事件 (Form Element Events)
2009/07/17 Javascript
javascript发送短信验证码实现代码
2015/11/12 Javascript
JS插件overlib用法实例详解
2015/12/26 Javascript
JS正则表达式比较常见用法
2016/01/26 Javascript
BootStrap的JS插件之轮播效果案例详解
2016/05/16 Javascript
jQuery easyUI datagrid 增加求和统计行的实现代码
2016/06/01 Javascript
jQuery EasyUI常用数据验证汇总
2016/09/18 Javascript
原生JS实现图片轮播切换效果
2016/12/15 Javascript
jQuery Ajax自定义分页组件(jquery.loehpagerv1.0)实例详解
2017/05/01 jQuery
React服务端渲染(总结)
2017/07/01 Javascript
bootstrap Table插件使用demo
2017/08/07 Javascript
详解Angular5 路由传参的3种方法
2018/04/28 Javascript
JavaScript对象的特性与实践应用深入详解
2018/12/30 Javascript
vue视频播放插件vue-video-player的具体使用方法
2019/11/08 Javascript
Vue Cli3 打包配置并自动忽略console.log语句的方法
2020/04/23 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
2020/10/12 Javascript
[02:17]2016完美“圣”典风云人物:Sccc专访
2016/12/03 DOTA
[00:35]2016完美“圣”典风云人物:冷冷宣传片
2016/12/08 DOTA
Python里disconnect UDP套接字的方法
2015/04/23 Python
Python抓取手机号归属地信息示例代码
2016/11/28 Python
详解Python 数据库 (sqlite3)应用
2016/12/07 Python
python利用7z批量解压rar的实现
2019/08/07 Python
文明之星事迹材料
2014/05/09 职场文书
JavaScript 对象创建的3种方法
2021/11/17 Javascript
MySQL数据库优化之通过索引解决SQL性能问题
2022/04/10 MySQL
Go语言的协程上下文的几个方法和用法
2022/04/11 Golang
Java Spring Boot请求方式与请求映射过程分析
2022/06/25 Java/Android
MySQL的表级锁,行级锁,排它锁和共享锁
2022/07/15 MySQL
table设置超出部分隐藏,鼠标移上去显示全部内容的方法
2022/12/24 HTML / CSS