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 19 Vue.js
Vue通过阿里云oss的url连接直接下载文件并修改文件名的方法
Dec 25 Vue.js
vue3+typeScript穿梭框的实现示例
Dec 29 Vue.js
vue调用微信JSDK 扫一扫,相册等需要注意的事项
Jan 03 Vue.js
vue 递归组件的简单使用示例
Jan 14 Vue.js
Vue实现todo应用的示例
Feb 20 Vue.js
Vue实现tab导航栏并支持左右滑动功能
Jun 28 Vue.js
vue中 this.$set的使用详解
Nov 17 Vue.js
前端vue+express实现文件的上传下载示例
Feb 18 Vue.js
vue实现列表垂直无缝滚动
Apr 08 Vue.js
VUE之图片Base64编码使用ElementUI组件上传
Apr 09 Vue.js
vue 自定义组件添加原生事件
Apr 21 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
实例(Smarty+FCKeditor新闻系统)
2007/01/02 PHP
页面利用渐进式JPEG来提升用户体验度
2014/12/01 PHP
CentOS安装php v8js教程
2015/02/26 PHP
PHP程序中使用adodb连接不同数据库的代码实例
2015/12/19 PHP
composer.lock文件的作用
2016/02/03 PHP
详解WordPress中用于更新和获取用户选项数据的PHP函数
2016/03/08 PHP
CSS+Jquery实现页面圆角框方法大全
2009/12/24 Javascript
使用JavaScript检测Firefox浏览器是否启用了Firebug的代码
2010/12/28 Javascript
浅谈Javascript事件模拟
2012/06/27 Javascript
JS动态获取当前时间,并写到特定的区域
2013/05/03 Javascript
javascript实现文字图片上下滚动的具体实例
2013/06/28 Javascript
jquery的相对父元素和相对文档定位示例代码
2013/08/02 Javascript
angularJS 中$attrs方法使用指南
2015/02/09 Javascript
jQuery通过扩展实现抖动效果的方法
2015/03/11 Javascript
Node.js中的process.nextTick使用实例
2015/06/25 Javascript
详解Vue监听数据变化原理
2017/03/08 Javascript
文本溢出插件jquery.dotdotdot.js使用方法详解
2017/06/22 jQuery
bootstrap table表格客户端分页实例
2017/08/07 Javascript
使用jQuery实现简单的tab框实例
2017/08/22 jQuery
详解Vue + Vuex 如何使用 vm.$nextTick
2017/11/20 Javascript
关于vue中watch检测到不到对象属性的变化的解决方法
2018/02/08 Javascript
python实现图书馆研习室自动预约功能
2018/04/27 Python
python 检查文件mime类型的方法
2018/12/08 Python
python覆盖写入,追加写入的实例
2019/06/26 Python
django 中的聚合函数,分组函数,F 查询,Q查询
2019/07/25 Python
css3中单位px,em,rem,vh,vw,vmin,vmax的区别及浏览器支持情况
2016/12/06 HTML / CSS
德国的各种媒体在线商店:Thalia.de(书籍、电子书、玩具等)
2020/10/08 全球购物
商得四方公司面试题(gid+)
2014/04/30 面试题
应届大学生自荐信
2013/12/05 职场文书
如何写求职信
2014/05/24 职场文书
2014年秋季开学演讲稿
2014/05/24 职场文书
庆祝儿童节标语
2014/10/09 职场文书
开展党的群众路线教育实践活动个人对照检查材料
2014/11/05 职场文书
工程部主管岗位职责
2015/02/12 职场文书
《用字母表示数》教学反思
2016/02/17 职场文书
JAVA springCloud项目搭建流程
2022/05/11 Java/Android