-
Notifications
You must be signed in to change notification settings - Fork 0
[CSS in depth] part1(1장)
-
나의 의견은 '-->'로 표현
-
CSS: Cascading Style Sheets
- 이 장에서는 가장 필수적인 내용을 다룹니다.
- 캐스케이드를 구성하는 네 가지 부분
- 캐스케이드와 상속의 차이점
- 어떤 스타일이 어떤 요소에 적용되는지 제어하는 방법
- 단축 선언에 대한 일반적인 오해
-
cascade: 종속 -> 폭포가 아래로 내려오는 모양
-
specificity: 명시도(구체적인 정도를 뜻함)
-
inheritance: 상속
-
css가 가진 특성
- css는 엄밀히 말해서 프로 문법 언어는 아니다. 그래도 추상적인 사고는 필요하다.
- 순수한 디자인 툴은 아니지만 창의력을 요구한다.
- 간단한 선언적 구문을 제공하지만 커다란 프로젝트 안에서는 매우 복잡해질 수 있다.
-
기존 프로그래밍에서는 뭐라고 검색해야 할지 분명하다.(예: “배열에서 x 유형의 항목을 찾으려면 어떻게 해야 하나요?”)
- 하지만 css는 문제를 하나의 질문으로 압축하는 것이 어렵다.
- 상황에 따라 다른 경우도 많다.(특정 제약조건, 엣지 케이스를 얼마나 대처할 지에 따라 정답이 달라짐)
- => 그럴수록 꼼수나 임시적 대처법 보다는 css의 원리를 알아야 한다.
-
기본기부터 시작하자.
-
CSS는 규칙을 정하는 것이다.
-
어떤 조건에서 element에게 어떤 효과를 주길 원한다. 그럴때 class를 사용하여 스타일을 부여하고, 그것은 해당 요소의 자식에게도 적용된다.
-
--> 예를 들면 버튼클릭: 클릭된 상태의 버튼 스타일, 클릭 되지 않은 버튼의 스타일을 class로 조정할 수 있다.
-
브라우저는 이 규칙들을 받아서 화면에 그리는데 사용한다.
-
같은 스타일을 적용하는데 여러 방법의 css를 사용할 수 있다.
- => 솔루션에 따라 다른 페이지에 적용하거나, HTML 구조가 바뀔 때 다른 결과를 얻을 수 있다.
- => css 개발의 핵심은 "예측 가능한 방식으로" 규칙을 만드는 것이다.
-
-> 여러가지 방식으로 구현할 수 있다는 것은, 단순히 작동 되는 것보다 어떤 방식으로 작성했느냐가 중요하다는 뜻이다.
-
그 첫번째 스텝은 브라우저가 나의 규칙들을 어떻게 사용하는지 이해하는 것이다.
-
각 규칙이 충돌할때 요소를 어떻게 스타일링 할까?
-
=> 어떤 규칙이 예상대로 동작하지 않는 경우가 있다.
-
규칙의 동작을 예상하려면 cascade에 대해 알아야 한다.
-
stylesheet origin: 스타일이 어디서 왔는지, 스타일은 브라우저의 기본 스타일과 함께 적용됨
-
selector specificity: 선택자의 우선 순위(명시도)
-
source order: 코드의 순서
- 용어정리
-
property(속성):value(값)= 선언 - 선언 블럭(Declaration Block): 중괄호(컬리 브레이스)로 감싼 여러 선언의 집합
- 선언 블럭은 선택자(selector)와 함께 사용됨
- 선택자 + 선언 블럭 = ruleset/ rule
-
// ruleset
selector {
property1: value1; // declaration
property2: value2;
property3: value3;
}
// ruleset with id
#header {
background-color: #333;
color: white;
padding: 20px;
text-align: center;
}
// ruleset with class
.button {
display: inline-block;
padding: 10px 20px;
background-color: #007bff;
color: white;
text-decoration: none;
border-radius: 5px;
}-
우리가 만드는 css stylesheet은
author styles라고 부른다. -
브라우저의 디폴트 스타일은
user agent styles=> 우선순위가 낮기 때문에 덮어쓸 수 있는 것- 브라우저 마다 다르다.
- 보편적으로 비슷한 것을 한다.
-
예외사항:
!importantannotations 가 적용된 선언 -
따라서 순서는 이렇게 된다. 1 Author important
2 User important 2 Author 3 User (책에는 없는데 추가한 내용, 브라우저에서 사용자가 설정한 스타일) 4 User agent -
User important가 되는 사례: 브라우저에 직접 스타일 시트를 등록한거나 개발자 도구로 important를 부여했을때
-
거의 모든 CSS는 같은 origin을 가지게 됨 => "author"
-
그러므로 origin만으로는 우선순위 선별 x => 두번째로 작용하는 것이 specificity이다.
-
브라우저가 css를 이해하는 방식: 두가지 방법
-
인라인
-
한정자(selector)
-
인라인
- 인라인 > selector
- 인라인 < selector + 'important' mark
- 인라인 + 'important' => ? => 이 경우에는 어떤 것도 오버라이딩 할 수 없다.
- 한정자
-
한정자 별 우선순위가 있음
- ID 한정자 > class 한정자 > tag 한정자(type selector)
-
selector의 경우 한정자가 여러개 중첩되면 우선순위가 올라간다.
-
div<div p - 그러나 selector 자체의 우선순위가 낮은 쪽의 개수가 많아도 우선순위가 뒤집히지는 않는다.(ID한정자 > class한정자)
-
#something>.class1 .class2 .class3
-
-
-
정리(어디가 이기나요?)
- ID 한정자가 더 많은 쪽
- 동점이라면, class가 많은 쪽
- 동점이라면, tag 한정자가 더 많은 쪽
-
결국 어떤 것이 더 정교하게 대상을 타겟팅 하는가? 의 기준으로 보면 된다.
-
다르게 말하면 정교할수록(인라인 + important 혹은 ID 셀렉터) 나중에 오버라이딩이 힘들다는 것을 알고 써야 한다.
-
specificity 나타내기
- ids number, classes number, tags number
- 2,1,1 > 1,2,2 (앞에 있는 것의 비중이 높기 때문에 이렇게 됨)
- 인라인 스타일을 포함하는 경우도 있음(0,2,1,1) => 인라인 스타일의 우선도가 가장 높으므로 맨 앞 위치
-
specificity 때문에 적용되지 않는 스타일의 수정
-
[bad]
-
!important mark 사용하기 => 쉽지만 나태한 fix => 지금은 문제가 안되지만 미래의 누군가가 알아내기에 어려움을 준다
-
!important를 사용하기 시작하면 연쇄적인 사용을 불러일으킨다 => 남용주의
-
결국 다 뜯어고쳐야 하는 상황이 될 수 있음
-
[better]
-
specificity 자체를 우선적으로 적용되도록 수정 => id를 이기려면 id를 사용, 개수를 늘리는 등 적용하고자 하는 스타일의 specificity 중요도를 높인다
-
[best]
-
원인이 되는 스타일의 specificity를 낮출 수 있다면 낮춘다 => 당위없이 id로 되어있다면 class로 낮추는 등
-
다른 코드에 영향이 가는지 확인 필요
-
-
specificity는 팔씨름같아서, 높이는 방향으로만 코드를 수정하면 미래의 옵션을 점점 제거하는 방향으로 작성하는 꼴이 되어 주의 필요
- 코드 순서도 의미가 있다.
- 뒤에 오는 코드가 앞의 코드를 덮어쓴다.
같은 결과에 이르는 많은 방법이 있다.
- 올바른 결과를 정의하기
- 한정자를 구성할 수 있는 방법들을 생각하고, 그 중에 필요에 맞아 떨어지는 best way를 고른다.
-
축약표현은 표시하지 않은 내용을 초기값으로 설정한다.
-
background-position: padding이 두가지 value를 '상하' '좌우' 차례로 적용하는 것과 반대로 이 속성은 '좌우' '상하'로 적용한다.(주의)
- --> 이런 경우를 모두 기억할 수는 없지만 이런 경우가 있다는 걸 알고 있는 것이 도움이 될 것 같다.
-
상속되는 속성(대표적: text에 적용되는 속성들)과 상속되지 않는 속성(대표적: border)이 있다.
- inherit은 상속되지 않는 속성을 상속되게 하고 싶을 때 사용한다
-
상속된 속성을 사용하고 싶지 않을 때 initial을 사용한다. 이때의 초기값은 브라우저가 결정한 값이다(브라우저마다 초기값이 다르다.)
-
--> unset은 언제 사용?
- 해당 속성에 대한 상속 정보가 있다면 해당 값이 적용되고, 상속 정보가 없다면 initial value가 채택된다.
-
기타
- 개인적인 경험으로 React로 개발할때 이런 충돌을 겪는 것은 UI라이브러리 쓸때(Chakra ui같은)
- 그런 문제를 잘 해결하려면 css 기초를 아는 것은 중요하다.