← 動的パーツギャラリーへ戻る

パーツ番号 08-16-03 ・ JavaScript使用

歩行コマ送りキャラクタースクラブ

スクロール量を離散的な「コマ」に区切り、キャラクター風アイコンの手足を歩行フレームごとに切り替えながら左右に移動させる演出。WordPressのオンボーディングやステップ紹介の進行キャラとして使えます。

scrolljs

プレビュー

ソースコード

HTML

<div class="view08-16-03">
          <div class="track08-16-03"></div>
          <div class="char08-16-03">
            <div class="head08-16-03"></div>
            <div class="torso08-16-03"></div>
            <div class="armL08-16-03"></div>
            <div class="armR08-16-03"></div>
            <div class="legL08-16-03"></div>
            <div class="legR08-16-03"></div>
          </div>
          <div class="scr08-16-03">
            <div class="sp08-16-03">
              <span class="hint08-16-03">↓ 枠内をスクロール<br>スクロール量がキャラクターの歩数と位置になります</span>
            </div>
          </div>
        </div>

CSS

.d08-16-03{background:#fefce8;align-items:stretch;}
        .d08-16-03 .view08-16-03{
          position:relative;width:100%;height:212px;border-radius:12px;
          overflow:hidden;background:linear-gradient(180deg,#fef9c3,#fef3c7);
        }
        .d08-16-03 .track08-16-03{position:absolute;left:14px;right:14px;bottom:46px;height:3px;background:rgba(120,53,15,.25);border-radius:2px;}
        .d08-16-03 .char08-16-03{position:absolute;left:14px;bottom:48px;width:34px;height:64px;will-change:transform;}
        .d08-16-03 .head08-16-03{position:absolute;left:9px;top:0;width:16px;height:16px;border-radius:50%;background:#c2410c;}
        .d08-16-03 .torso08-16-03{position:absolute;left:11px;top:16px;width:12px;height:26px;border-radius:6px;background:#ea580c;}
        .d08-16-03 .armL08-16-03,.d08-16-03 .armR08-16-03{position:absolute;top:18px;left:17px;width:4px;height:20px;border-radius:2px;background:#c2410c;transform-origin:top center;will-change:transform;}
        .d08-16-03 .legL08-16-03,.d08-16-03 .legR08-16-03{position:absolute;top:40px;left:17px;width:4px;height:22px;border-radius:2px;background:#7c2d12;transform-origin:top center;will-change:transform;}
        .d08-16-03 .scr08-16-03{position:absolute;inset:0;overflow-y:auto;}
        .d08-16-03 .sp08-16-03{height:900px;padding:16px 18px 0;}
        .d08-16-03 .hint08-16-03{display:inline-block;font-size:11.5px;line-height:1.7;color:#78350f;background:rgba(255,255,255,.75);padding:8px 12px;border-radius:8px;}

JavaScript

(function(){
        var scr=document.querySelector('.d08-16-03 .scr08-16-03');
        if(!scr)return;
        var view=document.querySelector('.d08-16-03 .view08-16-03');
        var char=document.querySelector('.d08-16-03 .char08-16-03');
        var legL=document.querySelector('.d08-16-03 .legL08-16-03');
        var legR=document.querySelector('.d08-16-03 .legR08-16-03');
        var armL=document.querySelector('.d08-16-03 .armL08-16-03');
        var armR=document.querySelector('.d08-16-03 .armR08-16-03');
        function update(){
          var max=scr.scrollHeight-scr.clientHeight;
          var p=max>0?scr.scrollTop/max:0;
          var trackWidth=view.clientWidth-28-34;
          char.style.transform='translateX('+(p*Math.max(trackWidth,0))+'px)';
          var frame=Math.floor(p*24)%2;
          var bounce=frame===0?-3:0;
          char.style.marginTop=bounce+'px';
          var ang=frame===0?26:-26;
          legL.style.transform='rotate('+ang+'deg)';
          legR.style.transform='rotate('+(-ang)+'deg)';
          armL.style.transform='rotate('+(-ang)+'deg)';
          armR.style.transform='rotate('+ang+'deg)';
        }
        scr.addEventListener('scroll',update,{passive:true});
        update();
      })();

クラス名 .d08-16-03 は本ライブラリ内での識別用です。複数のパーツを同じページで使う場合は、重複しないよう名前を変更してください。