曇りが晴れるガラスThawing Frosted Glass
.cg-gs-thaw {
position: relative;
width: 250px;
height: 152px;
border-radius: 18px;
overflow: hidden;
background: #E9E7E0;
border: 1px solid rgba(255, 255, 255, .75);
animation: cg-gs-thaw-lift 6.4s cubic-bezier(.34, 1.56, .64, 1) infinite;
}
/* 曇っている状態(常に下に敷いてある) */
.cg-gs-thaw::before {
content: "";
position: absolute;
inset: -14%;
background:
linear-gradient(rgba(255, 255, 255, .52), rgba(255, 255, 255, .52)),
linear-gradient(135deg, #3A5A78 0%, #C89B6C 55%, #E8590C 100%);
filter: blur(11px) saturate(.72);
}
/* 晴れた窓: 中央から円が広がって曇りを拭き取る */
.cg-gs-thaw-clear {
position: absolute;
inset: 0;
background: linear-gradient(135deg, #3A5A78 0%, #C89B6C 55%, #E8590C 100%);
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .3);
clip-path: circle(0% at 50% 60%);
animation: cg-gs-thaw-open 6.4s cubic-bezier(.34, 1.56, .64, 1) infinite;
}
/* 晴れたあとに water が一筋だけ伝う */
.cg-gs-thaw-drop {
position: absolute;
left: 62%;
top: -18px;
width: 9px;
height: 12px;
border-radius: 60% 60% 70% 70% / 80% 80% 60% 60%;
background: rgba(255, 255, 255, .92);
box-shadow: 0 0 6px rgba(255, 255, 255, .8);
animation: cg-gs-thaw-drop 6.4s cubic-bezier(.55, .05, .65, 1) infinite;
}
.cg-gs-thaw-drop::before {
content: "";
position: absolute;
left: 3px;
bottom: 100%;
width: 3px;
height: 0;
background: linear-gradient(rgba(255, 255, 255, 0), rgba(255, 255, 255, .72));
animation: cg-gs-thaw-trail 6.4s cubic-bezier(.55, .05, .65, 1) infinite;
}
/* 完了ラベル: ばねで飛び出す */
.cg-gs-thaw-tag {
position: absolute;
left: 18px;
bottom: 16px;
padding: 6px 12px;
border-radius: 999px;
background: rgba(27, 26, 23, .82);
color: #F5F2EA;
font: 700 12px/1 "IBM Plex Mono", ui-monospace, monospace;
letter-spacing: .18em;
opacity: 0;
transform: translateY(12px) scale(.7);
animation: cg-gs-thaw-tag 6.4s cubic-bezier(.34, 1.56, .64, 1) infinite;
}
@keyframes cg-gs-thaw-open {
0%, 8% { clip-path: circle(0% at 50% 60%); }
40% { clip-path: circle(84% at 50% 60%); }
50%, 78% { clip-path: circle(75% at 50% 60%); }
92%, 100% { clip-path: circle(0% at 50% 60%); }
}
@keyframes cg-gs-thaw-drop {
0%, 42% { transform: translateY(0); opacity: 0; }
46% { opacity: .95; }
74% { transform: translateY(150px); opacity: .95; }
80%, 100% { transform: translateY(150px); opacity: 0; }
}
@keyframes cg-gs-thaw-trail {
0%, 44% { height: 0; opacity: 0; }
52% { opacity: .8; }
74% { height: 68px; opacity: .8; }
86%, 100% { height: 0; opacity: 0; }
}
@keyframes cg-gs-thaw-tag {
0%, 44% { opacity: 0; transform: translateY(12px) scale(.7); }
54% { opacity: 1; transform: translateY(0) scale(1.12); }
60%, 82% { opacity: 1; transform: translateY(0) scale(1); }
92%, 100% { opacity: 0; transform: translateY(12px) scale(.7); }
}
@keyframes cg-gs-thaw-lift {
0%, 30% { box-shadow: 0 20px 34px -20px rgba(27, 26, 23, .55), inset 0 1px 0 rgba(255, 255, 255, .85); }
55%, 80% { box-shadow: 0 28px 42px -22px rgba(58, 90, 120, .6), inset 0 1px 0 rgba(255, 255, 255, .95); }
100% { box-shadow: 0 20px 34px -20px rgba(27, 26, 23, .55), inset 0 1px 0 rgba(255, 255, 255, .85); }
}
@media (prefers-reduced-motion: reduce) {
.cg-gs-thaw,
.cg-gs-thaw-clear,
.cg-gs-thaw-drop,
.cg-gs-thaw-drop::before,
.cg-gs-thaw-tag { animation: none; }
.cg-gs-thaw { box-shadow: 0 20px 34px -20px rgba(27, 26, 23, .55), inset 0 1px 0 rgba(255, 255, 255, .85); }
.cg-gs-thaw-clear { clip-path: circle(75% at 50% 60%); }
.cg-gs-thaw-drop { opacity: 0; }
.cg-gs-thaw-tag { opacity: 1; transform: none; }
}
<div class="cg-gs-thaw" role="img" aria-label="曇りが中央から晴れていくガラスパネル"><span class="cg-gs-thaw-clear" aria-hidden="true"></span><span class="cg-gs-thaw-drop" aria-hidden="true"></span><span class="cg-gs-thaw-tag" aria-hidden="true">CLEAR</span></div>