2P by GN⁺ | ★ favorite | 댓글 1개
  • WebKit은 CSS에서 오래 까다로웠던 masonry/waterfall 레이아웃을 CSS Grid Level 3로 표준화하는 과정에 디자이너와 개발자의 피드백을 요청함
  • 제안된 모델은 display: grid 위에서 grid-template-rows: masonry행 생성을 끄고, 콘텐츠를 벽돌처럼 빈 공간에 채우는 방식임
  • Apple은 이 기능이 Grid 안에 있어야 fr, minmax(), max-content, spanning, 명시적 배치, subgrid 같은 기존 Grid 능력과 결합된다고 봄
  • 별도 display: masonry 방식은 레이아웃 타입을 단순히 분리할 수 있지만, 논의상 동일 너비 열 중심으로 제한될 가능성이 있고 Grid의 트랙 크기 조절 능력을 쓰기 어려움
  • 2024년 10월 업데이트 이후 CSS Working Group은 가변 너비 트랙, 명시적 배치, spanning, subgrid를 masonry에 포함할 가치가 있고 성능 구현도 가능하다고 결론냈지만, 문법 논의는 계속됨

CSS Grid Level 3의 현재 위치

  • 2024년 10월 업데이트 이후 CSS Grid Layout Module Level 3의 공식 W3C Working Draft가 만들어졌고, masonry 레이아웃의 동작 방식이 문서화됨
  • CSS Working Group 구성원들은 다음 기능을 masonry 레이아웃에 포함할 가치가 있으며, 성능 있게 구현 가능하다고 결론냄
    • 가변 너비 트랙
    • 명시적 배치
    • spanning
    • subgrid
  • 다만 문법에 대한 논쟁은 아직 열려 있으며, WebKit은 별도 글 Help us choose the syntax for Masonry in CSS에서 이를 이어감

왜 masonry 레이아웃이 필요한가

  • CSS Grid Level 1은 2017년에 도입돼 float 기반 레이아웃의 크기와 배치 부담을 줄였고, Grid Level 2는 Subgrid를 제공함
  • 하지만 CSS Grid가 나온 뒤에도 “masonry 레이아웃을 CSS로 어떻게 작성하나”라는 질문에는 7년 동안 뚜렷한 답이 없었음
  • masonry 레이아웃은 콘텐츠가 벽돌이나 돌담처럼 서로 맞물려 배치되는 패턴이며, waterfall layout이라고도 불림
  • 서로 다른 종횡비의 콘텐츠를 다룰 수 있어, 모든 항목을 같은 사각형으로 만들기 위해 자르거나 줄일 필요가 줄어듦
  • 콘텐츠가 페이지 전체에 분산되므로 스크롤 시 읽기 순서를 자연스럽게 유지하고, 하단에 lazy-load로 콘텐츠를 추가할 때 기존 콘텐츠를 움직이지 않아도 됨

제안의 역사와 표준화 논쟁

  • CSS에서 masonry 레이아웃을 만드는 메커니즘은 Mozilla가 2020년 1월 CSS Grid 확장으로 처음 제안했고, Firefox Nightly에서 플래그 뒤 실험 기능으로 구현됨
  • Apple은 2022년에 Safari Technology Preview에서 CSS Grid Level 3 제안을 구현하기 시작했으며, 현재 기본으로 켜져 있음
  • CSS Working Group 안에서는 기본 방향을 두고 이견이 있었음
    • 일부는 masonry가 CSS Grid의 일부가 아니라 별도의 display 타입이어야 한다고 봄
    • 일부는 이 레이아웃이 웹에 필요한지, 유명 웹사이트가 사용할지 확신하지 못함
  • WebKit은 브라우저가 이 기능을 출시하려면 CSS Working Group의 합의가 먼저 필요하다고 봄

기본 사용법: 행을 끄고 열만 쓰는 Grid

  • 고전적인 masonry/waterfall 레이아웃은 main 요소에 display: grid를 적용하고 열을 정의한 뒤, 행 방향에 masonry 값을 지정하는 식으로 작성됨
main {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr));
  gap: 1rem;
  grid-template-rows: masonry;
}
  • grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr))는 최소 14rem 너비의 유연한 열을 반복 생성함
  • gap: 1rem은 열과 항목 사이에 1rem 간격을 만듦
  • grid-template-rows: masonry는 브라우저에 행을 만들지 말고 콘텐츠를 masonry/waterfall 패턴으로 채우라고 지시함
  • 이 예시는 미디어 쿼리나 컨테이너 쿼리 없이 네 줄의 CSS로 다양한 화면 크기에 대응하는 유연한 레이아웃을 만듦
  • 현재 masonry라는 값 이름은 브라우저 출시 전에 바뀔 가능성이 있음

Grid의 열 정의 능력을 유지하려는 이유

  • WebKit은 masonry가 CSS Grid의 일부여야 한다는 근거를 보이기 위해 네 가지 데모를 만들었고, webkit.org/demos/grid3에서 직접 시험할 수 있음
  • 데모는 Grid Level 3를 지원하는 브라우저에서 볼 수 있음
  • CSS Grid는 열을 정의할 때 다양한 옵션을 제공함
    • px, em, rem, cqi, lh, ch, ic, cap, vw, svh 등 여러 단위의 고정 크기
    • max-content, min-content
    • fr 단위
    • minmax()
    • % 크기
    • auto
  • 예를 들어 첫 번째와 마지막 열은 14ch 고정 너비로 두고, 가운데 열은 최소 28ch의 유연한 열로 만들 수 있음
main {
  display: grid;
  grid-template-columns: 14ch repeat(auto-fill, minmax(28ch, 1fr)) 14ch;
  grid-template-rows: masonry;
  gap: 1rem;
}
  • fr 단위와 minmax()를 조합하면 열이 서로 다른 단계에서 늘어나고 줄어드는 두 단계 유연성을 만들 수 있음
  • max-contentmin-content는 열 크기를 콘텐츠 크기에 맞추게 해, 콘텐츠를 열에 맞추는 방식과 다른 배치를 가능하게 함
  • grid-template-columns: 1fr 1fr 2fr 3fr 5fr 8fr;처럼 Fibonacci sequence를 사용해 서로 다른 너비의 열을 만들 수도 있음
  • mega menu 예시는 grid-template-columns: repeat(auto-fill, minmax(max-content, 30ch));를 사용해 각 열이 링크 텍스트를 줄바꿈 없이 담을 수 있을 만큼 커지게 함
  • WebKit은 별도 display: masonry 논의가 오늘날 multicolumn layout처럼 동일 크기 열만 허용하는 방향이라고 봄

Spanning, View Transitions, columnar grid

  • CSS Grid는 항목이 여러 열에 걸치도록 만들 수 있어, masonry 배치에서도 다양한 시각적 구성이 가능함
  • 예시에서는 모든 5번째 이미지를 두 열에 걸치게 하고, 나머지 이미지는 한 열만 차지하게 만들 수 있음
  • 더 넓은 종횡비의 이미지에 wider 클래스를 부여해 여러 열을 차지하게 하고, 모서리를 사각형으로 바꾸거나 간격을 0으로 줄이는 변형도 가능함
  • Photos 데모는 View Transitions와 결합해, 사용자가 사진을 클릭하거나 탭하면 해당 사진이 여러 열에 걸쳐 커지고 브라우저가 전환을 자동 애니메이션함
    • 이 데모는 Safari Technology Preview 192 이상이 필요함
  • WebKit은 Grid Level 3의 핵심을 “masonry”라는 특정 패턴보다 행을 끄는 메커니즘으로 봄
  • 이 방식은 열만으로 구성된 columnar grid를 만들며, CSS Grid Level 1이 잘 만드는 행과 열이 모두 정렬된 modular grid와 대비됨

Modular grid와 columnar grid의 차이

  • modular grid는 콘텐츠가 열과 행 양쪽에 맞춰지는 Grid이며, CSS Grid Level 1은 이런 배치에 적합함
  • float 기반 레이아웃도 콘텐츠 높이를 맞춰야 float가 제대로 정리되기 때문에, 웹에서 modular grid 사용을 부추겼음
  • 실제 웹사이트에서는 이미지의 종횡비를 같게 만들거나, 텍스트 길이를 맞추거나, CMS 정책 또는 CSS 자르기와 말줄임으로 콘텐츠를 동일한 상자에 맞추는 경우가 많음
  • columnar grid는 콘텐츠가 원하는 크기를 유지하도록 두고, 레이아웃이 콘텐츠에 맞춰 작동하게 할 수 있음
  • WebKit은 최신 기사를 네 열에 걸치게 하고, 최근 기사 일부는 두 열, 오래된 콘텐츠는 한 열로 배치하는 예시를 통해 텍스트 중심 콘텐츠도 더 생동감 있게 배치할 수 있다고 봄

Subgrid와 명시적 배치의 결합

  • CSS Grid Level 2의 subgrid는 대부분의 브라우저에서 지원됨
  • 박물관 페이지 예시는 그림 카드의 메타데이터를 한 개의 왼쪽 정렬 열에 나열하는 대신, subgrid로 연도와 카탈로그 번호를 각 카드 오른쪽에 배치하고 다른 카드의 동일 데이터와 줄을 맞춤
  • masonry가 CSS Grid Level 3에 들어가면 기존 개발자 도구도 그대로 활용할 수 있음
    • Safari Technology Preview의 Grid Inspector로 grid-template-rows: masonry를 시험할 수 있음
  • 별도 display 타입이 되면 subgrid의 이점을 얻지 못함
  • CSS Grid Level 1의 명시적 배치도 함께 사용할 수 있어, 예시에서는 grid-column: -3 / -1로 헤더를 마지막 두 열의 페이지 오른쪽 위에 배치함
  • WebKit은 몇 줄의 레이아웃 코드로 Grid Level 1, 2, 3 기능을 결합해 미디어 쿼리나 컨테이너 쿼리 없이 가용 크기에 따라 열 수가 바뀌는 레이아웃을 만들 수 있다고 봄

display: masonry와의 쟁점

  • WebKit과 Apple은 Masonry가 CSS Grid를 확장해 modular grid뿐 아니라 columnar grid도 만들 수 있게 하는 기능이라고 봄
  • 이 방향에서는 열 정의, track spanning, 명시적 배치, subgrid 등 Grid 기능을 함께 사용할 수 있음
  • 별도 display 타입을 선호하는 쪽은 레이아웃 타입을 깔끔히 분리할 수 있다고 봄
display: block;
display: inline;
display: flexbox;
display: grid;
display: masonry;
  • CSS Working Group은 별도 Masonry display type의 문법을 아직 논의하지 않았지만, WebKit은 Multicolumn layout과 비슷한 문법 또는 제한된 Grid 유사 문법을 예로 듦
main {
  display: masonry;
  columns: 28ch;
}
main {
  display: masonry;
  masonry-columns: repeat(5, minmax(28ch, 1fr));
                   /* where only one repeating width is allowed */
}
  • 별도 레이아웃 타입은 Grid와 Masonry를 계속 함께 작동시키는 데 필요한 작업을 피할 수 있음
    • 레이아웃 모델이 단순해짐
    • 브라우저 구현이 쉬워짐
    • 성능 함정 가능성이 줄어듦
    • Grid와 Masonry 기능 세트가 서로 달라질 수 있음
  • 반대로 WebKit은 두 유형의 Grid 레이아웃이 연결돼 있으면 CSS Working Group이 향후 기능을 modular grid와 columnar grid 모두에 대해 정의하게 된다고 봄
  • 예를 들어 CSS Grid Level 4에서 grid area와 grid line 스타일링, 트랙 배경색, gap의 rule line 같은 기능이 추가된다면 처음부터 두 Grid 유형 모두에서 작동하는 편이 낫다고 봄

“Grid”를 어떻게 볼 것인가

  • 별도 display: masonry를 지지하는 쪽은 CSS Grid가 본질적으로 2차원 정렬이며, masonry는 한 방향만 정렬하므로 Grid가 아니라고 보는 경우가 있음
  • WebKit은 graphic design 역사에서 grid가 텍스트, 이미지, 콘텐츠를 규칙적 패턴으로 정렬해 가독성과 사용성을 돕는 도구였다고 봄
  • 20세기 유럽과 미국의 모더니스트들이 열과 행 양쪽 정렬을 “proper” graphic design grid로 강조하기 전에도 다양한 grid가 사용됐음
  • Mark Boulton은 대칭 columnar grid가 공식적이고 지루하다고 보고, 웹 디자인에서 비대칭 compound grid 사용을 장려했음
  • CSS Grid Level 1은 비대칭 grid와 compound grid를 쉽게 만들 수 있게 했지만, 현재는 그 Grid가 modular grid일 때에만 해당함
  • WebKit은 modular grid와 columnar grid가 모두 grid이며, CSS Grid도 columnar grid를 만들 능력을 가져야 한다고 봄

개발자와 디자이너에게 요청한 피드백

  • WebKit은 개발자와 디자이너가 데모를 직접 만들고, 블로그나 소셜 미디어에 의견을 쓰고, CSS Working Group 이슈에 의견을 남기길 요청함
  • 피드백 대상 질문은 다음과 같음
    • “masonry”/“waterfall”이 CSS Grid의 일부여야 하는가
    • subgrid, spanning, 명시적 배치, 다양한 track sizing을 포함한 columnar grid 기능이 필요한가
    • 동일 크기 열의 고전적 masonry 레이아웃만 있으면 충분한가
    • 실제로 이 기능을 사용할지, 무엇을 만들 수 있을지
    • 만든 데모 링크가 있는지
    • 이 모델로 할 수 없는 일이 있는지
  • WebKit 팀은 Masonry 작업을 1년 반 동안 진행했으며, 2023년 2월 Safari Technology Preview 163에서 기본 활성화됨
  • 기능을 곧 출시하고 싶지만, 이름을 포함한 세부 사항과 근본적 질문들이 먼저 해결돼야 함

이름 논의: masonry, waterfall, off

  • WebKit은 masonry가 새 값의 최선의 이름은 아닐 가능성이 크다고 봄
  • CSS 이름은 보통 center, contain, clip, wrap, smooth처럼 결과를 직접 설명하는 단순한 단어인 경우가 많음
  • masonry는 배경 설명이 필요한 은유라 영어를 쓰지 않는 개발자가 기억하기 어려울 수 있음
  • 어떤 지역에서는 이 레이아웃을 waterfall이라고 더 많이 부르므로 grid-template-rows: waterfall도 가능한 후보가 될 수 있음
  • WebKit은 이 기능이 Pinterest류 레이아웃 자체보다 “Grid를 만들되 행은 만들지 말라”는 메커니즘에 가깝다고 봄
  • grid-template-rows: none;은 의미상 적합할 수 있지만, none은 이미 grid-template-*의 기본값으로 “명시적 행 없이 암시적 행만 달라”는 뜻이라 사용할 수 없음
  • 대안으로 grid-template-rows: off;가 제시됨
main {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr));
  grid-template-rows: off;
}
  • CSSWG는 이름을 이 이슈에서 논의 중임
  • 현재 Safari Technology Preview와 데모에서는 Editor’s Draft에 맞춰 masonry 값을 사용하지만, 미래에는 이름이 바뀔 수 있음

댓글과 토론

Hacker News 의견들
  • 배경은 브라우저 벤더의 CSSWG 개발자 관계 담당자들이 Masonry 레이아웃을 CSS에 공식 포함하는 방식을 논의해 왔다는 것임. 적어도 Firefox가 처음 제안한 2020년부터 이어진 논의임
    이번 소식은 WebKit 쪽에서 이 논의를 공개적으로 끌어내고, 디자이너와 개발자에게 “소셜 미디어에 올리고, 블로그 글을 쓰라”는 식으로 행동을 요청했다는 데 있음
    겉으로는 형식적인 절차처럼 보일 수 있지만 중요한 선례가 될 수 있음. 핵심 논점은 모든 레이아웃 옵션을 CSS Grid의 일부로 다룰지, 아니면 필요할 때마다 새 CSS Display 속성을 계속 추가할지임
    전자는 이미 복잡한 CSS Grid 명세를 더 복잡하게 만들고, 후자는 CSS 명세를 새 속성과 하위 속성으로 부풀릴 수 있음. 어느 쪽이든 보기만큼 쉽지 않음

    • Masonry를 Grid 위에 얹는 데 긴장이 생기는 이유는 둘이 근본적으로 다르게 동작하기 때문임
      Grid는 먼저 모든 항목을 격자에 배치한 뒤, 예를 들어 col:2,row:3처럼 놓고 나서 격자 크기를 정함. Masonry는 이상적으로는 먼저 트랙 크기를 정한 뒤 그 트랙에 항목을 배치하고 싶음
      Firefox의 첫 구현과 당시 명세는 기본적으로 첫 행과 몇몇 복잡한 규칙을 제외하면 Masonry 항목을 트랙 크기 계산에 고려하지 않는다고 했고, 그래서 항목이 트랙을 넘치게 만드는 일이 아주 쉬웠음
      현재 명세는 모든 항목을 가능한 모든 트랙에 배치해 보라고 요구함. 최악이면서 꽤 흔한 경우에 O(N_tracks * N_items) 의 이차 성능이 나오고, 이차 성능은 나쁘며[1] 다른 레이아웃 알고리즘에는 사실상 이런 게 없음
      중첩까지 들어가면 성능은 준지수적으로 나빠지고, CPU가 빨라도 좋지 않음. 이런 경우가 흔하지 않다고 할 수도 있지만 CSS 레이아웃 모드에서는 사람들이 항상 경계를 시험하므로 기본적으로 빨라야 함
      Grid에서는 항목이 어느 트랙에 놓이느냐에 따라 자기 크기를 다르게 정하기 때문에 가능한 모든 위치에 배치해 볼 필요가 있음. Masonry는 이런 문제를 완화하려면 트랙 크기 계산에 다른 알고리즘이 필요할 수 있는데, 블로그 글은 이 쟁점을 충분히 다루지 않음. 항목 위치 의존성이 없는 Grid 크기 계산 버전이 있었을 수도 있지만 그 배는 이미 떠났음
      [1] https://randomascii.wordpress.com/2019/12/08/on2-again-now-i...
    • “행 없는” Grid는 현재 CSS Grid 명세에 꽤 잘 들어맞음. 강력한 열 정의 속성과 하위 Grid를 재사용할 수 있기 때문이고, 예제들도 이 기능들이 서로 얼마나 직교적인지 설득력 있게 보여 줌
      대체로 grid-row-template: masonry만 쓰면 나머지는 그대로 잘 동작함. 이 점은 좋고, Grid 레이아웃을 지금보다 더 쓰기 어렵게 만들지는 않는다고 봄
      단점은 주로 브라우저 엔진 작성자에게 있음. “CSS Grid 완전 지원”의 기준이 더 높아지기 때문임. 또한 Grid의 모든 기능을 지원해야 하는 구현이 명세가 더 단순했을 때보다 일부 Grid 레이아웃에서 느려질 수 있는 성능 함정도 피할 수 있다고 함
      별도 display 모드가 있다면 Masonry 레이아웃을 위해 grid-column 명세를 반복해야 하는데, 그건 아쉬움
    • 이런 일이 커뮤니티 피드백으로 넘어간 게 처음은 아님. 중첩 CSS 선택자 때도 같은 방식으로 진행했고, 피드백 측면에서는 꽤 잘 작동했음: https://webkit.org/blog/13607/help-choose-from-options-for-c...
    • 절충점을 탐색하다 보면 처음의 선호를 다시 생각하게 될 수 있음
      CSS Masonry와 직접 관련은 없지만, 최근 비슷한 긴장이 있는 인터페이스의 두 번째 반복을 프로토타이핑했음. 데이터 모델에서 비슷하지만 다른 타입을 늘릴지, 기존 타입 안에 세부 뉘앙스를 늘려 정교화를 지원할지의 문제였음
      시작할 때는 후자를 강하게 선호했지만, 실제로 옵션을 탐색해 보니 오히려 “부풀어 오른” 인터페이스를 소비하고 그 결과 애플리케이션 코드를 추론하는 쪽이 훨씬 단순했음
      CSS Masonry에 대해서는 강한 입장이 없지만, 사람들이 직관적으로 생각하는 긴장과 실제 사용에서의 느낌 사이에 비슷한 놀라움이 있을 수 있음. CSS는 특히 “부풀림”, 즉 사용 사례별 의미의 증가를 정당화하기 어렵겠지만, 사용자는 Grid 같은 밀도 높은 API를 더 어렵게 느끼는 경향도 있을 수 있음
    • 이렇게 공개적으로 진행하는 건 좋음. 작년부터 관련된 모든 사람에게 계속 밀어붙이고 있었음. Chrome 쪽이 가장 뒤처져 있고 아직 지원이 없음. Firefox는 플래그 지원이 있음
      작년부터 Firefox와 Safari에서 테스트했는데 구현에 불만은 없음. 속성의 위치와 이름을 두고 투덜대는 사람들도 있지만, 완벽한 해법은 아마 없다는 점을 인정하고 실용적으로 구현해야 함
      대체 구현에 JavaScript를 쓰는 건 거부함. 그래서 대체 방식은 순서를 제대로 맞추지 못하는 보기 싫은 CSS가 많이 들어가지만, 작업 중인 프로젝트에는 큰 문제가 되지 않음. 지금은 대부분 JavaScript로 대체하겠지만, 레이아웃의 해법이 JavaScript라면 이미 지고 들어가는 것임
  • 메가메뉴 데모 <https://webkit.org/demos/grid3/megamenu/>는 정말 마음에 들지 않고, 그곳에 Masonry를 쓰는 건 완전히 부적절해 보임. 흐름 방향을 엉망으로 만들어 기대를 심하게 깨뜨림
    기대되는 읽기 순서: https://temp.chrismorgan.info/2024-04-23-masonry-megamenu-2....
    실제 데모가 주는 순서: https://temp.chrismorgan.info/2024-04-23-masonry-megamenu-1..... 올바른 읽기 순서와 탭 인덱스에 영향을 줌. 시각 사용자는 사실상 항상 “잘못된” 순서로 읽게 됨
    결국 구조가 없고 링크가 담긴 비정형 가방일 뿐이라는 점을 보여 줌. 그런데 번호 순서대로 따라가 보면 꽤 논리적인 순서가 있었던 것처럼 보이고, 부적절한 Masonry화 때문에 완전히 망가졌음
    스크린샷에서는 “항목 번호 표시”를 켰음. 보통은 배경 없는 일반 열처럼 보임
    구현은 열을 사용하되 각 섹션에 break-inside: avoid를 추가했어야 함. 데모에서는 이걸 놓쳤음
    신문 데모도 비슷한 이유로 약간 의심스럽지만 훨씬 작은 문제임
    이미지 같은 매체처럼 더 독립적인 블록이고 읽기 순서가 그렇게 깊이 박힌 것이 아닌 경우에는 Masonry 레이아웃이 더 잘 맞음. 그래도 탭 인덱스 주변에는 조금 애매한 부분이 있지만, 더 이상 명백히 틀리지는 않음

    • 접근성 트리와 탭 순서가 실제 콘텐츠 순서를 우회하고 열을 하나씩 순회한다는 뜻이라면 그건 버그라고 봄
      Masonry 레이아웃에서 시각 사용자의 기대는 열 사이에 연속성이 있는 게 아니라 시각적 줄을 따라 이어진다는 것임. “예상 밖”이라고 제시한 순서도 그걸 따르고 있음
      문제는 탭 순서가 원본 콘텐츠 순서를 무시하고 시각적인 것을 흉내 내려 한다는 데 있어 보이고, 거의 확실히 현재 구현 방식에서 남은 흔적일 것임
    • 시각 사용자만 놓고 보면 현재 순서가 타당해 보임. 제안한 방식은 항목을 순서대로 보려고 자주 위아래로 스크롤해야 하고, 항목이 더 추가되면 큰 레이아웃 이동이 생길 수 있음
    • Masonry 효과라면 널리 지원되는 CSS 다중 열 레이아웃을 쓰면 되지 않나?
    • 그냥 임의의 데모일 뿐이고, 피드백을 모으려는 개념 자체와는 크게 관련 없어 보임
  • 이 기능의 좋은 점은 지원하지 않는 브라우저, 즉 특수 플래그를 켜지 않은 현재 모든 안정판 브라우저에서 데모를 봐도, Grid 레이아웃 위에 직접 만들었기 때문에 꽤 합리적인 고정 행 형식으로 표시된다는 것임: https://webkit.org/demos/grid3/
    각 경우에 제대로 된 Masonry 레이아웃이면 훨씬 보기 좋겠지만, 그렇지 않아도 충분히 쓸 만함. 마음에 들지 않으면 기능 감지를 해서 더 나은 대체 표시를 제공할 수도 있음

  • Masonry/폭포형 레이아웃의 전반적인 모양과 느낌이 정말 좋음. 종이 신문을 읽으며 자랐고 지금도 읽어서 그런지, 열 기반 레이아웃은 페이지를 나누는 직관적인 방식처럼 느껴짐
    다만 기본 Masonry 정렬의 대안이 있었으면 좋겠음. 아는 한 기본 규칙은 “다음 항목을 가장 위로 들어갈 수 있는 열에 배치”하는 식이고, 이 때문에 두 번째 행부터는 좌우 순서가 크게 뒤섞임
    상상하는 더 좋은 방식은 좌→우, 또는 선호 방향이 우→좌라면 그 읽기 흐름을 더 보존하는 레이아웃임. 예를 들어 “다음 항목은 이전 항목의 오른쪽 열에 넣되, 이미 가장 오른쪽이면 가장 왼쪽에 넣고, 새 바닥이 왼쪽 열의 아래 경계보다 너무 내려가지 않는다면 같은 열에 두 번째 항목을 넣을 수 있다” 같은 방식임
    엄격한 좌→우보다 더 유연해서 정렬도 덜 망치고, 좌→우 읽기 방향의 의미도 어느 정도 유지할 수 있음
    Masonry에서 선호할 수 있는 모든 공식을 수용할 수는 없겠지만, 순서가 조금이라도 중요한 콘텐츠라면, Pinterest는 아닐지 몰라도 저널 같은 경우에는 이런 방식이 고전적인 Masonry 규칙보다 더 합리적인 기본값이라고 봄

    • 명확한 순서가 애초에 없는 것에만 Masonry 레이아웃을 쓰겠음. 시간순으로 정렬된 이미지에는 쓰지 않을 것 같음
    • 문제는 좌→우 정렬 자체임. 이 레이아웃에서 여기저기 건너뛰지 않고 좌→우로 정렬하는 방법은 거의 없다고 봄
      잡지식 레이아웃이라면 열을 위→아래로 먼저 읽고, 그다음 좌→우로 읽지 않나? CSS에서는 이미 columns나 세로 방향 Flexbox로 가능함
      Masonry 레이아웃의 또 다른 문제는 아래쪽이 들쭉날쭉하다는 것임. 잡지라면 아마 균등하게 맞췄을 텐데, 이것도 열이나 Flexbox로 할 수 있음
      웹에서는 끝없이 스크롤되는 콘텐츠라는 숨은 가정이 있어서 페이지 아래쪽 모양은 중요하지 않다고 보는 듯함. 그렇다면 꼭 장려할 만한 가정은 아님
    • 이런 식이면 어떨까:
      { /* 업데이트 시 요소를 왼쪽 또는 오른쪽으로 최대 2열만 이동 */ grid-template-max-horizontal-shift: 2 col; }
  • CSS를 대체할 하위 호환성 없는 시스템을 만들 수 있다고 치면 어떻게 해야 할까?
    일관된 레이아웃 시스템을 만드는 방법에 대한 책이나 논문이 있을까?
    Qt, Tk, SwiftUI 같은 대안은 어떤가? CSS 말고는 써 본 적이 없음. 실제로 널리 구현된 시스템 중 더 나은 게 있다면, 무엇 때문에 더 나은 걸까?
    개발자에게 더 좋은 인터페이스를 주는 시스템을 원하지만, 어떻게 해야 할지 모르겠음. 처음부터 다시 시작할 수 있다면 설계 원칙은 무엇이어야 할까?

    • 특별히 반CSS는 아니지만, 크기 그룹, 예측 가능한 크기 요청-할당 주기, 높이에 따른 너비, 제약 및 정렬 기반 레이아웃 같은 개념에 관심을 가질 만함. 그리고 CSS에서 직교하지 않게 얽힌 개념들의 혼란을 전반적으로 정리해야 함
      속성은 더 명시적이고 분리되어야 함. 음수 마진 같은 헛짓은 없애고, 모든 거리는 다단계로 만들어야 함. 예를 들어 padding = max(el.paddings[]) 같은 식임
      경계 상자는 명시적으로 만들고, 테두리는 제대로 된 요소로 만들어야 함. 박스 모델 자체가 나쁜 건 아니고 CSS가 그 구현을 끔찍하게 한 것임. 건드릴 때마다 99%는 깨질 취약한 주문과 황당한 제한으로 가득 차 있고, 그 제한들이 더 많은 문제와 “해법”을 낳음
    • Cassowary 알고리즘을 쓰는 제약 기반 레이아웃이 한동안 인기 있는 대안처럼 보였음: https://github.com/slightlyoff/cassowary.js/?tab=readme-ov-f...
      화면 크기와 형태의 변화를 풀기 위해 설계된 방식임. Apple은 SwiftUI로 옮겼고 이 접근에서 넘어갔을 수도 있음
    • 여러 스타일링/레이아웃 시스템을 비교하는 글이 있으면 정말 흥미로울 것 같음. 다만 여러 스타일링 언어를 경험한 사람이 많지 않아서 그런 글을 쓸 수 있는 사람도 많지 않을 듯함
      Flutter와 XAML도 살펴볼 만한 대상일 것 같음
    • 참고할 선행 사례를 고를 때 주의할 점은 CSS가 선언적 제어의 기준을 꽤 높게 세운다는 것임. 언급된 것들을 자세히 말할 수는 없지만, 더 비교 가능한 선행 사례는 아마 인쇄 쪽 사용 사례에서 찾을 수 있을 듯함
    • 이 주제의 고전적인 책으로는 "Rastersysteme für die visuelle Gestaltung - Grid systems in Graphic Design"가 있는 것 같음. 읽어 보지는 않았음
  • 더 잘 보이도록 최상위 댓글로 다시 올림
    사진 웹사이트가 있는데, 레이아웃에 JavaScript를 쓰지 않음. 만들 때 JavaScript Masonry 라이브러리를 검토했지만 결과가 만족스럽지 않았음
    실제로 사용 가능한 모든 공간을 채우는 제대로 된 Masonry 레이아웃은 일부 이미지를 잘라 냄. 자르지 않고 종횡비를 유지하려면 사진 주변에 여백을 남겨야 함. 그걸 하지 않는 유일한 방법은 무한 스크롤인데, 기업형 중독 기계들이 원하는 건 그거겠지만 내 웹사이트에서 원하는 건 아님
    이렇게 만들었음:
    https://yakubin.com/photography/albumless/
    https://yakubin.com/photography/album/kenya-2023/
    이 결과를 얻기 위해 display:inline-block을 사용했고, 사진을 새 줄로 리플로우되어야 하는 텍스트처럼 취급한 셈임. 결과에 매우 만족하고 Masonry 라이브러리가 하는 방식보다 선호함

    • 이 레이아웃은 줄바꿈되고 가운데 정렬되는 행 방향 Flexbox로 CSS 몇 줄이면 아마 구현할 수 있었을 것임. 그쪽이 더 표준적인 방식이기도 함
    • Masonry 레이아웃에 JavaScript를 쓰지 않음. 현재 Masonry CSS 해법에서 지원되는 CSS 해법으로 대체 표시를 둠
      문제는 순서임. 순서가 중요하지 않다면 현재의 CSS만 쓰는 해법도 잘 동작함. 다만 기억하기로는 열 아래쪽에 이상한 모양이 남을 수 있음
    • 이런 레이아웃은 Flexbox가 설계된 용도라서 여기서도 선택지가 될 수 있음
  • 관련해서 Grid 원리를 다루는 인터랙티브 데모를 만들었음:
    https://cssprinciples.com/3/grid/

  • 기존 float가 있고 현대적인 Flexbox와 Grid 레이아웃도 있는데, CSS에 “레이아웃” 옵션을 계속 더하는 게 맞는지 궁금함
    아직도 포괄되지 않는 경우가 있다면, 복잡해지더라도 모든 레이아웃 사례를 포괄하는 마지막 제약 기반 시스템 하나를 두는 편이 더 나은 해법일 수 있음. 그러면 CSS 프레임워크와 유틸리티 라이브러리가 그 위에 차세대 Masonry Grid 등을 만들 수 있음

    • 제약 시스템이 실제로 검토될지는 회의적임. CSS는 지금까지 레이아웃 비용의 예측 가능성을 강하게 목표로 삼아 왔음
      그래도 Houdini 레이아웃 제안이 이 생각에 가장 가까움. 레이아웃을 격리된 JavaScript 컨텍스트로 넘기는 방식임: https://github.com/w3c/css-houdini-drafts/blob/main/css-layo...
      하지만 솔직히 Flexbox와 Grid, 그리고 containment 같은 것들이 이미 많은 문제를 해결했기 때문에 Flexbox 이전 시절보다 개선 요구가 훨씬 줄었음
    • 이 움직임의 핵심은 오래된 float 해킹이나 곧 낡게 될 CSS Grid/Flexbox 해킹을 그만 쓰자는 것임. Firefox의 Masonry 레이아웃은 실제로 Grid 행을 접는 새 속성 하나를 추가하는 방식이라, 사실상 모든 레이아웃 사례를 포괄하는 식으로 구현되어 있음
    • 이건 Grid 레벨 3임. 이렇게 할 수 있음:
      display: grid;
      grid-template-rows: masonry;
      다만 WebKit으로 제한됨. 개인 뉴스 피드의 갤러리 모드에 구현했다가 이미 2023년 10월에 버렸음
    • JavaScript가 최종 레이아웃 시스템임. 어떤 선언형 언어도 모든 사용 사례를 처리할 수는 없음. 다행히 Grid가 나온 뒤로는 JavaScript에 의존할 일이 드묾
      제약 기반 시스템은 Grid와 JavaScript 사이 어딘가에 어색하게 놓일 것 같아서 큰 도움이 될지는 모르겠음
    • CSS 레이아웃이 직접 지원하지 않는 요구사항이 있으면 언제든 JavaScript로 레이아웃을 생성할 수 있음
  • 이미 이걸 쓰고 있음. Firefox에서는 옵션에서 켜고 북마크에 활용함. 모바일에서는 그냥 위아래로 쌓이기 때문에 문제가 되지 않음. 모바일에는 about:config가 없음
    마지막 이미지는 꺼 둔 상태임
    https://imgur.com/a/o7OyZEW

    • 내가 이해한 바로는 Masonry 레이아웃 규칙이 가장 높은 빈 자리를 행 단위로 먼저 채우기 때문에 불규칙한 정렬이 생김. 하지만 시각적으로는 열로 정렬된 것처럼 보임
      그래서 창 크기를 바꾸면 북마크 순서가 바뀔 것임
    • 모바일에서 Firefox 베타를 써 보라 :)
  • 더 많은 배경과 반대쪽 주장, 즉 display:grid + grid-template-rows: masonry보다 display: masonry 가 낫다는 논의는 여기에서 자세히 볼 수 있음: https://github.com/w3c/csswg-drafts/issues/9041