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

パーツ番号 09-12-02 ・ JavaScript使用

積み重なるトーストスタック

複数の通知が右下に次々と積み重なるトーストスタック演出です。コメント投稿や在庫更新など複数のイベントが連続するWordPress管理画面風UIやライブ通知欄に向いています。

js

プレビュー

ソースコード

HTML

<div class="stage09-12-02">
          <div class="stack09-12-02"></div>
        </div>

CSS

.d09-12-02{ background:#f5f6fa; }
        .d09-12-02 .stage09-12-02{ position:absolute; inset:0; overflow:hidden; }
        .d09-12-02 .stack09-12-02{
          position:absolute; right:14px; bottom:14px; width:206px;
          display:flex; flex-direction:column-reverse; gap:8px;
        }
        .d09-12-02 .card09-12-02{
          background:#fff; border-radius:10px; padding:10px 12px;
          box-shadow:0 8px 20px rgba(20,30,50,.16);
          font-size:11.5px; color:#2b3444; border-left:3px solid #6366f1;
          opacity:0; transform:translateY(10px) scale(.96);
          transition:opacity .35s ease, transform .35s ease, max-height .35s ease;
          max-height:60px;
        }
        .d09-12-02 .card09-12-02.show09-12-02{ opacity:1; transform:translateY(0) scale(1); }
        .d09-12-02 .card09-12-02.hide09-12-02{ opacity:0; transform:translateX(30px); max-height:0; padding-top:0; padding-bottom:0; margin-top:-8px; overflow:hidden; }

JavaScript

(function(){
        var root = document.currentScript.closest('.item').querySelector('.d09-12-02');
        var stack = root.querySelector('.stack09-12-02');
        var msgs = ['新しいコメントが届きました','注文が確定しました','在庫が更新されました','タスクが完了しました','新規メンバーが参加しました'];
        var i = 0;
        function spawn(){
          var el = document.createElement('div');
          el.className = 'card09-12-02';
          el.textContent = msgs[i % msgs.length];
          i++;
          stack.insertBefore(el, stack.firstChild);
          while(stack.children.length > 3){ stack.removeChild(stack.lastChild); }
          requestAnimationFrame(function(){
            requestAnimationFrame(function(){ el.classList.add('show09-12-02'); });
          });
          setTimeout(function(){
            el.classList.add('hide09-12-02');
            el.classList.remove('show09-12-02');
            setTimeout(function(){ if(el.parentNode){ el.parentNode.removeChild(el); } }, 400);
          }, 3200);
        }
        spawn();
        setInterval(spawn, 1500);
      })();

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