새로운 시대의 웹 개발을 위한 최신의 CSS Reset 사용하기

최신 CSS Reset

웹 개발 세계는 끊임없이 변화하고 있으며, 우리가 사용하는 기술도 마찬가지입니다. 거의 4년 전, Set Studio의 Andy는 최신의 CSS Reset을 소개했습니다. 그 시점에서는 새롭고 혁신적인 접근이었지만, 시간이 흐르면서 새로운 기술과 방법론이 등장했기 때문에, 이제 그 업데이트된 버전을 공유한다고 합니다. 참고로 Andy는 이 CSS Reset을 자체 프로젝트에 적용하여 검증했다고 합니다.

오늘은 Andy의 원본 CSS Reset의 핵심 가치를 유지하면서, 최신 웹 표준과 실무에 맞게 조정한 새로운 CSS Reset 버전을 소개해드리겠습니다. 우리는 이를 통해 웹 개발의 기본을 재정립하고, 더 깔끔하고 효율적인 코드 작성을 할 수 있을 것입니다.

전체 CSS Reset 코드

웹 페이지의 모든 요소에는 브라우저에서 기본으로 설정된 스타일이 있습니다. 이 기본 스타일은 때때로 우리가 원하는 디자인과 충돌할 수 있습니다. 이를 해결하기 위해, CSS Reset은 이러한 기본 스타일을 ‘재설정’하여 웹 개발자가 보다 일관된 기반에서 시작할 수 있게 도와줍니다.

/* box-sizing 규칙을 명시합니다. */
*,
*::before,
*::after {
  box-sizing: border-box;
}

/* 폰트 크기의 팽창을 방지합니다. */
html {
  -moz-text-size-adjust: none;
  -webkit-text-size-adjust: none;
  text-size-adjust: none;
}

/* 기본 여백을 제거하여 작성된 CSS를 더 잘 제어할 수 있습니다. */
body,
h1,
h2,
h3,
h4,
p,
figure,
blockquote,
dl,
dd {
  margin-block-end: 0;
}

/* list를 role값으로 갖는 ul, ol 요소의 기본 목록 스타일을 제거합니다. */
ul[role='list'],
ol[role='list'] {
  list-style: none;
}

/* 핵심 body의 기본값을 설정합니다. */
body {
  min-height: 100vh;
  line-height: 1.5;
}

/* 제목 요소와 상호작용하는 요소에 대해 line-height를 더 짧게 설정합니다. */
h1,
h2,
h3,
h4,
button,
input,
label {
  line-height: 1.1;
}

/* 제목에 대한 text-wrap을 balance로 설정합니다. */
h1,
h2,
h3,
h4 {
  text-wrap: balance;
}

/* 클래스가 없는 기본 a 태그 요소는 기본 스타일을 가져옵니다. */
a:not([class]) {
  text-decoration-skip-ink: auto;
  color: currentColor;
}

/* 이미지 관련 작업을 더 쉽게 합니다. */
img,
picture {
  max-width: 100%;
  display: block;
}

/* input 및 button 항목들이 글꼴을 상속하도록 합니다. */
input,
button,
textarea,
select {
  font: inherit;
}

/* 행 속성이 없는 textarea가 너무 작지 않도록 합니다. */
textarea:not([rows]) {
  min-height: 10em;
}

/* 고정된 모든 항목에는 여분의 스크롤 여백이 있어야 합니다. */
:target {
  scroll-margin-block: 5ex;
}
unsplash

CSS Reset 코드 분석

웹 개발에서 CSS Reset의 역할은 단순해 보일 수 있지만, 그 중요성은 매우 큽니다. 그래서 이번에는 앞의 전체 CSS Reset의 핵심 정의 요소들을 세부적으로 분석해보겠습니다.

1. box-sizing이 중요한 이유

box-sizing 규칙은 모든 요소와 의사 요소가 border-box를 사용하여 크기를 조정하도록 설정합니다. 이는 요소의 패딩과 테두리가 너비와 높이 계산에 포함되게 만듭니다.

/* box-sizing 규칙을 명시합니다. */
*,
*::before,
*::after {
  box-sizing: border-box;
}

이전에는 웹 페이지의 레이아웃을 구성할 때 상대적인 크기 조절에 많은 중점을 두었지만, 현대 웹 개발은 유연한 레이아웃과 유동적인 타입을 선호합니다. 비록 box-sizing 규칙이 예전만큼 중요하지 않을 수 있지만, 명시적인 크기 조정이 필요한 경우가 많기 때문에 CSS Reset에 여전히 포함되는 것이 중요합니다.

2. 모던 웹을 위한 폰트 크기 조정의 중요성

웹 페이지의 가독성과 사용자 경험을 최적화하는 데 있어 폰트 크기의 역할은 무시할 수 없습니다. 특히, CSS Reset에서 폰트 크기 조정은 중요한 부분을 차지합니다.

폰트 크기 팽창 방지의 필요성

CSS Reset에서 중요한 부분 중 하나는 html 태그에 대한 폰트 크기의 팽창을 방지하는 것입니다. 이 규칙은 웹 페이지가 다양한 장치와 브라우저에서 일관된 방식으로 표시되도록 합니다.

/* 폰트 크기의 팽창을 방지합니다. */
html {
  -moz-text-size-adjust: none;
  -webkit-text-size-adjust: none;
  text-size-adjust: none;
}

이 규칙의 목적은 폰트 크기가 사용자의 환경에 따라 자동으로 조정되는 것을 방지하는 것입니다. 이는 특히 모바일 장치에서 중요한데, 여기서 브라우저는 종종 가독성을 높이기 위해 폰트 크기를 조정합니다.

접두사의 중요성

-moz--webkit- 같은 접두사가 왜 여전히 필요할까요? 이러한 접두사들은 브라우저 간 호환성을 유지하면서도 최신 기술을 활용할 수 있게 해줍니다. 모든 브라우저가 최신 표준을 완벽하게 지원하는 것은 아니기 때문에, 이러한 접두사는 여전히 중요합니다.

3. 효율적인 레이아웃 구축을 위한 여백 관리

웹 페이지 디자인에서 여백은 요소 간의 공간을 정의하고, 가독성과 시각적 균형을 제공하는 중요한 역할을 합니다. CSS Reset에서 여백 관리는 디자인의 일관성과 정교함을 위해 필수적입니다.

여백 제거의 중요성

CSS Reset의 핵심 요소 중 하나는 기본 여백을 제거하는 것입니다. 이는 웹 페이지의 요소들이 보다 예측 가능하게 배치되도록 합니다.

/* 기본 여백을 제거하여 작성된 CSS를 더 잘 제어할 수 있습니다. */
body,
h1,
h2,
h3,
h4,
p,
figure,
blockquote,
dl,
dd {
  margin-block-end: 0;
}

여백에 대한 사용자 에이전트 스타일을 제거함으로써, 개발자는 흐름과 공간을 보다 정확하게 제어할 수 있습니다. 이전의 CSS Reset에서는 모든 측면의 여백을 제거했지만, 최신 접근 방식에서는 논리적 속성을 사용하여 끝 여백만을 제거합니다. 이는 프로덕션 환경에서도 효과적으로 작동합니다.

레이아웃 디자인에서의 여백 활용

웹 페이지 레이아웃을 설계할 때, 여백은 요소들 사이의 관계를 정의하고, 콘텐츠의 가독성을 높이는 데 중요한 역할을 합니다. 적절한 여백 사용은 웹 페이지의 전체적인 미적 감각을 향상시키며, 사용자에게 보다 쾌적한 브라우징 경험을 제공합니다.

4. 접근성과 디자인의 균형을 위한 목록 스타일 관리

웹 페이지 디자인에서 목록 요소의 스타일링은 정보의 구조화 및 표현 방식에 영향을 미칩니다. CSS Reset에서는 이러한 목록 요소의 기본 스타일을 재정의하여 디자인과 접근성 사이의 균형을 맞추는 것이 중요합니다.

목록 스타일 제거의 중요성

CSS Reset의 주요 부분 중 하나는 ulol 요소에 대한 기본 목록 스타일을 제거하는 것입니다. 이를 통해 개발자는 목록의 시각적 표현을 자유롭게 커스터마이징할 수 있습니다.

/* 목록 역할이 있는 ul, ol 요소에서 기본 목록 스타일을 제거합니다. */
ul[role='list'],
ol[role='list'] {
  list-style: none;
}

하지만 이러한 스타일 제거는 Safari와 같은 특정 브라우저에서 보이스오버의 의미도 함께 제거할 수 있습니다. 이는 접근성 측면에서 중요한 문제를 제기합니다. 목록의 시각적 스타일을 제거하면서도, 스크린 리더 사용자에게 목록의 의미를 전달하는 방법을 고려해야 합니다.

웹 개발에서 디자인과 접근성은 상호 배타적이지 않습니다. 목록 스타일을 제거하면서도 role 속성을 추가함으로써, 개발자는 디자인의 자유도를 유지하면서도 접근성을 향상시킬 수 있습니다. 이러한 접근 방식은 웹 페이지가 모든 사용자에게 친숙하고 이해하기 쉬운 구조를 제공할 수 있습니다.

5. 가독성 강화를 위한 Body 기본값 설정

CSS Reset은 단순히 요소들의 스타일을 초기화하는 것 이상의 중요한 역할을 합니다. 특히, body 태그의 기본 설정은 웹 페이지의 전반적인 가독성과 구조에 큰 영향을 미칩니다.

Body의 기본값과 그 중요성

CSS Reset에서 body 태그의 기본값 설정은 중요한 부분을 차지합니다. 이 설정은 웹 페이지의 기본 높이와 줄 간격을 정의하며, 이는 가독성과 디자인에 큰 영향을 끼칩니다.

/* 핵심 body의 기본값을 설정합니다. */
body {
  min-height: 100vh;
  line-height: 1.5;
}

가독성 좋은 line-height 설정은 텍스트의 가독성을 높이고, 전체적인 페이지의 느낌을 개선하는 데 도움이 됩니다. 또한, body의 최소 높이를 100vh(viewport height)로 설정함으로써, 전체 화면을 균일하게 채울 수 있으며, 특히 장식적인 요소를 구성할 때 유용합니다.

새로운 단위에 대한 신중한 접근

최근 새로운 CSS 단위인 dvhsvh에 대한 관심이 높아지고 있습니다. 하지만 이러한 새로운 단위를 도입하기 전에는 충분한 이해와 테스트가 필요합니다. 새로운 단위를 과도하게 사용하면 예상치 못한 문제를 발생시킬 수 있으며, 이는 CSS Reset의 목적에 부합하지 않을 수 있습니다.

이미 잘 작동하는 단위가 있다면, 불필요하게 새로운 단위로 전환할 필요는 없습니다. 항상 기존의 솔루션을 기반으로, 필요에 따라 적절한 변경을 고려하는 것이 중요합니다.

6. 제목 및 인터랙티브 요소를 위한 Line-Height 최적화

웹 페이지의 타이포그래피 설정은 가독성과 사용자 경험에 중대한 영향을 미칩니다. 특히, 제목과 버튼과 같은 인터랙티브 요소들의 line-height 설정은 중요한 디자인적 고려 사항입니다.

제목 요소의 Line-Height 설정의 중요성

CSS Reset에서는 제목 요소들의 line-height를 일반 텍스트보다 짧게 설정하는 것이 일반적입니다. 이러한 설정은 제목이 시각적으로 더 돋보이게 하고, 페이지의 전체적인 구조를 강조하는 데 도움이 됩니다.

/* 제목 요소와 상호작용하는 요소에 대해 line-height를 더 짧게 설정합니다. */
h1,
h2,
h3,
h4,
button,
input,
label {
  line-height: 1.1;
}

이처럼 짧은 line-height는 제목과 인터랙티브 요소가 더욱 컴팩트하고 시각적으로 정돈된 느낌을 줍니다. 이는 또한 공간을 효율적으로 사용할 수 있도록 해주며, 디자인에 더 많은 유연성을 제공합니다.

글꼴 특성에 따른 조정의 필요성

하지만, 모든 글꼴이 같은 line-height 설정에 적합한 것은 아닙니다. 특히 상승부하강부가 큰 글꼴을 사용할 때는 이 규칙을 조정하거나 제거하는 것이 좋습니다. 이는 글꼴이 서로 충돌하여 가독성 문제를 일으키는 것을 방지하기 위함입니다.

7. 균형잡힌 디자인을 위한 제목의 Text-Wrap 설정

웹 디자인에서 제목의 시각적 표현은 페이지의 전체적인 느낌에 큰 영향을 미칩니다. 최신 CSS 기법 중 하나인 text-wrap 속성을 사용하여 제목의 텍스트 래핑을 조정하는 것은 디자인의 균형과 미적 감각을 향상시키는 데 도움이 됩니다.

Text-Wrap 속성의 활용

제목 요소에 text-wrap: balance 속성을 적용하는 것은 최근 웹 디자인의 트렌드 중 하나입니다. 이 속성은 제목의 텍스트가 균형잡힌 방식으로 래핑되도록 합니다.

/* 제목에 대한 text-wrap을 balance로 설정합니다. */
h1,
h2,
h3,
h4 {
  text-wrap: balance;
}

이 규칙은 제목의 가독성과 미적 감각을 개선하며, 특히 긴 제목이나 다중 줄 제목에 효과적입니다. text-wrap: balance는 제목의 단어들이 균등하게 분포되도록 해, 전체적인 페이지 레이아웃에 조화를 이루게 합니다.

디자인의 유연성 고려하기

그러나 모든 프로젝트 또는 디자인에 text-wrap: balance가 적합한 것은 아닙니다. 일부 디자이너와 개발자는 이 규칙이 적절하지 않다고 느낄 수 있으며, 이 경우 해당 규칙을 삭제하는 것이 좋습니다.

웹 디자인은 유연성이 중요합니다. 따라서, 새로운 CSS 기능을 채택할 때는 항상 프로젝트의 특성과 요구사항을 고려하는 것이 중요합니다.

8. 접근성과 디자인을 위한 링크 스타일링

웹 페이지에서 링크 요소는 사용자 경험의 핵심 부분입니다. CSS Reset을 통해 링크의 기본 스타일을 정의함으로써, 접근성과 디자인의 조화를 이루는 것이 중요합니다.

기본 링크 스타일의 중요성

링크에 대한 CSS Reset 규칙은 주로 a:not([class]) 선택자를 통해 적용됩니다. 이는 클래스가 지정되지 않은 링크에만 적용되는 스타일 규칙입니다.

/* 클래스가 없는 기본 a 태그 요소는 기본 스타일을 가져옵니다. */
a:not([class]) {
  text-decoration-skip-ink: auto;
  color: currentColor;
}

이 규칙은 텍스트 장식이 글자의 상승부하강부를 간섭하지 않도록 합니다. text-decoration-skip-ink: auto 속성은 링크의 밑줄이 텍스트와 충돌하지 않도록 하여 가독성을 향상시킵니다.

링크 색상의 상속과 사용자 정의

또한, 링크의 색상을 currentColor로 설정함으로써, 링크는 자동적으로 주변 텍스트와 같은 색상을 상속받게 됩니다. 이는 디자인의 일관성을 유지하고, 사용자의 시각적 혼란을 줄이는 데 도움이 되지만, 모든 프로젝트에 이 스타일이 적합한 것은 아닙니다. 프로젝트의 디자인 요구에 따라, 링크 스타일을 사용자 정의하거나 이 규칙을 제거하는 것이 더 적합할 수 있습니다.

9. 일관성 있는 사용자 인터페이스를 위한 폼 요소의 글꼴 상속

폼 요소의 글꼴 스타일링은 웹 페이지의 전반적인 사용자 인터페이스 디자인에서 중요한 역할을 합니다. CSS Reset을 통해 폼 요소가 상위 요소의 글꼴 스타일을 상속받도록 설정하는 것은 디자인의 일관성을 유지하는 데 도움이 됩니다.

폼 요소에서의 글꼴 상속 규칙

font: inherit 규칙은 폼 요소에 대한 스타일링을 간소화하고, 일관성을 제공하는 데 매우 효과적입니다.

/* input 및 button 항목들이 글꼴을 상속하도록 합니다. */
input,
button,
textarea,
select {
  font: inherit;
}

이 규칙은 input, button, textarea, select와 같은 폼 요소들이 상위 요소의 글꼴 스타일을 상속받도록 합니다. 이로 인해, 폼 요소들은 페이지 전체의 글꼴 스타일과 일치하여 보다 조화로운 사용자 경험을 제공합니다.

프로젝트에서 글꼴 상속의 효과

font: inherit를 사용함으로써, 개발자들은 프로젝트 후반부에 별도의 CSS를 줄일 수 있습니다. 이는 특히 <textarea> 요소에 영향을 주지만, 다른 폼 요소에도 유용하게 적용될 수 있습니다. 글꼴 상속을 통해 폼 요소의 스타일링을 통합하면, 웹 페이지의 디자인과 유지보수가 보다 효율적이고 일관되게 됩니다.

10. 사용자 친화적인 폼 디자인을 위한 Textarea 최적화

웹 폼에서 <textarea> 요소는 사용자에게 여러 줄의 텍스트 입력을 제공하는 중요한 구성 요소입니다. CSS Reset을 통해 이 요소의 기본 높이를 조정함으로써, 사용자가 더 편안하고 효과적으로 입력할 수 있도록 하는 것이 중요합니다.

Textarea의 최소 높이 설정

CSS Reset에서 <textarea> 요소의 높이 설정은 사용자 인터페이스의 편의성을 크게 향상시킵니다.

/* 행 속성이 없는 textarea가 너무 작지 않도록 합니다. */
textarea:not([rows]) {
  min-height: 10em;
}

이 규칙은 rows 속성이 없는 <textarea> 요소에 최소 높이를 지정합니다. 기본적으로 rows 속성이 없는 경우, <textarea> 요소는 매우 작아져 사용자가 텍스트를 입력하기 어려울 수 있습니다. 최소 높이를 10em으로 설정함으로써, 사용자가 보다 쉽게 여러 줄의 텍스트를 입력할 수 있도록 합니다.

손가락이나 더 거친 포인터를 사용하는 사용자에게는 너무 작은 입력 필드가 이상적이지 않습니다. <textarea> 요소는 자주 여러 줄의 텍스트를 입력하는 데 사용되므로, 충분한 높이를 제공하는 것이 사용자 친화적인 디자인의 핵심입니다.

11. 원활한 탐색 경험을 위한 스크롤 여백 최적화

웹 페이지 내에서 특정 요소를 타겟팅할 때, 해당 요소의 가시성과 접근성을 향상시키는 것은 중요한 사용자 경험 요소입니다. CSS Reset을 통해 타겟 요소에 추가적인 스크롤 여백을 설정함으로써, 사용자들이 페이지를 더욱 쉽게 탐색할 수 있도록 합니다.

고정 요소에 대한 스크롤 여백 설정

고정 요소에 대한 스크롤 여백 설정은 페이지 내의 탐색 경험을 개선하는 데 큰 도움이 됩니다.

/* 고정된 모든 항목에는 여분의 스크롤 여백이 있어야 합니다. */
:target {
  scroll-margin-block: 5ex;
}

이 규칙은 타겟팅된 요소 위에 추가적인 여유 공간을 생성하여, 사용자가 해당 요소를 더욱 명확하게 볼 수 있도록 합니다. 이는 특히 페이지 내의 특정 섹션으로 직접 이동할 때 유용합니다.

사용자가 원활하게 페이지를 탐색할 수 있도록 하는 이러한 세심한 조정은 전체적인 사용자 경험을 크게 향상시킵니다. 하지만, 고정 헤더와 같은 다른 디자인 요소가 있는 경우, 이 규칙의 적용을 조정해야 할 수도 있습니다.

unsplash

마치며

CSS Reset은 웹 개발의 세계에서 지속적으로 중요한 역할을 하고 있습니다. 그렇지만, 기술의 빠른 발전과 함께 이 CSS Reset이 향후에도 계속 유용할지에 대한 의문은 항상 남아 있습니다. 사실, 이전 버전의 CSS Reset만으로도 큰 문제 없이 잘 작동하고 있기는 하죠. 하지만 더 최신의 CSS Reset는 프로젝트를 시작할 때 기본적으로 사용하기에 매우 효과적이라는 장점이 있습니다.

이미 많은 웹 개발 프로젝트에서는 CSS Reset을 기본적인 셋팅으로 채택하고 있으며, 이는 다른 여러 클라이언트 프로젝트에 있어서도 마찬가지입니다. 하지만 현재의 웹 브라우저들은 뛰어난 성능을 자랑하며, 이로 인해 일부 전문가들은 CSS Reset의 필요성 자체에 의문을 제기하기도 합니다. 이는 웹 개발의 세계에서 계속되는 변화와 발전을 의미하며, 개별 프로젝트와 팀의 요구에 맞는 맞춤형 접근 방식의 중요성을 강조하는 사례라고 생각합니다.

unsplash

따라서 가장 현명한 방법은 다양한 소스에서 영감을 얻고, 여러분과 여러분의 팀에 가장 잘 맞는 맞춤형 CSS Reset을 만드는 것입니다. 이러한 방식으로, CSS Reset은 여러분의 웹 프로젝트에 필요한 특정 요구 사항을 충족시키고, 동시에 웹 개발의 빠르게 변화하는 트렌드에 발맞춰 나갈 수 있을 것입니다.

답글 남기기