박스 리플렉트

Box reflect

-webkit-box-reflect 한 줄이면 요소의 반사상을 자동으로 그려주지만 WebKit/Blink 전용입니다. 표준 대안은 요소를 복제해 scaleY(-1) + mask-image 로 직접 만드는 것.

다른 이름: -webkit-box-reflectMirror reflection
···
html
<div class="pair">
  <div class="item"><div class="card reflect">A</div><span class="cap">-webkit-box-reflect</span></div>
  <div class="item"><div class="fallback-wrap"><div class="card">B</div><div class="card fallback-copy" aria-hidden="true">B</div></div><span class="cap">scaleY(-1) + mask-image</span></div>
</div>
css
.pair{display:flex;gap:16%}
.item{display:flex;flex-direction:column;align-items:center;gap:46px}
.card{position:relative;width:20vmin;max-width:88px;aspect-ratio:3/4;border-radius:10px;overflow:hidden;
  background:linear-gradient(135deg,#5b5bf7,#18c29c);display:grid;place-items:center;color:#fff;font:800 22px/1 sans-serif}
.card::after{content:'';position:absolute;inset:0;background:linear-gradient(115deg,transparent 30%,rgba(255,255,255,.55) 50%,transparent 70%);
  transform:translateX(-120%);animation:sweep 2.4s ease-in-out infinite}
@keyframes sweep{to{transform:translateX(120%)}}
.reflect{-webkit-box-reflect:below 6px linear-gradient(transparent 40%,rgba(255,255,255,.35))}
.fallback-wrap{position:relative}
.fallback-copy{position:absolute;left:0;top:calc(100% + 6px);transform:scaleY(-1);
  -webkit-mask-image:linear-gradient(to bottom,rgba(0,0,0,.35) 0%,transparent 60%);
  mask-image:linear-gradient(to bottom,rgba(0,0,0,.35) 0%,transparent 60%);pointer-events:none}
.cap{font:600 11px/1.3 monospace;color:var(--muted);text-align:center}

-webkit-box-reflect: <방향> <간격> <마스크 그라데이션> 은 요소를 마크업 추가 없이 지정한 방향(below·above·left·right)으로 뒤집어 그려주고, 마스크로 점점 옅어지게 만듭니다. 다만 이름 그대로 WebKit 계열(Chrome·Edge·Safari) 전용이고 표준화된 적이 없어 Firefox 에는 아예 렌더링되지 않습니다.

표준만으로 같은 결과를 내려면 요소를 하나 더 복제해서 transform: scaleY(-1) 로 뒤집고, mask-image(또는 구형 Safari 대응용 -webkit-mask-image) 그라데이션으로 아래로 갈수록 투명해지게 만듭니다. 코드는 더 길지만 모든 브라우저에서 동작합니다.

반사상은 원본을 그대로 다시 그린 것이라, 원본에 자체 애니메이션(이 데모의 반짝임 스윕 같은)이 있다면 반사상에도 그대로 나타나 렌더 비용이 두 배가 됩니다. 무거운 원본을 반사시킬 땐 이 점을 염두에 두세요. box-reflect 도 filter·transform 처럼 별도 컴포지팅 레이어를 만듭니다.

언제 쓰나

Chromium/Safari 만 타겟이면 -webkit-box-reflect 한 줄로 끝내고, Firefox 지원이 필요하면 복제+scaleY(-1)+mask-image 대안을 준비하세요.