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实现简易播放器的完整代码
Dec 30 Vue.js
Vue实现图书管理案例
Jan 20 Vue.js
vue 组件基础知识总结
Jan 26 Vue.js
vue 项目@change多个参数传值多个事件的操作
Jan 29 Vue.js
vue前端和Django后端如何查询一定时间段内的数据
Feb 28 Vue.js
使用Vue.js和MJML创建响应式电子邮件
Mar 23 Vue.js
vue backtop组件的实现完整代码
Apr 07 Vue.js
Vue + iView实现Excel上传功能的完整代码
Jun 22 Vue.js
Vue如何清空对象
Mar 03 Vue.js
vue特效之翻牌动画
Apr 20 Vue.js
Vue2项目中对百度地图的封装使用详解
Jun 16 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
Protoss兵种介绍
2020/03/14 星际争霸
PHP修改session_id示例代码
2014/01/08 PHP
PHP中array_keys和array_unique函数源码的分析
2016/02/26 PHP
php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
2016/09/23 PHP
PHP中trait使用方法详细介绍
2017/05/21 PHP
Laravel 已登陆用户再次查看登陆页面的自动跳转设置方法
2019/09/30 PHP
真正的JQuery.ajax传递中文参数的解决方法
2011/05/28 Javascript
JavaScript定时器和优化的取消定时器方法
2015/07/03 Javascript
用js读写cookie的简单方法(推荐)
2016/08/08 Javascript
jquery根据一个值来选中select下的option实例代码
2016/08/29 Javascript
jQuery按需加载轮播图(web前端性能优化)
2017/02/17 Javascript
使用vue.js实现checkbox的全选和多个的删除功能
2017/02/17 Javascript
基于vue.js无缝滚动效果
2018/01/25 Javascript
JS实现的文件拖拽上传功能示例
2018/05/21 Javascript
微信小程序实现弹出菜单
2018/07/19 Javascript
vue给组件传递不同的值方法
2018/09/29 Javascript
vue监听用户输入和点击功能
2019/09/27 Javascript
vue中destroyed方法的使用说明
2020/07/21 Javascript
解决vue项目input输入框双向绑定数据不实时生效问题
2020/08/05 Javascript
JavaScript 中判断变量是否为数字的示例代码
2020/10/22 Javascript
python基础教程之元组操作使用详解
2014/03/25 Python
Python绘图Matplotlib之坐标轴及刻度总结
2019/06/28 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
2020/02/23 Python
Django权限设置及验证方式
2020/05/13 Python
如何实现一个python函数装饰器(Decorator)
2020/10/12 Python
python 用opencv实现霍夫线变换
2020/11/27 Python
一款纯css3实现的竖形二级导航的实例教程
2014/12/11 HTML / CSS
amazeui模态框弹出后立马消失并刷新页面
2020/08/19 HTML / CSS
Oakley官网:运动太阳镜、雪镜和服装
2016/09/30 全球购物
struct和class的区别
2015/11/20 面试题
在职研究生自我鉴定
2013/10/16 职场文书
十佳青年个人事迹材料
2014/01/28 职场文书
团委竞选演讲稿
2014/04/24 职场文书
给老婆道歉的话
2015/01/20 职场文书
2015年语言文字工作总结
2015/07/23 职场文书
幽默导游词应该怎么写?
2019/08/26 职场文书