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-cli 创建模板项目
Nov 19 Vue.js
Vue-router中hash模式与history模式的区别详解
Dec 15 Vue.js
vue监听滚动事件的方法
Dec 21 Vue.js
Vue使用鼠标在Canvas上绘制矩形
Dec 24 Vue.js
vue-cli4.0多环境配置变量与模式详解
Dec 30 Vue.js
Vue过滤器,生命周期函数和vue-resource简单介绍
Jan 12 Vue.js
Vue实现多页签组件
Jan 14 Vue.js
Vue包大小优化的实现(从1.72M到94K)
Feb 18 Vue.js
vue 数据双向绑定的实现方法
Mar 04 Vue.js
vue.js Router中嵌套路由的实用示例
Jun 27 Vue.js
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
Apr 06 Vue.js
vue elementUI表格控制对应列
Apr 13 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实现Mysql读写分离
2013/06/28 PHP
php查看当前Session的ID实例
2015/03/16 PHP
php获取百度收录、百度热词及百度快照的方法
2015/04/02 PHP
PHP函数nl2br()与自定义函数nl2p()换行用法分析
2016/04/02 PHP
PHP单例模式是什么 php实现单例模式的方法
2016/05/14 PHP
PHP面向对象多态性实现方法简单示例
2017/09/27 PHP
JS特殊函数(Function()构造函数、函数直接量)区别介绍
2013/05/19 Javascript
js中indexof的用法详细解析
2013/12/24 Javascript
JavaScript随机生成信用卡卡号的方法
2015/04/07 Javascript
js实现精美的银灰色竖排折叠菜单
2015/05/16 Javascript
angularjs路由传值$routeParams详解
2020/09/05 Javascript
vue中父子组件注意事项,传值及slot应用技巧
2018/05/09 Javascript
vue+iview实现文件上传
2020/11/17 Vue.js
Python isinstance判断对象类型
2008/09/06 Python
浅析Python中else语句块的使用技巧
2016/06/16 Python
Python内置函数—vars的具体使用方法
2017/12/04 Python
对python 多个分隔符split 的实例详解
2018/12/20 Python
python-itchat 统计微信群、好友数量,及原始消息数据的实例
2019/02/21 Python
python全栈知识点总结
2019/07/01 Python
python之pexpect实现自动交互的例子
2019/07/25 Python
python利用百度云接口实现车牌识别的示例
2020/02/21 Python
Python中猜拳游戏与猜筛子游戏的实现方法
2020/09/04 Python
关于HTML5 Placeholder新标签低版本浏览器下不兼容的问题分析及解决办法
2016/01/27 HTML / CSS
Lyle & Scott苏格兰金鹰官网:英国皇室御用品牌
2018/05/09 全球购物
香港士多网上超级市场:Ztore
2021/01/09 全球购物
应届生煤化工求职信
2013/10/21 职场文书
厨房工作人员岗位职责
2013/11/15 职场文书
升职自荐信
2013/11/28 职场文书
2014年社区学雷锋活动总结
2014/03/09 职场文书
2014年最新党员对照检查材料汇总
2014/09/15 职场文书
高中生第一学年自我鉴定2015
2014/09/28 职场文书
中学生勤俭节约倡议书
2015/04/29 职场文书
迁徙的鸟观后感
2015/06/09 职场文书
pygame面向对象的飞行小鸟实现(Flappy bird)
2021/04/01 Python
Java循环队列与非循环队列的区别总结
2021/06/22 Java/Android
Python 视频画质增强
2022/04/28 Python