Navigation menu

0755-82192581
  • Contact us
  • 0755-82192581
  • 深圳市羅湖(hú)區(qū)嘉賓路深華商(shāng)業大廈9樓(地鐵1号線(xiàn)國(guó)貿站B出口既是)

    3375726676@qq.com


    © 2007-2021 All Rights Reserved.
  • 策略型高端網站設計公(gōng)司

    Strategic advanced website design company

    View More
  • 網站開發用(yòng)SVG設置動畫

    時間:2022-01-20  作(zuò)者:尼高GARY  來源:https://www.niegoweb.com

    了解網站開發的都知道SVG 是一種非常簡潔的格式,可(kě)以在網站上顯示任何插圖、圖标或徽标。此外,它們可(kě)以在 CSS 或 JavaScript 中(zhōng)進行動畫處理(lǐ),以使它們更具(jù)吸引力。但是 SVG 也可(kě)以隻用(yòng)于他(tā)們的數據,沒有(yǒu)視覺效果!讓我解釋…


    網站開發

    SVG 是一種矢量圖像格式,這意味着它不是由彩色像素組成,而是數學(xué)函數,一旦被解釋,就可(kě)以在屏幕上呈現。由于浏覽器必須将文(wén)件從函數轉換為(wèi)實際像素,它還允許我們訪問各種方法來操作(zuò)或從數學(xué)中(zhōng)檢索數據。如果我們查看有(yǒu)關該方法的 MDN 文(wén)檔頁(yè)面,它說:該SVGGeometryElement.getPointAtLength()方法返回沿路徑給定距離處的點。該方法将為(wèi)我們提供一個點的坐(zuò)标,該點恰好位于我們作(zuò)為(wèi)參數發送的特定距離處的路徑上。

    由于我們需要給出我們點的距離,這意味着我們很(hěn)可(kě)能(néng)需要知道我們的路徑有(yǒu)多(duō)長(cháng)。幸運的是,SVG API 有(yǒu)一個方法 getTotalLength() 可(kě)用(yòng)于任何 SVGGeometryElement 返回元素總長(cháng)度的方法!為(wèi)此,我們需要一個包含動畫值 (as gsap cannot animate number variables directly) 并将屬性 distance 設置為(wèi)零的 JavaScript 對象。

    然後我們創建一個補間,将 distance 值從 0 更新(xīn)為(wèi)路徑的總長(cháng)度。最後在每一幀上,我們根據動畫距離值沿路徑檢索一個點,并更新(xīn)圓的 cx 和 cy 屬性以使其移動:
    // Create an object that gsap can animate
    const val = { distance: 0 };
    // Create a tween
    gsap.to(val, {
      // Animate from distance 0 to the total distance
      distance: path.getTotalLength(),
      // Function call on each frame of the animation
      onUpdate: () => {
        // Query a point at the new distance value
        const point = path.getPointAtLength(val.distance);
        // Update the circle coordinates
        circle.setAttribute('cx', point.x);
        circle.setAttribute('cy', point.y);
      }
    });

    如果您想要實現的效果隻是沿 SVG 路徑為(wèi)一個元素設置動畫,它可(kě)以讓您輕松地從您提供的路徑中(zhōng)為(wèi)任何 DOM 元素設置動畫。我喜歡粒子,這不是突發新(xīn)聞。這就是為(wèi)什麽,當我學(xué)習一項新(xīn)技(jì )術時,我總是嘗試用(yòng)它們來實現一些東西。讓我們看看如何代替沿着路徑移動的單個圓圈,我們可(kě)以讓更多(duō)的圓圈像炸彈引信一樣爆炸,這個動畫的整體(tǐ)邏輯和之前完全一樣,隻是在每一幀我們都會創建一個新(xīn)的圓形元素并對其進行動畫處理(lǐ)。如您所見,設置非常相似。
    const svg = document.querySelector('svg');
    const fuse = svg.querySelector('.fuse');

    const val = { distance: 0 };
    gsap.to(val, {
      distance: fuse.getTotalLength(),
      repeat: -1,
      duration: 5,
      onUpdate: () => {
        // Query a point at the new distance value
        const point = fuse.getPointAtLength(val.distance);
        // Create a new particle
        createParticle(point);
      }
    });
    該 createParticle 函數将在每一幀上調用(yòng)以使新(xīn)粒子彈出和淡出。以下是動畫的步驟:創建一個新(xīn)的圓形元素并将其附加到 SVG,從我們計算的點設置坐(zuò)标 getPointAtLength,為(wèi)每個定義一個随機半徑和顔色,将該粒子 cx 和 cy 屬性設置為(wèi)随機位置,動畫完成後,從 DOM 中(zhōng)移除粒子。

    相關案例

    OTHER CASE