vue的JavaScript 钩子:模拟加入购物车动画小demo(半场动画)

Vue官方文档参考详情

代码:

<!DOCTYPE html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title></title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script src="./lib/vue-2.4.0.js"></script>
        <script src="./lib/iview.min.js"></script>
        <!-- 不懂为啥,ivew.css下载到本地使用icon不显示 -->
        <!-- <link rel="stylesheet" href="./lib/iview.css"> -->
        <link rel="stylesheet" href="https://unpkg.com/iview@3.4.2/dist/styles/iview.css">
    </head>
    <body>
        <div id="app">
           <div class="store">
               <p class="cql">陈情令商铺</p>
               <div class="goodsBox">
                   <div class="itemBox">
                        <div class="goodItem">
                            <label class="goodName">魏无羡</label>
                            <img src="./images/wwx1.jpg" class="good"/>
                            <label class="addButton" @click="flag=!flag">加入购物车</label>
                        </div>
                        <!-- 半场动画,包括js的三个钩子函数:before-enter、enter、after-enter -->
                        <transition
                        @before-enter="beforeEnter"
                        @enter="enter"
                        @after-enter="afterEnter">
                            <div v-show="flag" class="miniBall"></div>
                        </transition>
                   </div>
                    
                   <div class="itemBox">
                        <div class="goodItem">
                            <label class="goodName">蓝忘机</label>
                            <img src="./images/lwj1.jpg" class="good"/>
                            <label class="addButton" @click="flag1=!flag1">加入购物车</label>
                        </div>
                        <transition
                        @before-enter="beforeEnter"
                        @enter="enter"
                        @after-enter="afterEnter">
                            <div v-show="flag1" class="miniBall"></div>
                        </transition>
                   </div>
                    
                    <!-- 购物车 -->
                    <label class="goodCar">
                            <Icon size="30" type="ios-cart-outline" ></Icon>
                    </label>
               </div>
           </div>
        </div>
    </body>
    <script>
        var vm = new Vue({
            el: '#app',
            data() {
                return {
                    flag:false,
                    flag1:false,
                }
            },
            methods:{
                // el表示transition标签包围起来的那个DOM元素,是个原生的 JS DOM对象
                beforeEnter(el) {
                    // 1.结束点
                    el.style.transform = "translate(50px, 0)";
                },
                enter(el, done) {
                    // 2.需要加上这句才会刷新,执行过渡期间的效果
                    el.offsetWidth 

                    // 3.结束点
                    if(this.flag) {
                        // 向右移动260px,向下移动230px
                        el.style.transform = "translate(260px, 230px)";
                    }
                    if(this.flag1) {
                        el.style.transform = "translate(150px, 230px)";
                    }
                    el.style.transition = "all 2s ease";

                    // 4.动画结束后,隐藏(done代表afterEnter函数)
                    done()
                },
                afterEnter(el) {
                    if(this.flag) {
                        this.flag = !this.flag;
                    }
                    if(this.flag1) {
                        this.flag1 = !this.flag1;
                    }
                },
            }
        })
    </script>
    <style>
        .store{
            width: 300px;
            height: 500px;
            border: 1px solid #333;
            margin-left: 20px;
        }
        .cql{
            text-align: center;
            font-size:18px;
            margin: 10px 0;
            padding-bottom: 10px;
            border-bottom: 1px solid #333;
        }
        .goodsBox{
            height: 88%;
            position: relative;
            padding: 10px;
        }
        .itemBox{
            margin-right: 10px;
            display: inline-block;
        }
        .goodItem{
            width: 96px;
            display: inline-block;
        }
        .good{
            border: 1px solid #ddd;
            width: 94px;
            display: block;
            margin-bottom: 5px;
        }
        .goodName{
            font-weight: bold;
            display: block;
            text-align: center;
        }
        .addButton{
            border:1px solid silver;
            border-radius:4px;
            margin-left: 14px;
            padding: 2px 3px;
        }
        .addButton:hover{
            cursor: pointer;
            border:1px solid #666;
        }
        .miniBall{
            display: inline-block;
            position: absolute;
            width: 8px;
            height: 8px;
            background-color: red;
            border:1px solid red; 
            border-radius: 50%;
        }
        .goodCar{
            display: inline-block;
            position: absolute;
            bottom: 0;
            right: 10px;
        }
        .ivu-btn-ghost {
            color: #3d3030;
            background: 0 0;
        }
    </style>
</html>

效果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值