BLOG ブログ


2025.12.03 TECH

枯れ木に花を咲かす@svg+textPath+animate

前置き(意味なさげ…)

表題の通り本記事は『花咲かじいさん』に関する技術ブログです
AI (artificial intelligence さん)に聞いてみると
『親切な老夫婦と欲張りな隣人夫婦が不思議な力を持つ犬のシロを介して幸運と不幸に見舞われる教訓的な日本昔話』だそうです
人・物を思いやる心は大事!欲張ることは不幸を招く!という勧善懲悪の教訓を伝えている童話ですが仕事やSEO の上でも相通じるものがありそうですね٩(๑❛ᴗ❛๑)۶

では早速『親切な老夫婦』の生い立ちから掘り下げたいと思いま・・・・・・・

唐突に本題(こっちが本当の前置き…)

私の過去記事を見返してみると結構な割合で【svg】関係の記事があります
元々【html・css】を1行も書けなかったのに『Flash が好き!』という理由だけでこの業界に入ったので動くモノには目がない・ベクターデータ最高!ということもありますが昔から存在していて高性能な技術でありながら軽視されているような気がして…コツコツと布教活動をしているからですw
とても奥が深く幅が広く様々な表現方法が可能になるモノなのですが…如何せん私が愛した『Flash』が某巨大企業CEO の発言をキッカケに絶滅へ追いやられてからは『javascriptライブラリ』などの台頭により手軽に動的パーツ・インタラクティブサイトが作れるようになったおかげもあり益々影が薄くなった印象です…
まぁもちろん流行り廃りに左右されやすい業界ということもありますね
※あくまでも個人的意見だらけです

まずは🌳を植えます(壁掛け風)

まず手始めに【svg+textPath+animate】を使用して🌳を植えます

【css】を覗いていただければ分かりますが『動き』に関する記述はありません
もちろん【javascript】の記述もありません
このウネウネとした少しだけワクワクする『動き』自体は【html】のみで完結しています…というか【svg】だけで完結しているというのが正しいですね(`・ω・´)シャキーン
更にこのウネウネはただの『線』ではなく🌳の質感(ゴツゴツした感じ)を出すために『文字』で作られています (超拡大するかソースを読み解いてみてください)…何か気の利いた文章でも書こうと思ったのですが結構な文章量になることと元々壊滅的に私に文才がないこともあり、なんとなく敗北感はありますが一番手近にある【css】を記述しました
まぁそのせいでソースを読む際に軽~く混乱するというお粗末さです( ꒪⌓꒪)

技術的にはとてもシンプルです
【svg】にて書いたパスに沿ってテキストをアニメーションさせるってだけです
実際に使用している下記ソースでサラっと解説します

div(class='🌳')
  svg(viewBox=`0 0 960 860`)
    path(id=`branch01` d=`M 231 527 C 231 527 221 491 176 486 C 131 481 -5 490 -5 490 `)
    text
      textPath(xlink:href=`#branch01` startOffset='500px') ここに表示させるテキストを入力
        animate(attributeName=`startOffset` from=`500px` to=`0px` dur=`4s` begin=`2s` fill=`freeze`)

まず世の中のマークアッパーの多くが【svg】を使用するのは画像表示の代替として【グラフィック表示】する時かなって思います…企業ロゴだったりアイコン・ピクトグラムだったりを表示することがメインになっている気がします
画像を使用するよりもメリットが多いのが理由ですね…下記過去記事参照
アイコン色をフワっと可変させる件@svg-css:hover
ようするにマークアップを生業としている方々でも『svg自体どのようなことが出来るの?』って感じている方が絶対数いる気がするのでそれなりに詳細解説していきます

  • 2行目:
    svg 表示エリアの位置・大きさを定義しています
  • 3行目:
    svg 形状を定義しています…直線・曲線はもちろん二次ベジェ曲線・円弧といった複雑な形状も描画可能
  • 5行目:
    svg パスに沿って表示するテキストを定義しています…下記過去記事参照
    css@テキストを丸くレイアウト
  • 6行目:
    svg パス に沿って表示するテキストの動きを定義しています
    上記の記述だと『2秒後に 500pxの位置から 0pxの位置まで 4秒かけて動かして止まれ!』という記述をしています

解説は上記の通りです
ポイントとなるのは 6行目の【animate】ですね!
【css・javascript】を記述することなく独自でアニメーション設定をすることが出来るのが【svg】の大きな特徴・優れているところです!
今回は【startOffset】の値を可変させることでテキストを動かしているだけですが【attributeName】の指定次第でイロイロな要素をアニメーションすることが可能です
とても面白いので是非とも svgの沼にハマってみてください!

続いて🌸を咲かせます(壁に高級感を出したw)

上記を同僚に見ていただいたところ『ドラマチック性がないっ!』とダメ出しを受けたので…安直ではありますが【css+animation】を使用して🌸を咲かせてみました

まず🌳を植えるではなく🌳が生える 感を出すために幹・枝の動きを逆にしました…個人的にはとっても生えた感が出たように感じます
続いて🌸を咲かせるワケですが
まず花びらをどうやって表示するか問題ですが当初は『svgに関する記事なのだから当然 svgでしょ!』と思っていたのですが拡張性・コントロール性・ソース自体の可読性などなどを考慮した結果…絵文字をチョイスしましたw
決して手抜きではありません…熟考した結果です٩(๑❛ᴗ❛๑)۶

html (実際は pug)

まず【html】は見ての通りですね
前述・宣言した通り絵文字の『🌸』を350個ほどズラズラ~っと表示させているだけです

ul(class='🌸')
  - for (var x = 0; x < 350; x++)
    li 🌸

css (実際は scss)

最終的に使用した【css】に関しては下記の通りです(該当部分のみ)
まず🌸を表示させる位置を設定します
当初は幹・枝を絵画した【svg】のパスに【textPath:xlink:href】を使って【startOffset】にて位置調整をする想定でした
※1つのsvg パスに対して複数のテキスト表示設定できます
ですが…この方法だと🌸が綺麗に並びすぎて物凄く不自然なモノになりました><
それで熟考に熟考を重ねた結果…1つ1つの🌸全てを【position:absolute】で浮揚要素にして絶対位置指定する…というクラシカルかつ工数肥大な方法に…そう350個分全部コツコツと( ꒪⌓꒪)

.🌸{
  list-style:none;
  li{
    position:absolute;
    opacity:0;
    text-shadow:1px 1px 12px #fff;
    &:nth-child(1){ // 本来は350個指定してます
      top:106px;
      left:312px;
    }
    @for $i from 0 to 350{
      &:nth-child(#{$i + 1}){
        font-size:#{($i * .05) + 16}px;
        transform:rotate(#{$i * 3}deg);
        animation:🌸 3s ease #{($i * .05) + 11}s forwards;
      }
    }
  }
}
@keyframes 🌸{
  0%{opacity:0}
  100%{opacity:.6}
}
  • 表示位置:
    前述した通り4行目で浮揚要素にして8・9行目で絶対位置指定しています
    ※本来はこの位置指定は350個分あります…
  • 大きさ
    🌸の表示は前述した通りただのテキストなので13行目【font-size】にて大きさを設定しています…変数【$i】を使って大きさを調整しています
  • 表示角度:
    🌸の角度(向き)が同じだと不自然この上なかったので14行目【transform:rotate()】にて角度を設定しています…変数【$i】を使って角度を調整しています
  • 表示方法:
    15・20行目でアニメーション(表示方法)を設定しています…変数【$i】を使って表示タイミングを調整しています

解説は上記の通りです
強烈に時間はかかりましたが大したことはしていませんねw

まとめ

いかがでしょうか
あまり世に広まっていない気がする【svg+animate】ですがアイディア次第でかなり広範囲に使える面白い技術だと思います
ん?逆かしら…面白い技術だから良いアイディアが生まれる可能性があるのか…
まぁ兎にも角にも動きだったり見た目的なインパクトは結構あるのでイロイロと使えるはずです

で…本来ならこの辺りで技術的なことではなく精神論的なことをズラズラと書くところですが…
🌳は🌸が咲いたら終わりでしょうか…いえ
散りぬべき 時知りてこそ 世の中の 花も花なれ 人も人なれ
🌸は散ってこそ儚く美しいのでは?
ってことで次回は今回咲かせた🌸を見事散らせてみせましょう٩(๑❛ᴗ❛๑)۶


一覧に戻る


LATEST ARTICLE 最新の記事

CATEGORY カテゴリー