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+vant实现购物车全选和反选功能
Nov 17 Vue.js
vue 获取到数据但却渲染不到页面上的解决方法
Nov 19 Vue.js
Vue开发中常见的套路和技巧总结
Nov 24 Vue.js
梳理一下vue中的生命周期
Dec 30 Vue.js
vue3中轻松实现switch功能组件的全过程
Jan 07 Vue.js
通过vue.extend实现消息提示弹框的方法记录
Jan 07 Vue.js
Vue 实例中使用$refs的注意事项
Jan 29 Vue.js
关于Vue Router的10条高级技巧总结
May 06 Vue.js
Vue中foreach数组与js中遍历数组的写法说明
Jun 05 Vue.js
vue项目多环境配置(.env)的实现
Jul 21 Vue.js
vue中 this.$set的使用详解
Nov 17 Vue.js
vue项目支付功能代码详解
Feb 18 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生成自己的LOG文件
2006/10/09 PHP
使用MaxMind 根据IP地址对访问者定位
2006/10/09 PHP
php检测图片木马多进制编程实践
2013/04/11 PHP
测试PHP连接MYSQL成功与否的代码
2013/08/16 PHP
ThinkPHP文件上传实例教程
2014/08/22 PHP
PHP读取txt文本文件并分页显示的方法
2015/03/11 PHP
PHP+MySQL之Insert Into数据插入用法分析
2015/09/27 PHP
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
2018/12/08 PHP
js中各浏览器中鼠标按键值的差异
2011/04/07 Javascript
JS Replace()的高级使用方法介绍
2013/06/29 Javascript
JavaScript中textRange对象使用方法小结
2015/03/24 Javascript
JS实现带鼠标效果的头像及文章列表代码
2015/09/27 Javascript
jQuery实现彩带延伸效果的网页加载条loading动画
2015/10/29 Javascript
jQuery实现放大镜效果实例代码
2016/03/17 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
2016/10/28 Javascript
基于js中style.width与offsetWidth的区别(详解)
2017/11/12 Javascript
详解vue-cli脚手架build目录中的dev-server.js配置文件
2017/11/24 Javascript
vue中使用iview自定义验证关键词输入框问题及解决方法
2018/03/26 Javascript
vue引用js文件的多种方式(推荐)
2018/05/17 Javascript
layui中使用jquery控制radio选中事件的示例代码
2018/08/15 jQuery
vue实现路由切换改变title功能
2019/05/28 Javascript
详解小程序如何改变onLoad的执行时机
2019/11/01 Javascript
Vue双向绑定实现原理与方法详解
2020/05/07 Javascript
jQuery实现图片切换效果
2020/10/19 jQuery
用python实现的线程池实例代码
2018/01/06 Python
python实现两个文件合并功能
2018/04/01 Python
PyQt5每天必学之拖放事件
2020/08/27 Python
pandas 对每一列数据进行标准化的方法
2018/06/09 Python
新西兰Bookabach:查找全球度假屋
2020/12/03 全球购物
网络技术支持面试题
2013/04/22 面试题
最新创业融资计划书
2014/01/19 职场文书
十一酒店活动方案
2014/02/20 职场文书
青年安全生产示范岗事迹材料
2014/05/04 职场文书
三严三实对照检查材料范文
2014/09/23 职场文书
基于Redis位图实现用户签到功能
2021/05/08 Redis
win10电脑老是死机怎么办?win10系统老是死机的解决方法
2022/08/05 数码科技