본문 바로가기
개발 공부 일지/HTML_CSS

CSS : 레이아웃

by yelimu 2024. 7. 5.

기본 배치 : normal position (block, inline...)

 

1. Position

2. Flexbox

3. Grid


position 속성이 갖는 속성값 -> 위치 기준을 잡는건 position

"static" : position 속성을 지정하지 않았을때의 기본값 / 일반적인 글의 흐름 

"relative"

"absolute"

"fixed"

"sticky"

 

구체적인 위치는 top/right/bottom/left 속성을 쓴다 : px, 값이 마이너스면 영역 바깥쪽방향

{position : relative 

top: 30px }

=> 원래 있어야할 위치(지금 위치~)에서 top 방향(영역 안쪽)으로 30px 이동

: static -> relative 로 바꿔줘도 원래 위치를 유지한다. 

 

position : static & margin 을 주면 다른 요소까지 같이 움직임

position : relative & 위치별 값을 주면 다른 요소에는 영향을 주지 않음 (겹쳐 보이기도)


position : absolute

가장 가까운 포지셔닝이 된 조상 요소를 기준으로 위치를 잡는다?

조상 요소의 영역 경계선을 기준으로 설정됨

ex. 자식요소의 bottom : 10px 주면 부모 요소의 bottom 라인에서 10px 떨어진 곳으로 이동 

부모가 static position 이면 건너뛰고 그 다음 부모요소를 기준으로 함 --- 왜지

포지셔닝 : 명시적으로 position 을 지정한 경우 포지셔닝 했다 고 한다.

 

원래 배치에서 아예 자리 차지를 하지않음

크기를 정해주지 않으면 : 안에 있는 내용(text..) 만큼의 크기를 갖는다. 내용이 없으면 화면에서 안보임

left / right 양쪽 위치를 정해주면 그거에 맞는 크기로 생성이 됨 

absolute 요소에 상하좌우 모두 0px 주면 부모 요소를 가득 채우게 됨

= inset : 0 동일 (상하좌우에 같은 값을 줄때 사용)


position : fixed 

브라우저 창을 기준으로 상/하/좌/우 위치를 적용

원래 있던 자리와 상관이 없음 (다른 요소들이 이 요소가 원래 있던 자리를 채운다) (absolute와 같은 성질)

= 기존 배치에서 자리를 차지하지 않음 

네비게이션에 많이 쓰임 or 챗봇?

내용이 없으면 화면에서 안보임 (absolute와 같은 성질)

 

뒤에있는 내용을 가릴수도 있음 = > 기존 내용 영역에 위쪽 마진을 주어야함


position: sticky

맨 위에 배너(광고 등) + 그 밑에 nav bar 가 있을때 스크롤을 내리다가 배너가 가려지고 nav bar 가 최상단에 위치했을때부터 nav위치가 고정되도록(fixed처럼) 

 

position : sticky 

top: 0 => 브라우저 영역 기준, top 방향으로 0 px 위치가 됐을때 고정시킨다는 의미

 

원래 위치에서 자리를 차지한다 (static같은 성질) & 부모 요소에 소속되어있다 = 부모 요소 밖으로는 나가지 않는다

= 부모요소 컨텐츠가 끝나는 영역에서는 더이상 보이지 않음 

 

여러개 소제목이 각 컨텐츠 상단에 달라붙게 만들수 있음


z-index : 요소가 겹쳐질 때 앞뒤 순서를 정해줌

기본적으로는 코드가 밑에 있는 요소가 앞쪽에 표현된다 -> 따라서 동일 z-index를 갖는 요소들은 코드 위치로 판단

z-index : 1; (단위 없음. 숫자가 클수록 더 앞쪽에 보임. 음수도 가능)

기본값: auto = 0

 

but.. 단순히 z index 만 비교해서 순서를 정하는것은 아님

쌓임 맥락 을 고려한다 (z-index를 묶어서 생각하는 범위) 

부모 요소의 자식 요소는 부모와 같은 z-index를 갖는다 

쌓임 맥락이 만들어지는 조건이 있다... 

쌓임 맥락 안에서는 z-index에 따라 순서 정해짐

원하는 대로 순서가 적용되지 않는다? 쌓임맥락이 만들어진거임 -> 요소 위치를 쌓임 맥락 밖으로 바꿔준다


display : flex

배치할 방향 : flex-direction 

정렬하기 : justify-content, align-items

요소가 넘칠때 : flex-wrqp

요소 간격 : gap

크기 늘이거나 줄이기 : flex-grow, flex-shrink, flex-basis(크기 정하기)

 

flex-direction 

(기본값) row : 가로방향으로 배치(왼->오)

row-reverse : 오른쪽->왼쪽 

column : 세로방향(위->아래) (display :block 처럼  배치)

column-reverse : 아래-> 위 

 

요소가 정렬되는 방향을 기본축 Main Axis / 수직방향을 교차축 Cross Axis 라고 한다

요소는 기본적으로 기본축 방향으로 순서대로 배치되고 / 교차축 방향으로는 꽉 채워서 배치된다.

 

기본축 방향에서 정렬할땐 : justify-content

속성값 

center 

flex-end : 맨 끝쪽으로 정렬

flex-start : 맨 앞으로 정렬 (기본정렬)

space-around : 모든 요소의 앞 뒤로 같은 간격으로 정렬(padding처럼)

space-between : 양 끝 요소를 가장자리에 배치하고, 나머지 요소를 동간격으로 

space-evenly: 빈공간의 크기가 모두 동일하도록 


교차축 정렬 : align-items 

속성값

center -> flex 설정 시 교차축 방향으로 꽉 채워 배치되던 상태에서 요소의 원래 크기로 변함 & 가운데 정렬 

flex-end

flex-start

stretch : 늘려서 배치 (높이 지정해주지않은 요소만)

 

main axis -> justify-content
cross axis -> align-item

한개의 div 영역안에 있는 '로고 이미지'와 '텍스트' 의 높이를 일정하게 맞추려면 align-item : center 


요소가 넘칠때

flex-wrap: wrap;  교차축 방향으로 넘어가서 배치된다... 

flex-direction: row일때는 다음 행으로 넘어가서 배치 /  column일때는 다음 열로 넘어가서 배치

/ 폭(길이)는 정해진 영역 내에서 나눠 갖는다

 

요소간의 간격을 동일하게( -> 맨 끝 요소에도 간격이 생긴다 )

gap: 00px;

gap: 00px 00px (세로 / 가로 : 메인축/교차축 이랑 상관없이 무조건 세로/가로) 

wrap 처리해서 줄이 넘어가도 똑같이 적용됨 

 

요소를 늘려서 빈공간을 꽉 채울때 

flex-grow: 0 (기본값)

1, 2 등 숫자를 쓰면 비례해서 요소의 크기(너비/  길이) 늘어나게됨

 

각 요소의 크기 합이 부모 영역 보다 클때 

flex-shrink: 1(기본값) 으로 되어있음 -> 부모 영역 내에서(넘치지않고) 각각 같은 크기로 채워진다 

flex-shrink값이 작을수록 차지하는 영역이 크다(?) / 클수록 많이 줄어든다 

값으로 0을 주면 내가 지정해준 크기에 고정 (영역과 다른 요소에 의해 작아지지않는다)


플렉스박스는 고정된 크기가 있는게 아니라 시작 크기최종 크기가 있다... 

시작 크기를 정해놓으면, 플렉스박스 안에서 유연하게 최종 크기가 결정된다. (개발자 도구에서 빗금친 영역 & 화살표로 표시해줌)

 

시작크기는 flex-basis  으로 정해줄 수 있다 :

지정하지 않으면 auto(기본값) -> width, height 를 참고해서 시작 크기를 정한다.

보통의 경우 문제 없지만 정확히 크기를 설정해줄때는 flex-basis 를 사용하자

flex: flex-grow flex-shirink flex-basis; 를 한번에 쓸수 있음

 

flex-grow: 1;
flex-shrink: 0;
flex-basis: 100px;

<=>

flex: 1 0 100px;


display: flex

position: relative/sticky -> flex box 안에서 배치//  absolute/fixed-> flex box와 무관하게 배치


Grid : row, column으로 이루어진 2차원 배열

grid line, grid cell 

display: grid

 

격자 나누기 grid-template-rows(또는 columns)

간격 gap (세로 가로)  

크기 미리 정하기 grid-auto-rows (또는 columns)

원하는 위치에, 여러칸에 걸쳐서 배치 grid-row(columns), span

이름으로 배치 grid-area, grid-template-areas


grid-template-columns : 100px 300px 100px;

=> 열 너비(100, 300, 100)를 갖는 칸 세개가 만들어짐

 grid-template-rows: 100px 200px 200px;

=> 줄 높이 (100, 200, 200) 로 나뉘어짐 => 총 9개의 그리드 셀이 생성됨

요소가 들어가있는 순서대로 채워진다 

 

한번에 쓰는 방법 : row 먼저 쓰고 / columns ;

grid-template: 100px 200px 200px / 100px 300px 100px;

 

grid 로 지정한 div 크기가 달라지면-> grid 크기는 정해져있기때문에 영역을 벗어나거나 공백이 생김 

 

상대적인 값을 나타내는 단위 fr (fraction) 

1fr, 1fr, 1fr -> 1:1:1로 생성됨 

 

함수를 이용할 수도 있다

repeat(3, 1fr) -> 1fr 3개 

minmax(0px, 0px) -> 최소 최대값 안에서만 크기가 변함

최대값에는 fr 단위를 쓸수도 있음 

repeat과 minmax결합도 가능

 


columns 만 원하는 개수/너비로 나눠놓고 row는 알아서 배치하고싶을때

 

grid-auto-rows : 00px -> 높이 00px를 갖는 그리드 셀이 만들어진다. 

 

grid-template 에서 rows 정보가 명시적으로 정하지 않았을때 grid-auto-rows값을 가져다쓴다

여러개의 값을 적으면 반복하면서 적용됨

ex. grid 영역 내 요소 가 15개가 있다면

grid-template-columns : repeat(3, 1fr);

grid-auto-rows: 50px, 100px, 200px; 

=> 균등하게 나눠진 3개의 칼럼 & 높이가 50->100->200->50px 로 반복되는 5줄에 요소가 순서대로 배치된다 


그리드 라인 숫자를 기준으로 요소를 원하는 위치에 배치할 수 있다

가장 앞쪽라인(테두리 포함) 1부터 시작 -> +1씩 늘어남. 맨 마지막 줄부터 -1, -2, -3, ... 으로 표현할 수 있다

grid-row: 3;

grid-column : 2 ;

=> 3과 2가 만나는 지점부터(?) 요소가 자리한다 

 

영역으로도 선택이 가능하다 

1) 그리드 라인 번호

grid-row: 3 /5 ; 

grid-column : 2 / -2; 

2) 그리드 라인 + span

grid-row: 3 / span2; => 3부터 2칸 차지


각 영역에 grid-area 속성으로 이름을 붙인다

grid-area : a ; 

grid-area : b ; 

grid-area : c ; 로 해놓고

 

grid 요소로 돌아가서

grid-template-areas:

"a b"

"a c" 이렇게 하면 田 모양에 맞게 채워짐;;;

'개발 공부 일지 > HTML_CSS' 카테고리의 다른 글

input:focus border 스타일 지정이 안된다면?  (0) 2024.07.10
Font awesome 적용하기  (0) 2024.07.08
HTML 핵심개념  (0) 2024.07.04
Cascading이란?  (0) 2024.07.04
HTML/CSS 웹페이지 작성하기  (0) 2024.07.02