パーツ番号 09-12-10 ・ JavaScript使用
ベルアイコン集約通知バッジ
送信ボタンをクリックすると通知カードがベルアイコンに向かって吸い込まれるように消え、バッジの件数が増えていく演出です。ヘッダーの通知ベルに新着数を集約表示したいWordPressサイトのUIに応用できます。
プレビュー
ソースコード
HTML
<div class="stage09-12-10">
<div class="bellwrap09-12-10">
<button type="button" class="bellbtn09-12-10" aria-label="通知ベル">
<svg viewBox="0 0 24 24" width="26" height="26" fill="none" stroke="#374151" stroke-width="1.8"><path d="M6 10a6 6 0 0 1 12 0c0 5 2 6 2 6H4s2-1 2-6z"/><path d="M10 20a2 2 0 0 0 4 0"/></svg>
<span class="badge09-12-10">0</span>
</button>
<button type="button" class="sendbtn09-12-10">+ 通知を送る</button>
</div>
</div>CSS
.d09-12-10{ background:#f4f5fb; }
.d09-12-10 .stage09-12-10{ position:absolute; inset:0; overflow:hidden; }
.d09-12-10 .bellwrap09-12-10{ position:absolute; right:20px; top:16px; display:flex; flex-direction:column; align-items:center; gap:10px; }
.d09-12-10 .bellbtn09-12-10{
position:relative; width:46px; height:46px; border-radius:50%; border:none;
background:#fff; box-shadow:0 6px 16px rgba(20,30,50,.14); cursor:default;
display:flex; align-items:center; justify-content:center;
}
.d09-12-10 .bellbtn09-12-10.shake09-12-10{ animation:shake09-12-10 .5s ease; }
@keyframes shake09-12-10{
0%,100%{ transform:rotate(0); } 20%{ transform:rotate(-14deg); } 40%{ transform:rotate(12deg); } 60%{ transform:rotate(-8deg); } 80%{ transform:rotate(6deg); }
}
.d09-12-10 .badge09-12-10{
position:absolute; top:-4px; right:-4px; min-width:18px; height:18px; padding:0 4px;
border-radius:99px; background:#dc2626; color:#fff; font-size:10px; font-weight:800;
display:flex; align-items:center; justify-content:center; transform:scale(1);
transition:transform .25s cubic-bezier(.34,1.56,.64,1);
}
.d09-12-10 .badge09-12-10.pop09-12-10{ transform:scale(1.35); }
.d09-12-10 .sendbtn09-12-10{
border:1px dashed #c7cbe0; background:#fff; color:#4f46e5; font-size:10.5px; font-weight:700;
padding:6px 12px; border-radius:99px; cursor:pointer;
}
.d09-12-10 .sendbtn09-12-10:hover{ background:#eef2ff; }
.d09-12-10 .fly09-12-10{
position:absolute; left:20px; top:20px; max-width:180px;
background:#fff; border-radius:9px; padding:8px 10px; font-size:10.5px; color:#2b3444;
box-shadow:0 8px 18px rgba(20,30,50,.16);
transition:transform .55s cubic-bezier(.5,0,.75,0), opacity .55s ease;
}
.d09-12-10 .fly09-12-10.go09-12-10{ transform:translate(150px,-4px) scale(.2); opacity:0; }JavaScript
(function(){
var root = document.currentScript.closest('.item').querySelector('.d09-12-10');
var stage = root.querySelector('.stage09-12-10');
var bell = root.querySelector('.bellbtn09-12-10');
var badge = root.querySelector('.badge09-12-10');
var sendBtn = root.querySelector('.sendbtn09-12-10');
var msgs = ['新着コメント','いいねが届きました','新しいフォロワー','メッセージが届きました'];
var count = 0;
var mi = 0;
function send(){
var el = document.createElement('div');
el.className = 'fly09-12-10';
el.textContent = msgs[mi % msgs.length];
mi++;
stage.appendChild(el);
requestAnimationFrame(function(){
requestAnimationFrame(function(){ el.classList.add('go09-12-10'); });
});
setTimeout(function(){
if(el.parentNode){ el.parentNode.removeChild(el); }
count++;
badge.textContent = count > 9 ? '9+' : String(count);
badge.classList.add('pop09-12-10');
bell.classList.add('shake09-12-10');
setTimeout(function(){ badge.classList.remove('pop09-12-10'); bell.classList.remove('shake09-12-10'); }, 500);
}, 600);
}
sendBtn.addEventListener('click', send);
setInterval(send, 2600);
})();クラス名 .d09-12-10 は本ライブラリ内での識別用です。複数のパーツを同じページで使う場合は、重複しないよう名前を変更してください。