Skip to content
This page has been auto-translated and may contain errors.View in English

CSS 작동 방식

docs.scrimba.com

순수한 HTML 페이지는 이미 브라우저의 기본 스타일이 적용되어 도착합니다: 파란색 밑줄이 그어진 링크, 검은색 산세리프 텍스트, 크기가 단계적으로 줄어드는 제목들입니다. CSS는 이 원본 구조를 가져와서 어떻게 표시되어야 하는지 결정하는 방법입니다. 하지만 단 하나의 색상을 바꾸거나 단 하나의 상자를 이동하기 전에, 먼저 스타일이 페이지에 어떻게 도달하는지, 그리고 두 규칙이 같은 요소에 대해 서로 다른 의견을 가질 때 어떤 일이 발생하는지 알아야 합니다.

페이지에 CSS 첨부하기

페이지에 CSS를 추가하는 방법은 세 가지가 있으며, 차이는 주로 스타일을 어디에 작성하는지에 관한 것입니다.

첫 번째는 **인라인 스타일**로, style 속성을 사용하여 요소 위에 직접 작성합니다:

html
<p style="color: teal;">A single teal paragraph.</p>

이것은 한 단락만 스타일을 지정합니다. 두 번째 방법은 페이지의 <head>에 내부 <style> 블록을 넣는 것으로, 한 번에 많은 요소를 스타일할 수 있습니다. 세 번째이자 사용해야 할 방법은 페이지에 연결된 별도의 CSS 파일입니다. 해당 파일에 스타일을 한 번 작성하면, 그것을 연결하는 모든 페이지가 그 스타일을 적용합니다. 옷장처럼 생각해보세요: 각 사람에게 하나씩 옷차림을 설명하는 대신, 복장 규정을 한 번 적어두고 모두가 따르는 것입니다.

CSS는 세 가지 방법으로 페이지에 도달하며, 그들은 동등하지 않습니다. 인라인 스타일은 style 속성으로 요소 자체에 존재하며 그 요소 하나에만 영향을 줍니다. **내부 스타일시트**는 <head><style> 블록으로 전체 페이지의 요소를 대상으로 할 수 있습니다. 외부 스타일시트는 <head>에서 연결된 .css 파일입니다:

html
<link rel="stylesheet" href="styles.css">

외부 스타일시트를 기본값으로 사용하세요. 스타일을 한 곳에 유지하므로 마크업에 흩어지지 않으며, 구조는 HTML에, 프레젠테이션은 CSS에 남아 있어서 CSS란 무엇인가에서 설명한 것과 동일한 분리를 유지합니다. 브라우저도 파일을 캐시하므로, 방문자가 페이지 간에 이동할 때 스타일을 한 번 다운로드하고 재사용하므로, 모든 버튼에 복사하는 대신 버튼 스타일링과 같은 규칙을 한 번만 작성하면 됩니다.

세 가지 메커니즘이 CSS를 첨부하며, 각각은 이 장의 뒷부분에서 만날 계단식의 한 위치에 매핑됩니다. 인라인 스타일(요소의 style 속성)은 그 요소에만 적용되며 충돌에서 매우 높은 가중치를 가지며, 이것이 정확히 그것에 의존하는 것이 해롭다는 이유입니다: 스타일시트에서 깔끔하게 재정의하기 어렵습니다. 내부 <style> 블록은 하나의 문서로 범위가 지정됩니다. <link rel="stylesheet">로 연결된 외부 스타일시트는 정결함을 넘어선 이유들로 프로덕션의 기본값입니다.

외부 파일은 세 가지를 동시에 제공합니다: 관심사의 분리로, 마크업과 스타일이 독립적으로 변경됩니다; HTTP 캐싱으로, 돌아온 방문자는 각 HTML 응답에 포함된 스타일을 다시 가져오는 대신 이미 다운로드한 파일을 모든 페이지에서 재사용합니다; 그리고 재사용으로, 한 번 작성한 규칙이 전체 사이트를 담당합니다. 트레이드오프는 별도의 요청이며, 이것이 매우 작은 중요한 스타일이 때때로 첫 번째 렌더링을 위해 인라인되는 이유이지만, 일반적인 규칙은 유지됩니다: 외부 스타일시트에 작성하고 인라인 스타일을 습관이 아닌 대상 예외로 취급합니다.

외부 접근법의 전체 내용은 다음과 같습니다: 스타일시트를 연결하는 HTML 파일과 스타일시트 자체입니다.

html
<!-- index.html -->
<head>
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <p class="intro">Welcome to the site.</p>
</body>
css
/* styles.css */
.intro {
  color: teal;
  font-size: 1.25rem;
}
Juno페이지에 CSS 첨부하기 CSS를 추가하는 방법은 세 가지입니다: style로 요소에, <style> 블록에, 또는 <link>로 연결하는 별도 파일에 추가합니다. 별도 파일을 사용하세요. 스타일을 한 번 작성하면 그것을 연결하는 모든 페이지가 같은 모양입니다.
Juno페이지에 CSS 첨부하기 인라인 스타일은 하나의 요소를 대상으로 하고, <style> 블록은 한 페이지를 포함하며, 외부 .css 파일은 전체 사이트를 포함합니다. 외부 파일을 기본으로 사용하세요: 프레젠테이션을 마크업에서 제외하고, 브라우저가 캐시하며, 하나의 규칙이 모든 일치하는 요소에 적용됩니다. 인라인 스타일은 일상적인 것이 아니라 예외입니다.
Juno페이지에 CSS 첨부하기 외부 스타일시트에 작성하세요: 분리, 캐싱, 그리고 재사용이 한 번에 일어납니다. 인라인 스타일은 계단식에서 높은 가중치를 가지므로 나중에 재정의하기 어렵습니다; 의도적인 예외로 유지하세요. 인라인할 유일한 시간은 첫 번째 렌더링을 위한 작은 중요한 스타일 블록이며, 그렇더라도 CSS의 대부분은 연결된 파일에 남아 있습니다.

규칙의 구조

CSS의 한 부분은 **규칙**으로 작성되며, 모든 규칙은 같은 형태입니다. 여기 카드를 스타일하는 규칙이 있습니다:

css
.card {
  color: navy;
  padding: 16px;
}

앞의 .card선택자입니다: 규칙이 적용되는 요소를 선택하며, 이 경우 card 클래스를 가진 모든 것입니다. 중괄호 안의 모든 것은 선언 블록입니다. 안의 각 줄(예: color: navy;)은 하나의 선언입니다: 속성(color)과 그것이 가져야 할 값(navy)이 콜론으로 구분되고 세미콜론으로 끝납니다. 전체 규칙을 문장으로 읽으세요: "모든 카드에 대해 색상을 짙은 파란색으로 하고 패딩을 16 픽셀로 만들어."

모든 규칙은 같은 부분으로 만들어지며, 그들의 이름을 지으면 CSS의 나머지 부분을 더 쉽게 이해할 수 있습니다.

css
.card {
  color: navy;
  padding: 16px;
}

선택자( .card)는 규칙이 대상으로 하는 요소를 선택합니다. 중괄호는 선언 블록을 유지합니다. 안에는 각 property: value; 쌍이 선언입니다: color는 속성이고, navy는 값이며, 콜론이 그들을 연결하고 세미콜론이 그들을 종료합니다. 세미콜론은 선언 사이의 구분자이므로 마지막 것은 기술적으로 필요하지 않지만, 어쨌든 유지하세요: 나중에 다음 선언을 추가할 때 한 줄 변경으로 변합니다. 선택자가 어떤 요소를 일치시키는지, 그리고 얼마나 구체적인지는 선택자 장의 주제입니다.

문법은 작고 정확하게 표현할 가치가 있습니다. 모든 나중의 개념이 이 용어로 정의되기 때문입니다. 규칙은 선택자(규칙이 적용되는 요소를 결정하는 패턴) 뒤에 선언 블록(중괄호)입니다. 블록 안에는 선언 목록이 있으며, 각 선언은 콜론으로 쌍을 이루는 속성과 값이며 세미콜론으로 종료됩니다.

css
.card {
  color: navy;
  padding: 16px;
}

정확성은 디버깅에서 보상받습니다. 잘못된 선언(예: 속성 오타 또는 잘못된 값)은 파서에 의해 자동으로 버려지고 나머지 블록은 여전히 적용됩니다; CSS는 규칙별이 아닌 선언별로 실패하므로, 단일 오타는 전체 카드를 깨뜨리는 대신 조용히 한 줄을 제거합니다. 세미콜론은 종료자가 아닌 구분자이므로 최종 선언 후에는 선택사항이지만, 유지하면 다음 줄을 추가하는 날 위에 추가하는 것을 잊고 규칙이 깨지는 것을 방지합니다. 계단식을 다음에 만날 때, "어떤 선언이 승리하는가"는 항상 이 선언 수준에서 작동한다는 것을 기억하세요. 속성별로입니다.

Juno규칙의 구조 규칙은 선택자와 중괄호 안의 선언 집합입니다. .card와 같은 선택자는 요소를 선택하고, color: navy;와 같은 각 선언은 속성과 콜론 사이에 있는 값이며 끝에 세미콜론이 있습니다. 이러한 부분을 이름 지을 수 있으면 읽는 모든 규칙이 같아 보입니다.
Juno규칙의 구조 선택자, 선언 블록, 그리고 안의 property: value; 선언: 이것이 모든 규칙입니다. 세미콜론은 선언을 분리하므로 마지막 것에도 유지하세요. 그러면 다음 줄을 추가하는 것은 한 줄 편집으로 남아 있습니다. 선택자가 어떻게 일치하는지, 그리고 얼마나 구체적인지는 선택자 장에서 다음에 나옵니다.
Juno규칙의 구조 규칙은 선택자와 property: value; 선언 블록이며, CSS는 선언별로 실패합니다: 하나의 잘못된 줄이 버려지고 나머지 블록은 생존합니다. 이것이 왜 방황하는 오타가 전체 카드를 깨뜨리는 대신 조용히 단일 스타일을 제거하는지입니다. 뒷 세미콜론을 유지하고 선언을 추가할 때 절대 물지 않습니다.

계단식

때때로 두 규칙이 같은 요소를 스타일하려고 하며, CSS는 어느 것이 승리하는지 결정할 방법이 필요합니다. 그 결정이 **계단식**이며, 이것이 CSS의 C가 나오는 곳입니다.

css
.card {
  color: navy;
}

.card {
  color: teal;
}

두 규칙 모두 카드를 대상으로 하고 모두 색상을 설정합니다. 카드는 청록색이 되는데, 두 규칙이 같은 강도일 때, 나중에 작성된 규칙이 승리하기 때문입니다. 순서가 중요하며, 파일을 아래로 물처럼 흐르는데, 이것이 계단식이라는 이름이 나오는 곳입니다. 두 번째 동점 해소가도 있습니다: 더 구체적인 선택자가 더 일반적인 선택자를 이기므로, 카드를 정확하게 목표로 하는 규칙은 더 일반적인 규칙이 나중에 와도 더 일반적인 규칙을 재정의할 수 있습니다. 선택자 장에서 그 특이성을 자세히 만날 것입니다.

여러 규칙이 같은 요소에 같은 속성을 설정할 때, **계단식**은 승자를 선택하는 과정입니다. 두 가지 요인이 여기에서 결정합니다: 특이성과 소스 순서.

css
.card {
  color: navy;
}

.card {
  color: teal;
}

이 두 규칙은 동일한 특이성을 가지므로 소스 순서가 동점을 깨뜨리고 나중 규칙이 승리합니다: 카드는 청록색입니다. 특이성이 다를 때, 비록 일반 규칙이 파일의 나중에 와도 순서보다 우선합니다: 더 구체적인 선택자가 더 일반적인 선택자를 이깁니다. 더 구체적인 것이 승리합니다; 특이성 동점에는 나중 것이 승리합니다. 이것이 파일의 끝에서 재정의를 쌓는 것이 불안정한 습관인 이유이고, 왜 선택자 장의 특이성을 이해하는 것이 계단식을 추측 게임이 아닌 예측 가능하게 만드는 이유입니다.

**계단식**은 한 요소의 한 속성에 대해 경쟁하는 선언을 해결하는 알고리즘이며, 한 선언이 남아있을 때까지 정렬된 기준 집합을 통해 실행됩니다.

css
.card {
  color: navy;
}

.card {
  color: teal;
}

두 가지 가장 흔한 기준은 특이성(브라우저가 선택자에서 계산하는 가중치)과 소스 순서(동점에 나중 것이 승리)이며, 위의 예는 두 번째에 기반합니다: 동일한 특이성이므로 나중의 teal이 승리합니다. 하지만 이 두 가지는 더 큰 순서 안에 있습니다. 계단식은 먼저 출처와 중요도로 정렬합니다: 브라우저 기본 스타일, 그 다음 작성자 스타일, 그 다음 사용자 스타일, 일반 대 중요의 레이어가 있습니다. !important로 표시된 선언은 더 높은 밴드로 점프하며, 이것이 정확히 존재하는 이유이고, 왜 피해야 하는 이유입니다. !important는 올바르지 않아서가 아니라 정상적인 순서를 떠나서 승리하므로, 재정의가 아니라 탈출구입니다. 하나의 !important이 나타나면, 다음 수정은 종종 또 다른 하나입니다. 제어하지 않는 스타일(예: 인라인 스타일 또는 타사 위젯)을 무찌르기 위해서만 사용하고, 그렇지 않으면 특이성과 순서를 작동시킵니다. 상자 모델을 만나고 많은 규칙을 겹치기 시작할 때, 이 순서는 결과를 예측 가능하게 유지합니다.

Juno계단식 계단식은 두 규칙이 같은 것을 스타일할 때 싸움을 정하는 방법입니다. 규칙이 동등하게 강하면 나중에 작성된 규칙이 승리하므로 순서가 중요합니다. 더 구체적인 선택자도 더 일반적인 선택자를 이길 수 있으며, 그 부분이 선택자 장에서 나옵니다.
Juno계단식 규칙이 충돌할 때, 특이성이 먼저 결정하고 소스 순서가 동점을 깹니다: 더 구체적인 것이 승리하고, 동등한 경기에는 나중 규칙이 승리합니다. 파일의 끝에 재정의를 쌓는 것은 작동할 때까지 작동하며, 이것이 특이성에 대한 선택자 장이 계단식을 신뢰하기 전에 읽을 가치가 있는 이유입니다.
Juno계단식 계단식은 먼저 출처와 중요도로 정렬하고, 그 다음 특이성, 그 다음 소스 순서이며, 속성별로 정착합니다. !important는 올바른 것이 아니라 밴드를 점프함으로써 승리하므로, 제어하지 않는 스타일에 대한 탈출구로 취급하고, 일상적인 재정의로는 절대 사용하지 마세요. 하나의 !important는 다음 것을 낳는 경향이 있습니다.

상속

상자에 색상을 설정하면, 안의 텍스트도 종종 그 색상으로 변하는데, 그 텍스트를 직접 스타일한 적이 없습니다. 그 아래로 전달되는 것을 **상속**이라고 합니다.

css
.site-header {
  color: white;
  font-family: Georgia, serif;
}

헤더 안의 모든 텍스트, 제목, 링크, 태그라인이 자신의 규칙 없이도 그 흰색과 그 글꼴을 취합니다. colorfont-family가 상속된 속성이기 때문입니다. 하지만 모든 것이 아래로 전달되지는 않습니다. padding과 같은 간격 속성은 상속되지 않습니다: 헤더에 넣은 패딩은 헤더에 남아있고 안의 요소들에 나타나지 않습니다. 대략적인 가이드로, 텍스트 관련 스타일은 자식에게 흐르고, paddingborder와 같은 상자 관련 스타일은 제자리에 남아 있습니다.

일부 속성은 자신의 값을 자식 요소에 자동으로 전달하고, 일부는 그렇지 않습니다. 그 동작을 **상속**이라고 하며, 어떤 속성이 상속되는지 아는 것은 반복되는 규칙을 많이 절약합니다.

css
.site-header {
  color: white;
  font-family: Georgia, serif;
}

텍스트 관련 속성은 상속됩니다: color, font-family, font-size, line-height 등이 모두 자식에게 흐르므로, 컨테이너에 한 번 설정하면 안의 모든 것을 스타일합니다. 상자 관련 속성은 그렇지 않습니다: padding, margin, border, background는 그것을 설정한 요소에만 적용됩니다. 보통 상속하지 않는 값을 상속하길 원할 때, inherit 키워드는 부모에서 속성의 계산된 값을 취하도록 강제합니다. 상속과 계단식은 함께 작동하는 별개의 시스템입니다: 계단식은 요소의 승리 선언을 결정하고, 상속은 그 속성을 설정하는 규칙이 전혀 없을 때 자식이 돌아가는 것입니다. 타이포그래피는 이것을 많이 활용하며, 타이포그래피 장이 이것을 기반으로 구성합니다.

**상속**은 요소에 계단식된 값이 없는 속성이 그 요소의 부모에게서 그 값을 취하는 메커니즘입니다. 각 CSS 속성은 상속되거나 그렇지 않은 것으로 정의됩니다: 대부분의 텍스트 속성(color, font-family, font-size, line-height, text-align)은 상속됩니다; 대부분의 상자 속성(padding, margin, border, background)은 그렇지 않습니다. 모든 자식에게 간격을 상속하면 사용 불가능할 수 있기 때문입니다.

css
.site-header {
  color: white;
  font-family: Georgia, serif;
}

네 가지 명시적 키워드는 기본값이 원하는 것이 아닐 때 선언별로 이것을 제어합니다: inherit는 상속되지 않는 속성에서도 부모의 계산된 값을 취합니다. initial은 속성의 명세 기본값으로 재설정합니다. unset은 상속된 속성에 대해서는 inherit로, 나머지에 대해서는 initial로 작동합니다. revert는 브라우저의 기본 스타일로 롤백합니다. 더 큰 그림은 상속과 계단식이 요소의 계산된 값을 함께 생성한다는 것입니다: 계단식은 존재하는 경우 승리 선언을 선택하고, 어디든 없을 때, 상속된 속성은 부모에게서 도출되는 동안 상속되지 않은 속성은 초기 값으로 떨어집니다. 그 속성별, 요소별 단일 계산된 값이 레이아웃과 페인팅이 실제로 소비하는 것이며, 사용자 정의 속성 장은 상속에 직접 의존하여 설계 토큰을 컴포넌트 트리를 통해 흐르게 합니다.

Juno상속 상속은 텍스트 스타일이 상자 안의 요소들로 흐르는 것입니다: 헤더에 colorfont-family를 설정하면 안의 텍스트가 무료로 취합니다. padding과 같은 간격은 아래로 전달되지 않고, 그것을 넣은 곳에 남아 있습니다. 대략적인 규칙: 텍스트 스타일은 자식에게 이동하고, 상자 스타일은 제자리에 남습니다.
Juno상속colorfont-family와 같은 텍스트 속성은 자식에게 상속됩니다; paddingborder와 같은 상자 속성은 그렇지 않습니다. 컨테이너를 한 번 스타일하면 안의 모든 텍스트 관련이 따릅니다. 보통 상속하지 않는 값이 필요할 때, inherit 키워드는 부모에서 당겨옵니다.
Juno상속 각 속성은 정의상 상속되거나 그렇지 않습니다: 텍스트 속성은 상속되고, 상자 속성은 그렇지 않습니다. 키워드 inherit, initial, unset, revert는 선언별로 그것을 재정의하게 합니다. 상속과 계단식은 함께 속성별, 요소별 하나의 계산된 값을 정착시키고, 그 값은 레이아웃과 페인팅이 실제로 사용하는 것입니다.