[패스트캠퍼스:3주차] React & Redux로 시작하는 웹 프로그래밍 : react 강의 3.5 ~ 4/5
3주차.Chapter 03.5 ~ 4
스타벅스 예제 헤더 시작!
영역을 알려주는 태그
<div></div> 태그가 의미 없이 사용되는 것과 반대로
<header></header>처럼 의미를 갖고 사용되는 태그들이 많이 있다.
이런 태그들은 해당 코드가 어떤 영역을 위한 것인지 알 수 있게 도와주는 역할을 한다.
내가 의도한 영역을 나타내는 태그가 존재하지 않는다면 class 등으로 영역을 명시해도 된다.
예. <div class="inner-wrap"></div>
요소에 배경색을 줘서 작업
요소의 영역이 어디서 어디까지인지, 정확히 어디에 위치해 있는지 등을 쉽게 알 수 있게
배경에 색상을 주면 작업하는데 도움이 된다.
margin : 0 auto 중앙 정렬
요소의 가로 값이 명시된 상태고 display: block;인 상태에서
margin: 0 auto; (위아래 0, 좌우 auto)를 추가하면
브라우저가 남은 여백을 자동으로 계산해서 중앙에 요소를 정렬해 준다.
position 중앙 배치
position: absolute; top:0; bottom:0; height: XXpx; margin: auto 0;을 주면 세로로 중앙 배치가,
left: 0; right: 0; width: XXpx; margin 0 auto;를 주면 가로로 중앙 배치가 되는데,
해석하자면 시작점(top)과 끝점(bottom) 중앙에 요소를 margin : auto 하겠다는 뜻인데,
이러기 위해서는 반드시 높이값이 지정되어 있어야 한다.
absolute라는 속성은 다른 층으로 떠오르기 때문에 문제가 될 수 있다.
인라인 요소의 베이스 라인
인라인 요소는 글자 요소로 알파벳 소문자를 쓸 때,
y, g, p 등 기준이 되는 선 아래로 삐져나가는 것 때문에
아래에 공간이 있어서 아래에 공간이 조금 생긴다.
스타벅스 예제 - 서브메뉴
position: absolute와 display: flex를 사용해서 우측에 가로로 정렬을 했고
javascript를 사용해서 돋보기 아이콘을 눌렀을 때 input에 focus가 되고
css로 input에 focus가 되면 input 가로가 넓어지게 작업했다.
각 메뉴에서 href를 특별하게 설정하지 않았는데, 이런 경우에
href="#"이나 href="javascript.void(0)"을 사용할 수 있다.
# (해쉬)에 경우는 동작이 약간 있어서 javascript.void(0) 사용하길 추천.
href="#"인 경우, 버튼을 누르면 주소창의 주소 마지막에 #가 추가되는 걸 볼 수 있다.
javascript.void(0)의 경우는 정말 아무 동작도 하지 않는다.
요소에 focus를 해제하는 javascript 동작으로는 blur();가 있다.
<div class="search">
<input type="text" />
</div>
javascript에서 DOM 요소를 선택할 때, document 대신 변수로 선언된 부모 요소가 있으면 대체할 수 있다.
스타벅스 예제 - 메인 메뉴
- main-menu의 모든 요소가 세로로 쌓여있다.
- display : flex로 item은 가로로 정렬이 되고, item 내부 후손들(item__name, item__contents, contents__menu, contents__texture)는 그대로 세로로 쌓여있다. (display:flex는 직계 자식 요소에만 영향을 미치기 때문에)
- 드롭다운 메뉴 구조를 감싸고 있는 item__contents를 position: fixed로 분리시킨다. (position: fixed를 하면 top/bottom 값을 따로 설정하지 않는 한 html구조 순서대로 쌓이기 때문에 main-menu 아래에 붙는다.)
- 드롭다운 메뉴를 left : 0, width: 100%로 가로로 꽉 차게 만든다.
- 메인 메뉴를 position: absolute; right: 0; bottom: 0;해서 우측 헤더 아래쪽(서브메뉴 아래)에 배치한다.
BEM 클래스 작명법
Block Element Modifier
해당 작명법에는 2가지 방법이 있다.
- 요소__일부분
- 요소--상태
1번의 경우, 후손 요소 중에 같은 클래스명을 갖고 있어서, 스타일이 중복되는 걸 방지하기 위해 사용한다.
(요소__일부분)
<div class="container">
<h4 class="name"></h4>
<div class="inner">
<p class="name"></p>
</div>
</div>
.container .name {
font-size: 24px;
}
위의 경우 h4.name에만 font-size: 24px을 주고 싶지만, inner .name에도 적용된다.
그래서 BEM으로 작명하면
<div class="container">
<h4 class="container__name"></h4>
<div class="inner">
<p class="inner__name"></p>
</div>
</div>
container__name은 container의 name,
inner__name은 inner의 name이라고 더 직관적이면서 스타일 중복을 방지할 수 있다.
2번의 경우, 상태 구분을 위해 사용한다.
(요소--상태)
<button class="btn btn-primary"></button>
<button class="btn btn-success"></button>
<button class="btn btn-error"></button>
해당 요소가 버튼 요소이면서 primary, success, error인 상태에서 사용된다는 걸 직관적으로 알 수 있다.
BEM 작명법으로 구조가 복잡해져서 class 명을 많이 만들어야 하는 경우 도움이 된다!