CSS - 레이아웃, Selector: 화면 설계의 기본
학습 목표
* 다양한 CSS 셀렉터 규칙 이해
- 후손 셀렉터와 자식 셀렉터의 차이
* 레이아웃을 위한 HTML 작성
* Flexbox를 이용한 레이아웃 작성
- 방향: flex-direction
- 늘리기: flex-grow
- 크기 차지: flex-basis
- 수평 정렬: justify-content
- 수직 정렬: align-items
Checkpoint – CSS Selector
일반 셀렉터
h1 { } // “모든” h1을 선택
div { } // 모든 div 를 선택
등
전체 셀렉터
모든 엘리먼트를 선택(전체가 아닌 모든)
* { }
tag 셀렉터
,
(쉼표)는 다중으로 선택한다
section, h1 { } // section과 h1을 다중으로 선택
id 셀렉터
#only { }
class 셀렉터
.widget { }
.center { }
attribute 셀렉터
후손 셀렉터
(공백)으로 이어 씀
header h1 { } //header의 후손 엘리먼트 중 h1 엘리먼트를 선택
자식 셀렉터
>
기호를 이용한다
header > p { } // header의 자식 엘리먼트 p를 선택
→ 후손 셀렉터와 자식 셀렉터의 차이를 반드시 알아야 함!
후손 셀렉터와 자식 셀렉터의 차이?
자식은 말 그대로 직계 바로 아래의 셀렉터
후손은 손자,손녀처럼 자신에게 속하는(하위의) 셀렉터인듯?
인접 형제 셀렉터
+
기호를 사용
section + p { } // section과 인접한 형제 엘리먼트 p를 선택
형제 셀렉터
~
기호를 사용
section ~ p { } // section과 인접한 형제 엘리먼트를 “모두” 선택
가상 클래스
a:link { }
a:visited { }
a:hover { }
a:active { }
a:focus { }
요소 상태 셀렉터
input:checked + span { }
input:enabled + span { }
input:disabled + span { }
구조 가상 클래스 셀렉터
p:first-child { } //엘리먼트 중 p가 첫번째 자식인 p 엘리먼트를 선택
ul > li:nth-child(2n) { } // ul의 자식(>) 엘리먼트 중 2n(짝수)번째인 li 엘리먼트
section > p:nth-child(2n+1) { } // section의 자식 엘리먼트 중 홀수번째인 p 엘리먼트
p:first-of-type { } //p엘리먼트의 “형제” 엘리먼트 중 처음 등장하는 p 엘리먼트를 선택
// *first-child와는 다르게 첫번째 자식인 p가 아닌 처음 등장하는 p를 선택
div:last-of-type{ } //div의 “형제” 엘리먼트 중 마지막에 등장하는 div 엘리먼트
p:nth-of-type(2) { } //p의 “형제” 엘리먼트 중 2번째로 등장하는 p 엘리먼트
...
부정 셀렉터
input:not([type=”password”]) { }
div:not(:nth-of-type(2)) { }
정합성 확인 셀렉터
input[type=”text”]:valid { }
input[type=”text”]:invalid { }
레이아웃: 화면을 나누는 방법
HTML 구성하기
수직 분할: 화면을 수직으로 구분하여, 콘텐츠가 “가로”로 배치될 수 있도록 요소를 배치
수평 분할: 화면을 수평으로 구분하여, 내부 콘텐츠가 “세로”로 배치될 수 있도록 요소를 배치
- 수평으로 구분된 요소에 height 속성을 추가하면 직관적인 배치 가능
→ CSS로 화면을 구분할 때에는 수직 분할과 수평 분할을 차례로 적용해서 만든다
ex) [코드] 레이아웃을 고려해 작성한 HTML 파일
<div id="container">
<div class="col w10">
<div class="icon">아이콘 1</div>
<div class="icon">아이콘 2</div>
<div class="icon">아이콘 3</div>
</div>
<div class="col w20">
<div class="row h40">영역1</div>
<div class="row h40">영역2</div>
<div class="row h20">영역3</div>
</div>
<div class="col w70">
<div class="row h80">영역4</div>
<div class="row h20">영역5</div> //"row h20" 이런식으로 공백을 두고 쓰면 2개의 클래스를 하나로 합쳐서 적용가능한 효과
</div>
</div>
* 참고: 클래스 이름으로 지정된 w10, w20, w70, 또는 h20, h40, h80을 CSS로 구현
ex) [코드] 클래스 이름에 맞는 CSS 구현
.w70 { width: 70%; }
.h40 { height: 40%; }
→ 이런식으로 클래스 이름과 구현을 1:1 매칭시켜 아주 작은 단위로 CSS를 작성하는 기법: Atomic CSS 방법론(클래스 이름을 선언하는 방법론 중 하나)
레이아웃 리셋
HTML 문서는 기본 스타일을 가지고 있는데 이 스타일이 레이아웃 작업에 방해 요소가 되기도 함
ex)
* 박스 시작을 (0,0) 위치에서 하고 싶은데 <body> 태그의 기본 스타일로 인한 여백 문제
* width, height 계산이 여백을 포함하지 않는 문제
* 브라우저마다 상이한 여백과 글꼴 등
→ 그래서 레이아웃 리셋 작업이 필요. 문제 해결을 위한 몇줄의 코드만 적용 시키면 기본 스타일링이 제거됨
ex) [코드] 기본 스타일링을 제거하는 CSS 코드의 예시
* {
box-sizing: border-box;
}
body {
margin: 0;
padding: 0;
}
Flexbox로 레이아웃 잡기
flex라는 CSS 속성이 무엇을 뜻하는가?
display: flex 분석하기
부모 박스요소에 display:flex를 적용하여 자식 박스의 방향과 크기를 결정
기본값으로 display:flex가 적용된 부모 박스의 “자식 요소”는 “왼쪽”부터 차례로 이어 배치됨
[코드] "display: flex"를 적용시키는 예시를 위해 작성한 HTML 코드
<div id="outer">
<div class="box">box1.target</div>
<div class="box">box2</div>
<div class="box">box3</div>
</div>
[코드] HTML의 div 요소를 선택하여, 부모요소에 "display: flex"를 적용한 예시(CSS)
#outer {
display: flex;
border: 1px dotted red;
padding: 10px;
}
.box {
border: 1px solid green;
padding: 10px;
}
Flex 요소에 방향 지정(flex-direction)
flexbox는 박스가 수직으로 분할되는 것(수직 분할: 컨텐츠가 가로로 이어짐)이 기본값.
→ 방향을 설정해주면 수평 분할도 가능
→ flex-direction 속성을 “부모” 박스 요소에 적용
→ 주요 속성으로 row(기본값), column
#outer {
display: flex, column; // column으로 수평 분할시킴 //부모 요소인 display: flex에 적용
border: 1px dotted blue;
padding: 10px;
}
.box {
border: 1px solid green;
padding: 10px;
}
반드시 알아두기: grow(팽창 지수), shrink(수출지수), basis(기본 크기)
자식 박스에 어떤 속성도 주지 않으면 왼쪽에서부터 오른쪽으로 콘텐츠의 크기만큼 배치됨
다음과 같은 기본 값이 적용됨flex: 0 1 auto
flex: <grow> <shrink> <basis>
[코드] 자식요소에 flex 속성을 추가하지 않으면 적용되는 기본값
flex: 0 1 auto; // flex: <grow> <shrink> <basis>
→ flex속성에 적용되는 3가지는 “기본크기”를 바탕으로 필요에 따라 늘리거나 줄일 수 있는 값이 적용
→ grow, shrink 속성은 단위가 없고 비율로 계산됨
부모 박스 안에 n개의 자식 박스가 있다고 가정합니다. 각 자식 박스가 갖는 grow값의 총 합이 n이라면, grow 속성의 값을 1로 설정하는 것은 1/n 가로 또는 세로길이를 적용한다는 의미입니다. grow 속성의 값을 2로 지정하면, 2/n의 길이를 의미합니다
flex 속성의 하위 속성
grow: 박스 늘리기
→ flex-grow 속성에 적용하는 값은 비율을 의미
shrink: 박스 줄이기
→ grow와는 반대로 설정한 비율만큼 박스 크기가 작아짐
그러나 flex-grow 속성과 flex-shrink 속성을 함께 사용하는 일은 추천하지 않습니다. 비율로 레이아웃을 지정할 경우 flex-grow 속성 또는
flex: <grow> 1 auto
와 같이 grow 속성에 변화를 주는 방식을 권장
→ flex-grow 속성으로 비율을 변경하는 경우, flex-shrink 속성은 기본값인 1로 두어도 무방
basis: 박스의 기본 크기
→ 자식 박스가 flex-grow나 flex-shrink에 의해 늘어나거나 줄어들기 전에 가지는 기본 크기
flex-grow 속성의 값이 0인 경우에만 flex-basis 속성의 값이 유지됨
ex) basis를 적용한 CSS 예
/* grow를 0으로 설정해줘야 100px 이상으로 늘어나지 않습니다. */
.left {
flex: 0 1 100px;
}
/* 우측 박스는 grow를 1로 설정해 나머지 공간을 채워줍시다 */
.right {
flex: 1 1 auto;
}
참고)
* width와 flex-basis 를 동시에 적용하면 flex-basis가 우선
* 콘텐츠가 많아 자식 박스가 넘친다면 width가 정확한 크기를 보장 못함
* (flex-basis를 사용하지 않는 경우) 자식 박스가 넘치는 경우를 대비해 width 대신 max-width 사용
콘텐츠 정렬 방법
flexbox 제어를 위한 axis(축)에 대한 이해
→ axis는 main axis와 cross axis로 구분됨
→ axis는 flex-direction 속성에 따라 반전될 수 있다(row, colunm)
→ 기본값인 row 상태이면 main axis: 가로축/cross axis: 세로축
(axis를 기준으로 한 정렬 속성)
* justify-content: “main” axis를 기준으로 정렬
* align-content: “cross” axis를 기준으로 정렬
콘텐츠 수평 정렬(justify-content): flex-direction이 row 기본값인 경우
부모 박스에 해당 속성을 적용하면 자식 박스를 수평 정렬시킴
→ 주요 속성값
flex-start
flex-end
center
space-between
콘텐츠 수직 정렬(align-content)
부모 박스에 align-items 속성을 적용하여 자식 박스를 수직 정렬시킴
→ 주요 속성값
flex-start
flex-end
center
stretch
Bare minimum requirements
VS Code 레이아웃 클론 만들어 보기
웹 앱 화면 설계하기
학습목표
* 앱의 와이어프레임 구성
* 와이어프레임을 HTML로 코딩
* div 태그 또는 section, header 등의 시맨틱 태그로 영역을 구분하는 이유
* HTML 문서에서 언제 id 혹은 class를 사용하는지?
와이어프레임 설계 및 목업 구현
와이어프레임(Wireframe)
레이아웃의 뼈대를 그리는 단계
→ 아주 단순하게 레이아웃과 제품의 구조를 보여주는 용도
→ 처음에는 화면의 영역을 구분하는 것을 목적으로 주요 태그를 메모하는 형식으로 작성해 볼 것!
목업(Mock-up)
목업이란 실물 크기의 모형을 뜻함. 여기서는 실제 제품이 작동하는 모습과 동일하게 “HTML 문서”를 작성
→ 예를 들면 트윗 작성자, 트윗 내용, 작성일자 등을 HTML 문서에 “하드코딩” 하는 것
하드코딩?
변수를 사용하지 않고 하나하나 수작업으로 직접 입력하는 코딩 방식(손 노가다?)
ex) 변수를 사용하지 않고 구구단 만들기
[코드] 하드코딩한 HTML 문서
<!-- 실제로는 어떤 로직에 의해서 적절한 위치에 값이 들어감 -->
<div class="writer">김코딩</div>
<div class="content">SNS는 인생의...</div>
와이어프레임과 목업 단계를 건너 뛰는 것은 마치 설계도 없이 건물을 짓는 것과 같다
HTML로 웹 앱의 구조 잡기
→ 네이버 뉴스 댓글 창을 예시로 생각!
1.큰 틀에서 영역 나누기
ex) 영역을 쓰기 영역/읽기 영역 으로 나누기
2.각 영역을 태그로 표현 하기
ex) 쓰기 영역
<div>
<div>댓글 9M</div>
<input type=”text” placeholder=”댓글을 입력해 주세요”>
<button>등록</button>
</div>
ex) 읽기 영역
<ul> //각각의 댓글이 unordered list 이므로 ul로 감쌌
<li>
<div>아이디명</div>
<div>댓글 내용</div>
<span>작성일자</span>
<button>
<img/>
</button>
<button>
<img/>
</button>
</li>
</ul>
id 및 class를 목적에 맞게 사용하기
id: 하나밖에 없는 스타일의 경우에 사용
class: 자주 사용되는 스타일의 경우에 사용
어떨 때는 id를 사용하고 또 어떨 때는 class를 사용하는지를 이해
→ 태그에 이름 붙이기 작업
id 고유(unique)한 이름을 붙일 때
class 반복되는 영역을 유형 별로 분류할 때
→ 즉, 고유한 것인지? 반복되는 것인지 파악!
→ id는 중복을 허용치x!
selector 표기법
id는 #
으로 class는 .
으로 표기
html 태그 selector(CSS에서 작성시)
======================================
<div id=”writing-sec”> div#writing-sec
<li class=”comment”> li.comment
태그에 이름 붙이기
ex) 쓰기 영역
<div id="writing-sec"> //1개만 있으므로 id든 class든 무방?
<div>댓글 9M</div>
<input id="new-comment-content" type=”text” placeholder=”댓글을 입력해 주세요”>
<button id="register">등록</button>
</div>
ex) 읽기 영역 //반복되는 부분이 많다→ class로 지정하여 동일한 유형임을 알 수 있음!
<ul id="comments"> //각각의 댓글이 unordered list 이므로 ul로 감쌌 //읽기 영역은 고유하므로 id해도됨
<li class="comment">
<div class="username">아이디명</div>
<div class="content">댓글 내용</div>
<span class="createAt">작성일자</span>
<button class="voteUp">
<img/>
</button>
<button class="voteDown">
<img/>
</button>
</li>
</ul>
Sprint – Twittler 목업 만들기
flex-grow/shrink/basis 에 대한 요약 정리
grow: 아이템이 늘어나서 여백을 채우는 늘어나는 비율에 대한 속성
shrink: 공간이 부족할 때 각 아이템의 사이즈를 얼마까지 줄일 것인지 속성
(0이면 브라우저 창 줄이면 줄인만큼 안보이는데 1하면 창 줄이는만큼 그 사이즈도 상대적으로 작아짐)
basis: 아이템의 기본 크기
css 라이브러리 사이트
bootstrap
material-ui
유용한 사이트들
핀터레스트: 와이어프레임 작업에 유용
figma: 목업 작업에 유용
codepen: html, css 작업에 유용
css-tricks.com: flex박스 속성에 대한 이론 내용
html 자동 완성 기능
html 작성시 `!탭` 누르면 자동완성된 html껍데기가 나온다(vscode)
html에서 2개의 클래스를 동시에 쓸때는 띄워쓰기 “ “를 이용하면 된다
.a .b {
}
css의 부모 박스 속성 vs 자식 박스 속성
<부모 박스에 적용할 수 있는 속성들>
display
flex-direction
flex-wrap
flex-flow
justify-content
align-items
align-content
<자식 박스에 적용할 수 있는 속성들>
order
flex-grow
flex-shrink
flex-basis
flex
align-self
hover 속성
마우스를 롤오버 했을 때 나타나는 속성
해당엘리먼트: hover { }
ex) a:hover 의 형태
.tweetUser:hover {
/* 마우스를 올렸을때 반응되는 것 */
color: aqua;
}
'SE Bootcamp 내용 정리' 카테고리의 다른 글
js/node - spread/rest 문법 (0) | 2021.09.09 |
---|---|
js/node - 자료형, 스코프, 클로저 (0) | 2021.09.08 |
js/node - 배열, 객체 checkpoint (0) | 2021.09.06 |
js/node - 배열, 객체 (0) | 2021.09.03 |
git 기초 (0) | 2021.09.02 |