브로큰 그리드

Broken grid

보이지 않는 격자를 세워두고 일부러 그 선을 넘어가게(겹치고, 기울이고, 튀어나오게) 배치하는 편집 디자인 기법.

다른 이름: Grid-breaking layout
···
html
<div class="stage">
  <div class="ghost"></div>
  <div class="card c1"><i class="ln"></i><i class="ln s"></i></div>
  <div class="img"></div>
  <div class="card c2"><i class="ln"></i></div>
</div>
css
.stage{position:relative;width:min(90%,420px);height:min(88%,260px)}
.ghost{position:absolute;inset:0;display:grid;grid-template-columns:repeat(3,1fr);grid-template-rows:100%;gap:8px;opacity:.5}
.ghost::before,.ghost::after{content:'';border-left:1px dashed var(--line);height:100%}
.ghost::before{grid-column:2/2}
.ghost::after{grid-column:3/3}
.card{position:absolute;background:var(--surface);border:1px solid var(--line);border-radius:8px;
  padding:8%;display:flex;flex-direction:column;gap:8px;box-shadow:0 6px 16px rgba(0,0,0,.1);
  transition:transform 1.6s cubic-bezier(.2,.8,.2,1)}
.c1{left:4%;top:8%;width:30%;height:34%}
.c2{left:44%;bottom:6%;width:26%;height:26%;z-index:2}
.img{position:absolute;right:6%;top:20%;width:36%;height:52%;border-radius:10px;z-index:1;
  background:linear-gradient(160deg,var(--accent-2),var(--accent));
  box-shadow:0 10px 26px rgba(0,0,0,.18);transition:transform 1.6s cubic-bezier(.2,.8,.2,1)}
.ln{display:block;height:6px;border-radius:3px;background:var(--line)}
.ln.s{width:60%}
.stage.tilt .img{transform:rotate(-4deg) translate(-4%,2%)}
.stage.tilt .c2{transform:translate(10%,-8%)}
.stage.tilt .c1{transform:rotate(1.5deg)}
js
document.querySelector('.stage').classList.add('x');
setInterval(() => document.querySelector('.stage').classList.toggle('tilt'), 1700);

"격자를 무시한다"가 아니라 "격자가 있다는 걸 보여준 다음 깬다"는 게 핵심입니다. 격자 없이 요소를 아무렇게나 흩어놓으면 그냥 지저분해 보이지만, 나머지 요소는 격자에 딱 맞춰두고 하나만 살짝 겹치거나 기울이면 그 하나가 의도적으로 강조됩니다.

구현은 그리드/플렉스로 기본 배치를 잡은 뒤, 강조하고 싶은 요소에 `position: relative`와 음수 `margin`(또는 `transform: translate/rotate`)을 줘서 옆 칸의 경계를 침범하게 만드는 식입니다. `z-index`로 겹치는 순서를 정하고, 겹친 부분에 그림자를 줘서 "떠 있다"는 걸 강조합니다.

과용하면 레이아웃이 깨진 것처럼 보이는 게 문제라, 페이지 전체가 아니라 이미지 한 장이나 카드 한두 개 정도로 절제해서 씁니다.