스페큘러 하이라이트

Specular highlight

광택 있는 표면에 빛이 반사되어 생기는 밝은 점. 유리·금속 재질감을 표현할 때 핵심 요소입니다.

다른 이름: GlareGlossy highlightLight streak
···
html
<div class="card" id="c"><span>Hover me</span></div>
css
.card{--x:50%;--y:25%;position:relative;width:min(260px,80%);aspect-ratio:16/10;border-radius:20px;
  background:linear-gradient(135deg,#2b2b3a,#15151f);overflow:hidden;display:grid;place-items:center;
  color:#fff;font-weight:600;letter-spacing:.02em;box-shadow:0 20px 50px rgba(0,0,0,.4);cursor:pointer}
.card::before{content:"";position:absolute;inset:0;
  background:radial-gradient(circle at var(--x) var(--y),rgba(255,255,255,.6),transparent 35%);mix-blend-mode:screen}
.card::after{content:"";position:absolute;inset:0;border-radius:inherit;box-shadow:inset 0 1px 0 rgba(255,255,255,.25)}
js
const card = document.getElementById('c');
let auto = true, t = 0;
function setPos(x, y) { card.style.setProperty('--x', x + '%'); card.style.setProperty('--y', y + '%'); }
function loop() {
  if (auto) { t += 0.01; setPos(50 + Math.sin(t) * 38, 30 + Math.cos(t * 1.4) * 24); }
  requestAnimationFrame(loop);
}
loop();
card.addEventListener('pointermove', (e) => {
  auto = false;
  const r = card.getBoundingClientRect();
  setPos(((e.clientX - r.left) / r.width) * 100, ((e.clientY - r.top) / r.height) * 100);
});
card.addEventListener('pointerleave', () => { auto = true; });

물리적으로는 빛의 입사각과 시점 각도가 거의 일치하는 지점에서 강하게 나타나는 반사(정반사)입니다. 디자인에서는 radial-gradient 로 작은 흰 점을 표면 위에 얹어 흉내 냅니다.

포인터 위치나 기기 자이로에 맞춰 하이라이트 위치를 실시간으로 옮기면 표면이 진짜 곡면처럼 반응하는 느낌을 줍니다. 리퀴드 글래스, 홀로그래픽 카드가 이 기법을 기반으로 합니다.

데모 카드를 마우스로 움직여 보세요 — 하이라이트가 따라옵니다. 가만히 두면 자동으로 천천히 돕니다.

언제 쓰나

버튼·카드에 은은하게 얹으면 클릭 가능함을 암시하는 신호(어포던스)로도 작동합니다. 과하면 촌스러워 보이니 불투명도를 낮게 유지하세요.