パーツ番号 06-04-01 ・ JavaScript使用
いいね数カウントアップ演出
ハートをクリックすると数字が+1され、ハートが弾んで小さなハートが飛び散る。ブログやSNS埋め込みの「いいねボタン」に。
プレビュー
ソースコード
HTML
<div class="d06-04-01-wrap">
<button class="d06-04-01-heart" type="button" aria-label="いいね">
<svg viewBox="0 0 24 24" width="36" height="36"><path d="M12 21s-7.5-4.6-10-9.1C0.5 8.5 2 5 5.5 5c2 0 3.5 1.2 4.5 2.6C11 6.2 12.5 5 14.5 5 18 5 19.5 8.5 18 11.9 15.5 16.4 12 21 12 21z"/></svg>
</button>
<span class="d06-04-01-count">128</span>
<span class="d06-04-01-label">いいね</span>
</div>CSS
.d06-04-01-wrap { display:flex; flex-direction:column; align-items:center; gap:6px; position:relative; }
.d06-04-01-heart { position:relative; border:none; background:none; cursor:pointer; padding:8px; color:#9ca3af; line-height:0; }
.d06-04-01-heart svg { fill:currentColor; transition:color .2s; }
.d06-04-01-heart.d06-04-01-liked { color:#f43f5e; }
.d06-04-01-heart.d06-04-01-pop { animation:d531pop .4s ease; }
@keyframes d531pop { 0%{transform:scale(1);} 35%{transform:scale(1.35);} 100%{transform:scale(1);} }
.d06-04-01-count { font-size:20px; font-weight:700; color:#1f2937; }
.d06-04-01-label { font-size:12px; color:#9ca3af; }
.d06-04-01-particle { position:absolute; width:10px; height:10px; color:#f43f5e; pointer-events:none; animation:d531fly .8s ease-out forwards; }
.d06-04-01-particle::before { content:"♥"; font-size:12px; }
@keyframes d531fly { to { transform:translate(var(--d06-04-01-x), var(--d06-04-01-y)) scale(.3); opacity:0; } }JavaScript
(function(){
var article = document.currentScript.closest('article');
var root = article.querySelector('.d06-04-01');
var btn = root.querySelector('.d06-04-01-heart');
var countEl = root.querySelector('.d06-04-01-count');
var wrap = root.querySelector('.d06-04-01-wrap');
var count = 128;
var liked = false;
btn.addEventListener('click', function(){
liked = !liked;
count += liked ? 1 : -1;
countEl.textContent = count;
btn.classList.remove('d06-04-01-pop');
void btn.offsetWidth;
btn.classList.add('d06-04-01-pop');
btn.classList.toggle('d06-04-01-liked', liked);
if(liked){ spawnParticles(); }
});
function spawnParticles(){
for(var i=0;i<6;i++){
var p = document.createElement('span');
p.className = 'd06-04-01-particle';
var angle = Math.random()*100-50;
var dist = 28+Math.random()*22;
p.style.setProperty('--d06-04-01-x', (Math.sin(angle*Math.PI/180)*dist)+'px');
p.style.setProperty('--d06-04-01-y', (-dist-Math.random()*18)+'px');
p.style.left = '46%';
p.style.top = '4px';
wrap.appendChild(p);
p.addEventListener('animationend', function(){ this.remove(); });
}
}
})();クラス名 .d06-04-01 は本ライブラリ内での識別用です。複数のパーツを同じページで使う場合は、重複しないよう名前を変更してください。