CSS 카운터: 정렬 가능한 목록의 동적 번호 매김을 위한 효율적인 솔루션

CSS Counters: auto-update list numbers without JavaScript | Rails Designer

작성자
발행일
2026년 01월 26일

핵심 요약

  • 1 CSS 카운터를 활용하여 DOM 순서에 기반한 동적 목록 번호 매김을 JavaScript 없이 구현할 수 있습니다.
  • 2 정렬 가능한 목록에서 데이터베이스 순서와 무관하게 실시간으로 번호를 업데이트하여 사용자 경험을 개선합니다.
  • 3 가 제한적인 스타일링 대신 CSS 카운터는 번호의 시각적 제어에 더 많은 유연성을 제공합니다.

도입

웹 개발에서 정렬 가능한 목록의 번호를 동적으로 관리하는 것은 흔한 요구사항입니다. 대부분의 개발자는 이러한 기능을 구현하기 위해 JavaScript를 떠올리지만, 이는 불필요한 복잡성을 초래할 수 있습니다. 본 글은 Ruby on Rails 환경에서 Hotwire를 사용하여 정렬 가능한 페이지 목록을 구축하는 과정에서 발생한 번호 매김 문제를 다루며, 이 문제에 대한 우아하고 효율적인 CSS 기반 해결책인 CSS 카운터의 활용법을 소개합니다.

정렬 가능한 목록에서 번호 매김 문제를 해결하기 위해 CSS 카운터는 강력한 대안을 제시합니다.

초기 문제점

  • 데이터베이스 기반 번호 매김: 초기에는 positioning gem을 사용하여 페이지에 순차적인 번호(1, 2, 3 등)를 부여했습니다. ERB 코드는 page.position을 사용하여 번호를 표시했습니다.

  • 정렬 기능 추가: Rails와 Hotwire를 활용하여 칸반 보드 기능을 구현하고 페이지를 커스텀 방식으로 정렬할 수 있도록 했습니다.

  • 번호 불일치 발생: 페이지가 정렬되면 데이터베이스 순서에 기반한 번호가 더 이상 DOM 순서와 일치하지 않아 잘못된 번호가 표시되는 문제가 발생했습니다. 새로고침이나 모핑을 통해 해결할 수 있지만, 이는 사용자 경험에 좋지 않습니다.

CSS 카운터 솔루션

이러한 문제를 JavaScript 없이 CSS만으로 해결할 수 있는 방법이 바로 CSS 카운터입니다.

  • 작동 원리:
    1. 카운터 초기화 (counter-reset): 부모 요소(예: ul)에 counter-reset: page-num;을 적용하여 page-num이라는 카운터를 0으로 초기화합니다.
    2. 카운터 증가 (counter-increment): 각 목록 항목(예: li) 내부의 번호를 표시할 요소(예: span)에 counter-increment: page-num;을 적용하여 해당 카운터 값을 1씩 증가시킵니다.
    3. 카운터 값 표시 (counter()): ::before pseudo-element와 content: counter(page-num);을 사용하여 현재 카운터 값을 표시합니다. 브라우저는 DOM 내에서 요소가 이동하더라도 이 카운팅을 자동으로 처리합니다.
  • 코드 예시:
    • Tailwind CSS: ```html
      • <%= page.content %>

      ```

    • Vanilla CSS: css ul { counter-reset: page-num; } li span::before { content: counter(page-num); counter-increment: page-num; }

::marker와의 비교

ol > li::marker pseudo-element를 사용하는 것도 번호 매김의 한 방법이지만, ::marker는 스타일링에 있어 매우 제한적입니다. 색상, 폰트, 내용 변경은 가능하지만, 배경, 테두리, 패딩, 포지셔닝 등은 제어할 수 없습니다. 반면 CSS 카운터는 일반 요소를 사용하므로 시각적 스타일링에 대한 완벽한 제어권을 제공하여 복잡한 레이아웃 요구사항을 충족시킬 수 있습니다.

결론

CSS 카운터는 동적 목록 번호 매김과 같이 일반적으로 JavaScript로 처리되던 기능을 CSS만으로 해결할 수 있는 강력한 기능입니다. 이를 통해 개발자는 불필요한 JavaScript 의존성을 줄이고, 더 깔끔하며 유지보수하기 쉬운 코드를 작성할 수 있습니다. 특히 정렬 가능한 목록에서 DOM 순서에 따라 번호가 자동으로 업데이트되는 기능은 사용자 경험을 크게 향상시키며, `::marker`보다 훨씬 유연한 시각적 제어를 제공합니다. 이처럼 잘 알려지지 않은 CSS 기능을 이해하고 활용하는 것은 더 나은 웹 개발자로 성장하는 데 중요한 자산이 됩니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!