요소 확대(줌 투 엘리먼트)

Zoom to element

버튼이나 입력칸 하나를 기준으로 화면을 다시 잡아, 어디를 봐야 하는지 알려 줍니다.

다른 이름: Element zoom
···
html
<div class="stage" id="stage"><div class="interface" id="interface">
  <div class="top"><i></i><i></i><i></i><span>CONTROL PANEL</span></div>
  <div class="row target" data-name="Profile"><b>Profile</b><em>›</em></div>
  <div class="row target" data-name="Search"><b>Search field</b><em>⌕</em></div>
  <div class="row target" data-name="Save"><b>Save changes</b><em>↗</em></div>
</div><div class="pointer" id="pointer"></div><div class="tag" id="tag">SELECT A CONTROL</div></div>
css
.stage{position:absolute;inset:0;overflow:hidden;background:var(--bg);touch-action:none}
.interface{position:absolute;left:23%;top:13%;width:54%;padding:12px;background:var(--surface);border:1px solid var(--line);box-shadow:0 10px 26px #0002;transform:scale(1);transform-origin:50% 50%;transition:transform .65s cubic-bezier(.2,.75,.25,1),transform-origin .2s}
.top{height:26px;border-bottom:1px solid var(--line);font:8px ui-monospace,monospace;color:var(--muted);display:flex;align-items:center;gap:5px;padding-bottom:5px}
.top i{width:5px;height:5px;border-radius:50%;background:var(--line)}.top span{margin-left:auto}
.row{height:clamp(34px,8vh,56px);margin-top:8px;padding:0 10px;border:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;background:var(--bg);font:clamp(10px,2vw,14px) system-ui;cursor:pointer}
.row em{font-style:normal;font-size:18px;color:var(--accent)}
.row.active{outline:2px solid var(--accent);outline-offset:2px}
.pointer{position:absolute;width:12px;height:16px;background:var(--fg);clip-path:polygon(0 0,100% 70%,57% 76%,73% 100%,58% 100%,43% 78%,20% 94%);filter:drop-shadow(0 1px 1px #fff);transition:left .65s,top .65s;pointer-events:none}
.tag{position:absolute;left:12px;bottom:12px;padding:5px 8px;border:1px solid var(--line);background:var(--surface);font:9px ui-monospace,monospace;color:var(--muted)}
js
const stage=document.getElementById('stage'),panel=document.getElementById('interface');
const targets=[...document.querySelectorAll('.target')],pointer=document.getElementById('pointer'),tag=document.getElementById('tag');
let index=0,manualUntil=0;
function focus(el){
  targets.forEach(t=>t.classList.toggle('active',t===el));
  const r=stage.getBoundingClientRect(),b=el.getBoundingClientRect();
  const x=(el.offsetLeft+el.offsetWidth/2)/panel.clientWidth;
  const y=(el.offsetTop+el.offsetHeight/2)/panel.clientHeight;
  panel.style.transformOrigin=(x*100)+'% '+(y*100)+'%';panel.style.transform='scale(1.58)';
  pointer.style.left=(b.left-r.left+b.width*.78)+'px';pointer.style.top=(b.top-r.top+b.height*.34)+'px';
  tag.textContent='ZOOM TO '+el.dataset.name.toUpperCase();
}
function cycle(){if(performance.now()<manualUntil)return;index=(index+1)%targets.length;panel.style.transform='scale(1)';setTimeout(()=>focus(targets[index]),520)}
targets.forEach(el=>el.addEventListener('click',()=>{manualUntil=performance.now()+2300;focus(el)}));
setInterval(cycle,1650);setTimeout(()=>focus(targets[0]),250);

요소 확대는 화면 전체 중 버튼·입력칸 같은 한 요소를 골라 그 주변을 크게 보여 주는 방식입니다. 카메라가 그곳으로 가까이 가듯 화면이 이동하므로 위치를 찾기 쉽습니다.

선택한 요소의 중심을 transform-origin으로 삼고 scale을 올리면 웹에서도 만들 수 있습니다. 데모에서는 항목을 자동으로 차례로 선택하며, 원하는 항목을 눌러 확대 대상을 바꿀 수 있습니다.

줌 투 엘리먼트는 설명을 위한 이름이며 제품마다 기능 이름과 동작이 다릅니다. 요소 자체만 커지는 것과 화면 전체를 재구성하는 것을 구분하고, 설명할 주변 맥락은 남겨 두세요.

언제 쓰나

튜토리얼에서 조작할 버튼·입력칸을 명확히 짚을 때 씁니다. 주변 화면이 함께 남아 있어야 위치를 이해할 수 있습니다.

페이지로 열기 ↗

항목 추가 요청

아틀라스에 없는 영상 용어·효과를 알려 주세요. 하나씩 살펴보고 추가합니다.