プリズムで分光するグラデPrism Refraction
/* 物語: 白い光線が走り込む → プリズムに当たって内側が灯り、ガラスが潰れて弾む →
分光した虹の扇が開いてゆっくり漂う → 収束してループ */
.cg-gr-prism {
position: relative;
width: 320px;
height: 180px;
overflow: hidden;
border-radius: 14px;
background: radial-gradient(120% 140% at 14% 18%, #1E2440 0%, #0B0E1B 72%);
isolation: isolate;
}
/* ①入射光。左から一気に伸びて、通過後は余韻として細く残る */
.cg-gr-prism-beam {
position: absolute;
left: -18%;
top: 46%;
width: 64%;
height: 5px;
border-radius: 3px;
transform-origin: 0 50%;
transform: rotate(-16deg) scaleX(0);
background: linear-gradient(90deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, .85) 62%, #FFFFFF);
box-shadow: 0 0 14px rgba(190, 215, 255, .7);
animation: cg-gr-prism-beam 5.4s cubic-bezier(.2, .9, .3, 1) infinite;
}
/* ②分光した扇。conicで虹の帯を作り、開き角と広がりを揺らす */
.cg-gr-prism-fan {
position: absolute;
left: 47%;
top: 50%;
width: 300px;
height: 300px;
margin-top: -150px;
transform-origin: 0 50%;
transform: rotate(7deg) scaleX(.18);
opacity: 0;
background: conic-gradient(from -15deg at 0 50%,
rgba(255, 70, 90, 0) 0deg,
rgba(255, 70, 90, .85) 4deg,
rgba(255, 168, 40, .85) 9deg,
rgba(248, 232, 74, .85) 14deg,
rgba(70, 220, 148, .8) 19deg,
rgba(72, 168, 255, .85) 24deg,
rgba(154, 92, 255, .8) 29deg,
rgba(154, 92, 255, 0) 34deg);
filter: blur(7px);
mix-blend-mode: screen;
animation: cg-gr-prism-fan 5.4s cubic-bezier(.34, 1.56, .64, 1) infinite;
}
/* ③プリズム本体。着弾の瞬間だけ潰れて、戻りで少し伸びる */
.cg-gr-prism-glass {
position: absolute;
left: 40%;
top: 50%;
width: 62px;
height: 56px;
margin-top: -28px;
clip-path: polygon(50% 0, 100% 100%, 0 100%);
background: linear-gradient(150deg, rgba(255, 255, 255, .34), rgba(255, 255, 255, .05) 46%, rgba(150, 195, 255, .26));
animation: cg-gr-prism-glass 5.4s cubic-bezier(.34, 1.56, .64, 1) infinite;
}
/* ④副次レイヤー: 通過の瞬間に内側が灯り、余韻がじわりと残る */
.cg-gr-prism-glass::after {
content: "";
position: absolute;
inset: 0;
clip-path: polygon(50% 0, 100% 100%, 0 100%);
background: radial-gradient(62% 52% at 50% 80%, rgba(255, 255, 255, .95), rgba(255, 255, 255, 0) 72%);
opacity: 0;
animation: cg-gr-prism-flash 5.4s ease-out infinite;
}
@keyframes cg-gr-prism-beam {
0% { transform: rotate(-16deg) scaleX(0); opacity: 0; }
7% { transform: rotate(-16deg) scaleX(.3); opacity: 1; }
24% { transform: rotate(-16deg) scaleX(1); opacity: 1; }
36% { transform: rotate(-16deg) scaleX(1); opacity: .8; }
72% { transform: rotate(-16deg) scaleX(1); opacity: .45; }
90% { transform: rotate(-16deg) scaleX(1); opacity: 0; }
100% { transform: rotate(-16deg) scaleX(0); opacity: 0; }
}
@keyframes cg-gr-prism-fan {
0%, 23% { transform: rotate(7deg) scaleX(.18); opacity: 0; }
32% { transform: rotate(1deg) scaleX(1.08); opacity: .95; }
41% { transform: rotate(-1deg) scaleX(.94); opacity: .9; }
54% { transform: rotate(0deg) scaleX(1.02); opacity: .82; }
74% { transform: rotate(2deg) scaleX(1); opacity: .62; }
90% { transform: rotate(5deg) scaleX(.5); opacity: 0; }
100% { transform: rotate(7deg) scaleX(.18); opacity: 0; }
}
@keyframes cg-gr-prism-glass {
0%, 23% { transform: scale(1, 1) rotate(0deg); }
28% { transform: scale(1.12, .86) rotate(-2.5deg); }
36% { transform: scale(.95, 1.07) rotate(1.4deg); }
44% { transform: scale(1.03, .98) rotate(-.5deg); }
52%, 100% { transform: scale(1, 1) rotate(0deg); }
}
@keyframes cg-gr-prism-flash {
0%, 23% { opacity: 0; }
29% { opacity: 1; }
46% { opacity: .4; }
74% { opacity: .2; }
100% { opacity: 0; }
}
@media (prefers-reduced-motion: reduce) {
/* 静止形: 光がプリズムを抜けて虹が開いた「分光の一枚絵」として成立させる */
.cg-gr-prism-beam,
.cg-gr-prism-fan,
.cg-gr-prism-glass,
.cg-gr-prism-glass::after { animation: none; }
.cg-gr-prism-beam { transform: rotate(-16deg) scaleX(1); opacity: 1; }
.cg-gr-prism-fan { transform: rotate(0deg) scaleX(1); opacity: .85; }
.cg-gr-prism-glass { transform: none; }
.cg-gr-prism-glass::after { opacity: .55; }
}
<div class="cg-gr-prism" role="img" aria-label="プリズムで白い光が虹に分かれるグラデーション"><span class="cg-gr-prism-beam"></span><span class="cg-gr-prism-fan"></span><span class="cg-gr-prism-glass"></span></div>