ランク上昇バッジRank Up
/* 矢印が下から突き上げる→バッジが潰れて跳ね返る→粒が散り、遅れて光沢が抜ける。
3.6秒周期で「上がった瞬間」だけを繰り返す */
.cg-bd-rank {
position: relative;
display: inline-flex;
align-items: center;
gap: 7px;
padding: 7px 16px 7px 13px;
border-radius: 30px;
background: linear-gradient(135deg, #F2B707, #E8590C);
color: #fff;
font-size: 12px;
font-weight: 800;
letter-spacing: .1em;
box-shadow: 0 6px 16px -8px rgba(232, 89, 12, .9);
animation: cg-bd-rank-pop 3.6s cubic-bezier(.34, 1.56, .64, 1) infinite;
}
/* 上向き三角。窓の外へ抜けていく */
.cg-bd-rank-arrow {
width: 0;
height: 0;
border: 5px solid transparent;
border-bottom: 8px solid #fff;
animation: cg-bd-rank-arrow 3.6s cubic-bezier(.34, 1.56, .64, 1) infinite;
}
.cg-bd-rank-cap {
font-size: 10px;
opacity: .82;
}
.cg-bd-rank-num {
font-size: 14px;
font-weight: 900;
line-height: 1;
}
/* 弾ける粒(本体+疑似要素の2粒で左右に散らす) */
.cg-bd-rank-spark,
.cg-bd-rank-spark::after {
position: absolute;
top: 4px;
left: 12px;
width: 5px;
height: 5px;
border-radius: 1px;
background: #FFF3C4;
opacity: 0;
animation: cg-bd-rank-spark 3.6s cubic-bezier(.34, 1.56, .64, 1) infinite;
}
.cg-bd-rank-spark::after {
content: "";
top: 2px;
left: 6px;
width: 4px;
height: 4px;
animation-name: cg-bd-rank-spark2;
}
/* 光沢は本体の丸みで切り抜いてから走らせる */
.cg-bd-rank-sheen {
position: absolute;
inset: 0;
border-radius: inherit;
overflow: hidden;
pointer-events: none;
}
.cg-bd-rank-sheen::after {
content: "";
position: absolute;
top: -30%;
bottom: -30%;
left: 0;
width: 36%;
background: linear-gradient(90deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, .85), rgba(255, 255, 255, 0));
transform: translateX(-160%) skewX(-18deg);
animation: cg-bd-rank-sheen 3.6s ease-out infinite;
}
@keyframes cg-bd-rank-pop {
0%, 12% { transform: translateY(0) scale(1, 1); }
20% { transform: translateY(-3px) scale(1.1, .9); }
28% { transform: translateY(0) scale(.96, 1.06); }
36% { transform: translateY(0) scale(1.03, .98); }
46%, 100% { transform: translateY(0) scale(1, 1); }
}
@keyframes cg-bd-rank-arrow {
0% { transform: translateY(7px) scale(.6); opacity: 0; }
14% { transform: translateY(0) scale(1.25); opacity: 1; }
24% { transform: translateY(-1px) scale(1); opacity: 1; }
60% { transform: translateY(-2px) scale(1); opacity: 1; }
74% { transform: translateY(-10px) scale(.7); opacity: 0; }
100% { transform: translateY(7px) scale(.6); opacity: 0; }
}
@keyframes cg-bd-rank-spark {
0%, 16% { transform: translate(0, 0) rotate(0deg) scale(0); opacity: 0; }
26% { transform: translate(-6px, -7px) rotate(70deg) scale(1); opacity: 1; }
40% { transform: translate(-12px, -14px) rotate(160deg) scale(.35); opacity: 0; }
100% { transform: translate(-12px, -14px) rotate(160deg) scale(0); opacity: 0; }
}
@keyframes cg-bd-rank-spark2 {
0%, 18% { transform: translate(0, 0) rotate(0deg) scale(0); opacity: 0; }
30% { transform: translate(9px, -6px) rotate(-60deg) scale(1); opacity: 1; }
44% { transform: translate(17px, -12px) rotate(-150deg) scale(.35); opacity: 0; }
100% { transform: translate(17px, -12px) rotate(-150deg) scale(0); opacity: 0; }
}
@keyframes cg-bd-rank-sheen {
0%, 30% { transform: translateX(-160%) skewX(-18deg); opacity: 0; }
38% { opacity: .9; }
60% { transform: translateX(300%) skewX(-18deg); opacity: 0; }
100% { transform: translateX(300%) skewX(-18deg); opacity: 0; }
}
/* 静止形 = 昇格し終えたバッジ。矢印は上向きのまま残し、粒と光沢だけ消す */
@media (prefers-reduced-motion: reduce) {
.cg-bd-rank,
.cg-bd-rank-arrow,
.cg-bd-rank-spark,
.cg-bd-rank-spark::after,
.cg-bd-rank-sheen::after { animation: none; }
.cg-bd-rank { transform: none; }
.cg-bd-rank-arrow { transform: none; opacity: 1; }
.cg-bd-rank-spark, .cg-bd-rank-spark::after { display: none; }
.cg-bd-rank-sheen::after { opacity: 0; }
}
<span class="cg-bd-rank" role="status" aria-label="ランクが A に上がりました"><i class="cg-bd-rank-arrow" aria-hidden="true"></i><span class="cg-bd-rank-cap">RANK</span><b class="cg-bd-rank-num">A</b><i class="cg-bd-rank-spark" aria-hidden="true"></i><i class="cg-bd-rank-sheen" aria-hidden="true"></i></span>