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

パーツ番号 06-11-08 ・ JavaScript使用

並び替えで再配置されるコメント欄

「新着順」「人気順」タブを切り替えるとコメントリストがふわっと再配置される。まとめ記事やレビュー一覧のソート機能に使える。

js

プレビュー

ソースコード

HTML

<div class="d06-11-08-wrap">
          <div class="d06-11-08-tabs">
            <button class="d06-11-08-tab d06-11-08-active" type="button" data-sort="new">新着順</button>
            <button class="d06-11-08-tab" type="button" data-sort="pop">人気順</button>
          </div>
          <ul class="d06-11-08-list">
            <li data-likes="2" data-order="1"><span class="d06-11-08-name">あい</span><p>いいね記事!</p><span class="d06-11-08-likes">♥ 2</span></li>
            <li data-likes="8" data-order="2"><span class="d06-11-08-name">だいき</span><p>すごく勉強になりました</p><span class="d06-11-08-likes">♥ 8</span></li>
            <li data-likes="1" data-order="3"><span class="d06-11-08-name">ゆま</span><p>次も期待してます</p><span class="d06-11-08-likes">♥ 1</span></li>
            <li data-likes="5" data-order="4"><span class="d06-11-08-name">こうた</span><p>共感します</p><span class="d06-11-08-likes">♥ 5</span></li>
          </ul>
        </div>

CSS

.d06-11-08-wrap{width:100%;max-width:260px;display:flex;flex-direction:column;gap:8px}
        .d06-11-08-tabs{display:flex;gap:6px}
        .d06-11-08-tab{border:1px solid #e5e7eb;background:#fff;color:#6b7280;font-size:11px;font-weight:700;border-radius:999px;padding:5px 12px;cursor:pointer}
        .d06-11-08-tab.d06-11-08-active{background:#6366f1;border-color:#6366f1;color:#fff}
        .d06-11-08-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px;max-height:150px;overflow-y:auto}
        .d06-11-08-list li{background:#f8fafc;border-radius:8px;padding:6px 10px;display:flex;flex-direction:column}
        .d06-11-08-list li.d06-11-08-move{animation:d1308swap .35s ease}
        @keyframes d1308swap{from{opacity:.2;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}
        .d06-11-08-name{font-size:11px;font-weight:700;color:#374151}
        .d06-11-08-list p{margin:2px 0;font-size:12px;color:#4b5563}
        .d06-11-08-likes{font-size:10px;color:#f43f5e;align-self:flex-end}

JavaScript

(function(){
          var article = document.currentScript.closest('article');
          var root = article.querySelector('.d06-11-08');
          var tabs = root.querySelectorAll('.d06-11-08-tab');
          var list = root.querySelector('.d06-11-08-list');
          tabs.forEach(function(tab){
            tab.addEventListener('click', function(){
              tabs.forEach(function(t){ t.classList.remove('d06-11-08-active'); });
              tab.classList.add('d06-11-08-active');
              var mode = tab.getAttribute('data-sort');
              var items = Array.prototype.slice.call(list.children);
              items.sort(function(a, b){
                if(mode === 'pop'){
                  return parseInt(b.getAttribute('data-likes'), 10) - parseInt(a.getAttribute('data-likes'), 10);
                }
                return parseInt(a.getAttribute('data-order'), 10) - parseInt(b.getAttribute('data-order'), 10);
              });
              items.forEach(function(li){
                li.classList.remove('d06-11-08-move');
                void li.offsetWidth;
                li.classList.add('d06-11-08-move');
                list.appendChild(li);
              });
            });
          });
        })();

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