1. 程式人生 > >購物車小球動畫

購物車小球動畫

.ball {
    width: 15px;
    height: 15px;
    border-radius: 50%;
    background-color: red;
    position: absolute;
    z-index: 99;
    top: 390px;
    left: 146px;
  }

<transition
      @before-enter="beforeEnter"
      @enter="enter"
      @after-enter="afterEnter">
      <div class="ball" v-show="ballFlag" ref="ball"></div>
    </transition>

ballFlag: false, // 控制小球的隱藏和顯示的識別符號

addToShopCar() {
      // 新增到購物車
      this.ballFlag = !this.ballFlag;
    },

beforeEnter(el) {
      el.style.transform = "translate(0, 0)";
    },
    enter(el, done) {
      el.offsetWidth;


      // 小球動畫優化思路:
      // 1. 先分析導致 動畫 不準確的 本質原因: 我們把 小球 最終 位移到的 位置,已經侷限在了某一解析度下的 滾動條未滾動的情況下;
      // 2. 只要解析度和 測試的時候不一樣,或者 滾動條有一定的滾動距離之後, 問題就出現了;
      // 3. 因此,我們經過分析,得到結論: 不能把 位置的 橫縱座標 直接寫死了,而是應該 根據不同情況,動態計算這個座標值;
      // 4. 經過分析,得出解題思路: 先得到 徽標的 橫縱 座標,再得到 小球的 橫縱座標,然後 讓 y 值 求差, x 值也求 差,得到 的結果,就是橫縱座標要位移的距離
      // 5. 如何 獲取 徽標和小球的 位置???   domObject.getBoundingClientRect()

      // 獲取小球的 在頁面中的位置
      const ballPosition = this.$refs.ball.getBoundingClientRect();
      // 獲取 徽標 在頁面中的位置
      const badgePosition = document
        .getElementById("badge")
        .getBoundingClientRect();

      const xDist = badgePosition.left - ballPosition.left;
      const yDist = badgePosition.top - ballPosition.top;

      el.style.transform = `translate(${xDist}px, ${yDist}px)`;
      el.style.transition = "all 0.5s cubic-bezier(.4,-0.3,1,.68)";
      done();
    },
    afterEnter(el) {
      this.ballFlag = !this.ballFlag;
    },