質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.06%

slickスライド切り替わりと同時に再生するSVGアニメーション

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 930

score 5

前提

こちらのサイト(https://uzuz.jp/)にある、スライドで切り替わるSVGアニメーションを再現したいです。

SVGアニメーションの動きはできましたが、スライドと連動させることが出来ませんでした。
どなたかご教授頂けますと幸いです。

実現したいこと

スライドの動きを、

  1. スライドAが表示後、SVGアニメーションA再生
  2. スライドBが表示後、SVGアニメーションB再生
  3. スライドCが表示後、SVGアニメーションC再生
    .
    .
    .

以下ループ

という感じに、スライド切り替わりと同時にSVGアニメーションを再生。

該当のソースコード

<ul id="slider">
    <li>
        <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1800 1250">
            <path id="base_01" class="base" d="M1018,251c11.482,9.849,49,55,71.299,33.162c10.158-9.948-30.574-43.962-45.391-50.062c-40.527-16.687-73.606,1.587-61.908,30.9c7.511,18.822,42.165,44.257,65.15,54.206c58.665,25.393,124.253-18.383,71.328-73.425c-21.728-22.597-60.807-46.589-98.887-55.069c-47.599-10.599-91.431,26.801-81.055,65.081c12.97,47.851,67.352,100.297,127.513,109.867c75.124,11.951,114.467-22.774,104.303-83.168C1157.241,204.574,1093.147,172.762,1000,155"/>
            <text rotate="180">
                <textpath id="path_01" startOffset="-2880" xlink:href="#base_01"><tspan>uzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzu</tspan>
                </textpath>
            </text>
        </svg>
    </li>
    <li>
        <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1800 1250">
            <path id="base_02" class="base" d="M191.9,20c-54.7,38.6-76.6,114.3-76.6,114.3c-7.5,55.6-24.5,78.7-39.1,103.3s-106.3,61.8-28.3,214.2 s230.2,86,230.2,86s34.7-7.5,60.9-49.8"/>
            <text rotate="180">
                <textpath id="path_02" startOffset="-2880" xlink:href="#base_02"><tspan>uzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzuzu</tspan>
                </textpath>
            </text>
        </svg>
    </li>
</ul>
//スライダー
$(document).ready(function(){
  $('#slider').slick();
});

var stop = 0;
var not_count = -2880;
var id_01 = document.getElementById("path_01");
var count_01 = id_01.getAttribute("startOffset");
var id_02 = document.getElementById("path_02");
var count_02 = id_02.getAttribute("startOffset");

//SVGアニメーションの初期化
$('#slider').on('beforeChange', function(event, slick, currentSlide, nextSlide){
    id_01.setAttribute("startOffset", "-2880");
    id_02.setAttribute("startOffset", "-2880");
});

//SVGアニメーションの発火
$('#slider').on('afterChange', function(event, slick, currentSlide){
    setInterval(function(){
        id_01.setAttribute("startOffset", 2*count_01++);
        id_02.setAttribute("startOffset", 2*count_02++);
    },1);
});

参考にしたサイト

https://tr.you84815.space/slick/events/afterChange.html

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

setIntervalを使ったSVGアニメーションはメモリをかなり圧迫するので、
requestAnimationFrameを使うのが良いと思います。

setIntervalだとブラウザがフリーズしました…

ついでに描画回数が300回超えたらアニメーションを止める記述も入っています。

もっとスマートに書けそうですし完全ではないと思いますが、
こんな感じかなと思います。

スライドが増える事も考えればデータを配列に入れておいて、
ループで処理する等も考えた方がよいでしょうね。

$(document).ready(function () {
    $('#slider').slick();
});

var id_01 = document.getElementById('path_01'),
    id_02 = document.getElementById('path_02'),
    targetSvg,
    startOffset,
    animTime = 0,
    myReq;

var animate = (target) => {
    animTime += 1;
    targetSvg.setAttribute('startOffset', startOffset + animTime);
    if (animTime <= 300) {
        myReq = requestAnimationFrame(animate);
    }
};

$('#slider').on('beforeChange', function (event, slick, currentSlide, nextSlide) {
    cancelAnimationFrame(myReq);

    if (currentSlide === 0) {
        targetSvg = id_02;
        startOffset = -2150;
    } else if (currentSlide === 1) {
        targetSvg = id_01;
        startOffset = -1530;
    }
    targetSvg.setAttribute('startOffset', startOffset);

    animTime = 0;

});

$('#slider').on('afterChange', function (event, slick, currentSlide) {
    if (currentSlide + 1 === 1) {
        targetSvg = id_01;
    } else if (currentSlide + 1 === 2) {
        targetSvg = id_02;
    }
    animate(targetSvg);
});

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/27 09:28

    Lish様
    非常に助かりました。ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る