老师为什么我的小球只能从底部右边飞入?

来源:5-4 小球飞入动画实现

lcyjerry

2020-06-08

写回答

3回答

lcyjerry

提问者

2020-06-08

已解决


0
0

ustbhuangyi

2020-06-08

你把代码传到 GitHub 上,我抽空帮你看看

0
2
lcyjerry
修改成这样才行 dropping(el, done) { this._reflow = document.body.offsetHeight; el.style.transform = el.style.webkitTransform = `translate3d(0,0,0)`; const inner = el.getElementsByClassName("inner-hook")[0]; inner.style.transform = inner.style.webkitTransform = `translate3d(0,0,0)`; el.addEventListener("transitionend", done); },
2020-06-08
共2条回复

lcyjerry

提问者

2020-06-08

<template>

  <div>

    <div class="shopcart">

      <div class="content" @click="toggleList">

        <div class="content-left">

          <div class="logo-wrapper">

            <div class="logo" :class="{ highlight: totalCount > 0 }">

              <i

                class="icon-shopping_cart"

                :class="{ highlight: totalCount > 0 }"

              ></i>

            </div>

            <div v-show="totalCount > 0" class="num">

              {{ totalCount }}

            </div>

          </div>

          <div class="price" :class="{ highlight: totalCount > 0 }">

            ¥{{ totalPrice }}

          </div>

          <div class="desc">另需配送费 ¥{{ deliveryPrice }}元</div>

        </div>

        <div class="content-right" @click.stop.prevent="pay">

          <div :class="payClass" class="pay">

            {{ payDesc }}

          </div>

        </div>

      </div>

      <div class="ball-container">

        <div v-for="(ball, index) in balls" :key="index">

          <transition

            @before-enter="beforeDrop"

            @enter="dropping"

            @after-enter="afterDrop"

          >

            <div class="ball" v-show="ball.show">

              <div class="inner inner-hook"></div>

            </div>

          </transition>

        </div>

      </div>

      <transition name="fold">

        <div class="shopcart-list" v-show="listShow">

          <div class="list-header">

            <h1 class="title">购物车</h1>

            <span class="empty" @click="empty">清空</span>

          </div>

          <div class="list-content" ref="listContent">

            <ul>

              <li

                class="food"

                v-for="(food, index) in selectFoods"

                :key="index"

              >

                <span class="name">{{ food.name }}</span>

                <div class="price">

                  <span>¥{{ food.price * food.count }}</span>

                </div>

                <div class="cartcontrol-wrapper">

                  <cartcontrol :food="food"></cartcontrol>

                </div>

              </li>

            </ul>

          </div>

        </div>

      </transition>

    </div>

    <transition name="fade">

      <div class="list-mask" v-show="listShow" @click="hideList"></div>

    </transition>

  </div>

</template>


<script>

import cartcontrol from "components/cartcontrol/cartcontrol";

import BScroll from "@better-scroll/core";


const BALL_LEN = 10;


function createBalls() {

  let ret = [];

  for (let i = 0; i < BALL_LEN; i++) {

    ret.push({

      show: false,

    });

  }

  return ret;

}


export default {

  data() {

    return {

      fold: true,

      balls: createBalls(),

    };

  },


  components: {

    cartcontrol,

  },


  props: {

    selectFoods: {

      type: Array,

      default() {

        return [];

      },

    },


    deliveryPrice: {

      type: Number,

      default: 0,

    },


    minPrice: {

      type: Number,

      default: 0,

    },

  },


  computed: {

    totalPrice() {

      let total = 0;

      this.selectFoods.forEach((food) => {

        total += food.price * food.count;

      });

      return total;

    },


    totalCount() {

      let count = 0;

      this.selectFoods.forEach((food) => {

        count += food.count;

      });

      return count;

    },


    payDesc() {

      if (this.totalPrice === 0) {

        return `¥${this.minPrice}元起送`;

      } else if (this.totalPrice < this.minPrice) {

        let diff = this.minPrice - this.totalPrice;

        return `还差¥${diff}元起送`;

      } else {

        return "去结算";

      }

    },


    payClass() {

      if (this.totalPrice < this.minPrice) {

        return "not-enough";

      } else {

        return "enough";

      }

    },


    listShow() {

      if (!this.totalCount) {

        this.fold = true;

        return false;

      }

      let show = !this.fold;

      if (show) {

        this.$nextTick(() => {

          if (!this.scroll) {

            this.scroll = new BScroll(this.$refs.listContent, {

              click: true,

            });

          } else {

            this.scroll.refresh();

          }

        });

      }

      return show;

    },

  },


  created() {

    this.dropBalls = [];

  },


  methods: {

    toggleList() {

      if (!this.totalCount) {

        return;

      }

      this.fold = !this.fold;

    },


    empty() {

      this.selectFoods.forEach((food) => {

        food.count = 0;

      });

    },


    hideList() {

      this.fold = true;

    },


    pay() {

      if (this.totalPrice < this.minPrice) {

        return;

      } else {

        window.alert(`支付${this.totalPrice}元`);

      }

    },


    drop(el) {

      for (let i = 0; i < this.balls.length; i++) {

        const ball = this.balls[i];

        if (!ball.show) {

          ball.show = true;

          ball.el = el;

          this.dropBalls.push(ball);

          return;

        }

      }

    },


    beforeDrop(el) {

      const ball = this.dropBalls[this.dropBalls.length - 1];

      const rect = ball.el.getBoundingClientRect();

      const x = rect.left - 32;

      const y = -(window.innerHeight - rect.top - 22);

      el.style.display = "";

      el.style.transform = el.style.webkitTransform = `translate3d(0,${y}px,0)`;

      const inner = el.getElementsByClassName("inner-hook")[0];

      inner.style.transform = el.style.webkitTransform = `translate3d(${x}px,0,0)`;

    },


    dropping(el, done) {

      this._reflow = document.body.offsetHeight;

      el.style.transform = el.style.webkitTransform = `translate3d(0,0,0)`;

      const inner = el.getElementsByClassName("inner-hook")[0];

      inner.style.transform = el.style.webkitTransform = `translate3d(0,0,0)`;

      el.addEventListener("transitionend", done);

    },


    afterDrop(el) {

      const ball = this.dropBalls.shift();

      if (ball) {

        ball.show = false;

        el.style.display = 'none';

      }

    },

  },

};

</script>



0
0

Vue.js2.5+cube-ui重构饿了么App(经典再升级)

掌握Vue1.0到2.0再到2.5最全版本应用与迭代,打造极致流畅的WebApp

9868 学习 · 4162 问题

查看课程