코샵
끄적끄적 코딩 공방
코샵

인기 글

  • 분류 전체보기 (479) N
    • MongoDB (4)
    • 일기장 (4)
    • Unity (138)
      • Tip (41)
      • Project (1)
      • Design Pattern (8)
      • Firebase (6)
      • Asset (2)
    • 파이썬 (127)
      • Basic (40)
      • OpenCV (8)
      • Pandas (15)
      • PyQT (3)
      • SBC(Single Board Computer) (1)
      • 크롤링 (14)
      • Fast API (29)
      • Package (6)
    • Linux (4)
    • C# (97)
      • Algorithm (11)
      • Window (7)
    • TypeScript (48) N
      • CSS (10) N
    • Git (11)
    • SQL (5)
    • Flutter (10)
      • Tip (1)
    • System (1)
    • BaekJoon (6)
    • Portfolio (2)
    • MacOS (1)
    • 유틸리티 (1)
    • 서비스 (6)
    • 자동화 (3)
    • Hobby (10)
      • 물생활 (10)
      • 식집사 (0)
전체 방문자
오늘
어제

최근 댓글

최근 글

반응형
hELLO · Designed By 정상우.
코샵

끄적끄적 코딩 공방

TypeScript/CSS

CSS 초보자가 흔히 저지르는 10가지 실수와 해결책

2025. 5. 16. 10:08
반응형

CSS는 웹 디자인의 필수 요소지만, 처음 배울 때는 몇 가지 함정에 빠지기 쉽습니다. 깔끔하고 유지보수하기 쉬운 CSS를 작성하는 것은 경험이 쌓이면서 점차 익히게 되는 기술입니다. 이 글에서는 CSS 초보자들이 흔히 저지르는 10가지 실수와 그 해결책을 살펴보겠습니다. 이 내용을 통해 여러분의 CSS 코드는 더 효율적이고 전문적으로 변할 것입니다.

1. CSS 선택자 과용하기

실수

초보자들은 종종 필요 이상으로 복잡한 선택자를 사용합니다.

/* 너무 구체적이고 복잡한 선택자 */
body div.container ul.navigation li a.nav-link {
  color: blue;
}

이런 방식은 다음과 같은 문제를 일으킵니다:

  • 명시도(Specificity)가 너무 높아 나중에 재정의하기 어려움
  • 코드 가독성 저하
  • HTML 구조가 바뀌면 CSS가 작동하지 않을 가능성 증가
  • 성능 저하 (브라우저는 선택자를 오른쪽에서 왼쪽으로 해석)

해결책

가능한 한 간단한 선택자를 사용하세요. 클래스 선택자는 대부분의 상황에서 가장 좋은 선택입니다.

/* 간결하고 명확한 선택자 */
.nav-link {
  color: blue;
}

필요한 경우 한두 단계 정도의 관계를 명시할 수 있습니다:

/* 적절한 수준의 구체성 */
.navigation .nav-link {
  color: blue;
}

또한 BEM(Block Element Modifier)과 같은 명명 규칙을 사용하면 더 간결한 선택자로도 구체적인 요소를 타겟팅할 수 있습니다:

.navigation__item {
  margin-right: 10px;
}

.navigation__link {
  color: blue;
}

2. !important 남용하기

실수

CSS 규칙이 적용되지 않을 때 !important를 사용하는 것은 매우 유혹적입니다.

.button {
  background-color: blue !important;
  color: white !important;
}

하지만 이는 다음과 같은 문제를 일으킵니다:

  • CSS 명시도 계층을 무시하여 디버깅을 어렵게 함
  • 다른 개발자가 스타일을 변경하려 할 때 장애물이 됨
  • !important가 누적될수록 관리가 어려워짐

해결책

!important를 사용하는 대신 더 구체적인 선택자를 사용하거나, CSS 코드의 구조를 재검토하세요.

/* !important 사용 대신 */
.form .button {
  background-color: blue;
}

/* 또는 더 나은 방법으로 클래스 추가 */
.button.primary {
  background-color: blue;
}

CSS 파일 로드 순서를 확인하는 것도 중요합니다. 마지막에 로드된 규칙이 우선합니다.

!important는 정말 불가피한 상황(예: 써드파티 라이브러리 재정의)에만 사용해야 합니다.

3. 반응형 디자인 무시하기

실수

고정 크기(픽셀)만 사용하거나 다양한 화면 크기를 고려하지 않는 것은 현대 웹 개발에서 큰 실수입니다.

.container {
  width: 1200px;
}

.sidebar {
  width: 300px;
}

.content {
  width: 900px;
}

이 코드는 화면이 1200px보다 작을 때 가로 스크롤을 발생시키고, 모바일 장치에서는 사용하기 어렵게 만듭니다.

해결책

유동적인 레이아웃을 위해 상대적 단위를 사용하고, 미디어 쿼리를 통해 다양한 화면 크기에 대응하세요.

.container {
  width: 90%;
  max-width: 1200px;
  margin: 0 auto;
}

.sidebar {
  width: 25%;
}

.content {
  width: 75%;
}

@media (max-width: 768px) {
  .sidebar,
  .content {
    width: 100%;
  }
}

또한 Flexbox나 Grid와 같은 최신 레이아웃 기술을 활용하면 더 쉽게 반응형 디자인을 구현할 수 있습니다:

.container {
  display: flex;
  flex-wrap: wrap;
  max-width: 1200px;
  margin: 0 auto;
}

.sidebar {
  flex: 1 0 300px;
}

.content {
  flex: 3 0 600px;
}

4. 박스 모델 오해하기

실수

CSS 박스 모델의 작동 방식을 이해하지 못하면 레이아웃 문제가 발생합니다. 기본적으로 width와 height는 콘텐츠 영역만 포함하고, padding과 border는 추가됩니다.

.box {
  width: 300px;
  padding: 20px;
  border: 5px solid #ddd;
  /* 실제 총 너비: 300px + 40px(패딩) + 10px(테두리) = 350px */
}

이로 인해 예상보다 요소가 커지고 레이아웃이 깨질 수 있습니다.

해결책

box-sizing: border-box를 사용하여 패딩과 테두리를 너비에 포함시키세요.

/* 모든 요소에 적용 */
* {
  box-sizing: border-box;
}

.box {
  width: 300px;
  padding: 20px;
  border: 5px solid #ddd;
  /* 실제 총 너비: 정확히 300px */
}

이렇게 하면 지정한 너비가 요소의 실제 총 너비가 되므로 레이아웃을 더 직관적으로 계획할 수 있습니다.

5. 플로트(Float) 잘못 사용하기

실수

플로트는 원래 텍스트 주변에 이미지를 배치하기 위한 것이지만, 과거에는 레이아웃을 만드는 데 널리 사용되었습니다. 이로 인해 여러 문제가 발생할 수 있습니다:

.left-column {
  float: left;
  width: 30%;
}

.right-column {
  float: right;
  width: 65%;
}

플로트를 사용한 요소는 문서 흐름에서 제거되어 부모 요소가 높이를 잃고 "무너지는" 현상이 발생합니다.

해결책

현대적인 레이아웃 기술을 사용하세요:

/* Flexbox 사용 */
.container {
  display: flex;
  justify-content: space-between;
}

.left-column {
  width: 30%;
}

.right-column {
  width: 65%;
}

또는 CSS Grid:

.container {
  display: grid;
  grid-template-columns: 30% 65%;
  gap: 5%;
}

여전히 플로트를 사용해야 한다면, 반드시 클리어(clear)를 적용하세요:

.container::after {
  content: "";
  display: block;
  clear: both;
}

6. 하드코딩된 값 반복하기

실수

같은 색상, 간격, 폰트 크기 등을 CSS 전체에 반복적으로 하드코딩하는 것은 일관성과 유지보수성을 해칩니다.

.header {
  color: #3498db;
  margin-bottom: 20px;
}

.button {
  background-color: #3498db;
  padding: 10px 20px;
}

.footer {
  border-top: 1px solid #3498db;
  margin-top: 20px;
}

이후에 색상이나 간격을 변경해야 할 때, 모든 인스턴스를 찾아 수정해야 합니다.

해결책

CSS 변수(사용자 정의 속성)를 사용하여 재사용 가능한 값을 정의하세요:

:root {
  --primary-color: #3498db;
  --spacing-unit: 20px;
  --default-padding: 10px 20px;
}

.header {
  color: var(--primary-color);
  margin-bottom: var(--spacing-unit);
}

.button {
  background-color: var(--primary-color);
  padding: var(--default-padding);
}

.footer {
  border-top: 1px solid var(--primary-color);
  margin-top: var(--spacing-unit);
}

이제 한 곳에서 값을 변경하면 모든 곳에 반영됩니다.

7. 조직화되지 않은 CSS 파일

실수

스타일을 체계적으로 구성하지 않으면 CSS 파일이 빠르게 관리하기 어려운 "스파게티 코드"가 될 수 있습니다.

/* 무작위로 나열된 스타일 */
.footer { /* 스타일 */ }
h2 { /* 스타일 */ }
.navigation { /* 스타일 */ }
.header { /* 스타일 */ }
h1 { /* 스타일 */ }
p { /* 스타일 */ }

이러한 방식은 필요한 스타일을 찾거나 수정하기 어렵게 만듭니다.

해결책

CSS를 논리적 섹션으로 구성하고 주석을 사용하여 구분하세요:

/* 1. 전역 스타일 및 리셋
------------------------------------------------- */
* {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

body {
  font-family: Arial, sans-serif;
  line-height: 1.6;
}

/* 2. 타이포그래피
------------------------------------------------- */
h1, h2, h3 { /* 스타일 */ }
p, li, blockquote { /* 스타일 */ }

/* 3. 레이아웃 컴포넌트
------------------------------------------------- */
.container { /* 스타일 */ }
.grid { /* 스타일 */ }

/* 4. 헤더 및 네비게이션
------------------------------------------------- */
.header { /* 스타일 */ }
.navigation { /* 스타일 */ }

더 나아가, SASS/SCSS와 같은 CSS 전처리기를 사용하면 파일을 모듈화하여 더 잘 관리할 수 있습니다.

8. 브라우저 기본 스타일 무시하기

실수

브라우저마다 HTML 요소에 적용하는 기본 스타일이 다르며, 이를 무시하면 일관되지 않은 결과가 나타납니다.

/* 기본 스타일을 고려하지 않은 CSS */
h1 {
  color: blue;
}

ul {
  margin-left: 20px;
}

해결책

CSS 리셋이나 노멀라이즈(normalize)를 사용하여 브라우저 간 일관성을 유지하세요:

/* 간단한 CSS 리셋 */
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

/* 또는 Normalize.css 사용 (일부) */
html {
  line-height: 1.15;
  -webkit-text-size-adjust: 100%;
}

body {
  margin: 0;
}

main {
  display: block;
}

Normalize.css나 CSS Reset과 같은 라이브러리를 사용하는 것이 좋습니다.

9. 과도한 인라인 스타일 사용하기

실수

HTML 요소에 직접 스타일을 적용하는 것은 유지보수를 어렵게 만듭니다.

<div style="margin-top: 20px; color: blue; font-size: 16px;">
  <p style="line-height: 1.5; margin-bottom: 10px;">텍스트입니다.</p>
</div>

인라인 스타일의 문제점:

  • 재사용 불가능
  • 코드 중복
  • 우선순위가 높아 재정의하기 어려움
  • HTML과 스타일이 분리되지 않음

해결책

HTML에서 스타일을 분리하고 클래스를 사용하세요:

<div class="content-box">
  <p class="content-text">텍스트입니다.</p>
</div>
.content-box {
  margin-top: 20px;
  color: blue;
  font-size: 16px;
}

.content-text {
  line-height: 1.5;
  margin-bottom: 10px;
}

이렇게 하면 스타일을 여러 요소에 재사용할 수 있고, 한 곳에서 변경하면 모든 인스턴스에 적용됩니다.

10. 미디어 쿼리 비효율적으로 사용하기

실수

비효율적인 미디어 쿼리 사용은 코드 중복과 관리 문제를 일으킬 수 있습니다.

/* 데스크톱 스타일 */
.container {
  display: flex;
  max-width: 1200px;
}

/* 모바일 스타일을 위한 미디어 쿼리 */
@media (max-width: 768px) {
  .container {
    display: block;
    max-width: 100%;
  }
}

이 접근 방식은 작은 화면에서 시작하여 큰 화면으로 확장하는 모바일 우선 접근법을 따르지 않아, 종종 코드 중복과 오버라이딩 문제가 발생합니다.

해결책

모바일 우선 접근법을 사용하고, 논리적으로 미디어 쿼리를 구성하세요:

/* 기본 스타일 (모바일) */
.container {
  display: block;
  width: 100%;
}

/* 더 큰 화면을 위한 미디어 쿼리 */
@media (min-width: 768px) {
  .container {
    display: flex;
    max-width: 1200px;
    margin: 0 auto;
  }
}

또한 미디어 쿼리를 관련 선택자 근처에 배치하면 유지보수가 더 쉬워집니다:

.header {
  padding: 10px;
}

@media (min-width: 768px) {
  .header {
    padding: 20px;
  }
}

.footer {
  text-align: center;
}

@media (min-width: 768px) {
  .footer {
    text-align: left;
  }
}

실용적인 해결책: CSS 코드 품질 향상을 위한 추가 팁

위에서 언급한 실수들을 피하는 것 외에도, CSS 코드 품질을 향상시키기 위한 몇 가지 추가 팁을 소개합니다:

일관된 명명 규칙 사용하기

BEM, SMACSS, OOCSS와 같은 CSS 방법론을 채택하여 클래스 이름을 체계적으로 구성하세요.

/* BEM 예시 */
/* Block */
.card {
  background: white;
  border-radius: 4px;
}

/* Element */
.card__title {
  font-size: 18px;
}

/* Modifier */
.card--featured {
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}

유틸리티 클래스 활용하기

반복되는 스타일 패턴을 유틸리티 클래스로 만들어 재사용하세요:

/* 간격 유틸리티 */
.mt-1 { margin-top: 0.25rem; }
.mt-2 { margin-top: 0.5rem; }
.mt-3 { margin-top: 1rem; }
.mt-4 { margin-top: 1.5rem; }
.mt-5 { margin-top: 3rem; }

/* 텍스트 정렬 유틸리티 */
.text-center { text-align: center; }
.text-left { text-align: left; }
.text-right { text-align: right; }

CSS 린터 사용하기

StyleLint와 같은 도구를 사용하여 코드 품질을 유지하고 잠재적인 문제를 찾아내세요. 이는 일관된 코딩 스타일을 유지하는 데 도움이 됩니다.

주석 잘 작성하기

복잡한 CSS 규칙, 특히 해결한 특정 브라우저 버그나 디자인 결정에 대한 설명을 주석으로 남기세요:

/* 
 * IE11에서 Flexbox 오류를 해결하기 위한 핵
 * 참조: https://github.com/philipwalton/flexbugs#flexbug
 */
.container {
  display: flex;
  flex-wrap: wrap;
}

결론

이 글에서 살펴본 10가지 CSS 실수는 초보자들이 자주 경험하는 함정이지만, 경험이 풍부한 개발자들도 때때로 이런 실수를 합니다. 이러한 실수를 인식하고 해결책을 적용함으로써 더 깔끔하고, 유지보수하기 쉽고, 효율적인 CSS를 작성할 수 있습니다.

CSS는 단순해 보이지만 깊이 있는 기술이며, 제대로 마스터하려면 실습과 지속적인 학습이 필요합니다. 이 가이드가 여러분의 CSS 여정에 도움이 되길 바랍니다.

마지막으로, 가장 중요한 조언은: 완벽한 CSS 작성을 위한 절대적인 규칙은 없다는 것입니다. 프로젝트의 요구사항과 팀의 표준에 맞게 접근법을 조정하며, 계속해서 배우고 개선해 나가세요!

저작자표시 비영리 변경금지 (새창열림)

'TypeScript > CSS' 카테고리의 다른 글

CSS 트랜지션과 트랜스폼으로 사용자 경험 향상시키기  (1) 2025.05.18
CSS Flexbox vs Grid: 언제 무엇을 사용해야 할까?  (0) 2025.05.17
CSS 단위 완벽 이해하기: px vs. em vs. rem vs. vh/vw  (0) 2025.05.15
CSS 선택자 총정리: 원하는 요소를 정확히 타겟팅하는 방법  (0) 2025.05.14
CSS 애니메이션 마스터하기: 자바스크립트 없이 인터랙티브한 웹 만들기  (0) 2025.05.13
    'TypeScript/CSS' 카테고리의 다른 글
    • CSS 트랜지션과 트랜스폼으로 사용자 경험 향상시키기
    • CSS Flexbox vs Grid: 언제 무엇을 사용해야 할까?
    • CSS 단위 완벽 이해하기: px vs. em vs. rem vs. vh/vw
    • CSS 선택자 총정리: 원하는 요소를 정확히 타겟팅하는 방법
    코샵
    코샵
    나의 코딩 일기장

    티스토리툴바