Css 3) Study

[웹코딩 가이드] 홈

이제 웹 코딩을 배우기 위한 긴 여정을 시작합니다.. diagram-arrow-down

Web 표준html로 웹사이트 틀을 만들고, Css로 꾸며주고, Javascript로 동작시키는데.. 이것들은 각각 분리하여 작성되어야 나중에라도, 누구라도,, 알아보기 쉽고 유지 관리에도 도움이 된다!


이 페이지는 Css 코딩 입문자를 위한 기초 가이드입니다만, html/Css, Javascript 등의 웹 프로그래밍 전반에 걸쳐 본격적으로 학습하고자 한다면; MDN의 문서를 찬찬히 살펴보시기를 권합니다..


Css 포지셔닝

대부분의 경우, 어떤 요소의 컨테이닝 블록은 가장 가까운 블록레벨 부모요소의 컨텐츠 영역이 되지만, 반드시 그런 것만은 아니다. 예컨대, Css 포지셔닝을 사용하면 요소가 문서의 일반 흐름에서 동작하는 방식과 다른 관계를 설정할 수 있게 된다 - 곧, 특정 요소에 position 속성을 써서 문서의 일반 흐름에서 벗어난 다른 위치로 이동시킬 수 있는 것이다!

포지셔닝
기본적으로 박스는 문서의 일반 흐름 순서대로 배치되는데(기본값인 static), 박스간 마진병합 현상이 일어난다 여기서는 좌표값은 사용할 수 없고, 플로팅에 의한 좌우 배치만 가능하다!

* 우선, 이 예제를 통해 포지셔닝 개념에 대한 개괄적 감을 잡아보십시오.. (초기 모습은 기본값인 Static 상태입니다) RelativeAbsolute에 관해서는 밑에서 참조하십시오..

여기 있지롱 ~

참고로, 위 옵션 중 Fixed의 모습은 화면 우측 상단에서 찾아보시고(스크롤해도 그 자리에 고정됨), Sticky는 (처음엔 초기 모습과 같지만)화면을 위로 스크롤하여 뷰포트 상단에 이르면 작동됩니다!

1. position: relative;는 문서의 일반 흐름대로 배치하되, 좌표값을 써서 일반 흐름상의 원래 위치로부터 (요소 자신을)상대적으로 (양수는 오른쪽 및 아래쪽 방향으로, 음수는 그 반대 방향으로)이동시키고, 다른 요소와 겹치도록 만들 수 있다

p1

p2 position: relative; top:50px; left:50px;

                                    
                                        
                                    
                                

position: relative; top: 50px; left: 50px;는 (요소 자체가 윈래 나타나야 할 위치에서 상대적으로)위로부터 50px, 좌측으로부터 50px 떨어져서 배치된다!

2-1. position: absolute;는 요소를 문서의 기본 흐름에서 벗어나 (가장 가까운 컨테이닝 블록의 좌상단을 기준으로 하는)좌표값을 써서 배치한다 이때, 특정 상위 부모요소에서 position: relative;로 설정해주면(곧, 컨테이닝 블록으로 지정해주면); 그 부모요소를 기준으로 하는 절대 위치에 자리잡게 되는 것이다!
h5

position: absolute;는 요소를 문서의 기본 흐름에서 벗어나 (가장 가까운 부모요소의 좌상단을 기준으로 하는)좌표값을 써서 배치한다. 이때, 상위 부모요소에서 position: relative;로 설정해주면; 그 부모요소를 기준으로 하는 절대 위치에 자리잡게 되는 것이다!

☞ 아래쪽 문단 ← 위쪽에 생겨난 빈 공간으로 끌어올려지게 된다!

                                    
                                        
                                    
                                

position: absolute;는 요소를 문서의 기본 흐름에서 벗어나 (가장 가까운 컨테이닝 블록의 좌상단을 기준으로 하는)좌표값을 써서 배치하며, 이에 해당 요소 주변의 모든 컨텐츠는 해당 요소가 남긴 나머지 공간을 채우도록 재배치된다!

2-2. absolute는 부모 요소의 영역에 겹쳐서 배치되므로, 위쪽에 배치된 요소가 아래쪽 문단(위 문단이 빠진 자리로 올라가서 자리잡게 된다!)과 겹쳐지는 것을 막으려면; 위쪽 요소(예컨대 위 코드의 <h5>)에서 그에 맞게 적절한 패딩을 주어야 한다!
h5

position: absolute;는 요소를 문서의 기본 흐름에서 벗어나 (가장 가까운 부모요소의 좌상단을 기준으로 하는)좌표값을 써서 배치한다. 이때, 상위 부모요소에서 position: relative;로 설정해주면; 그 부모요소를 기준으로 하는 절대 위치에 자리잡게 되는 것이다!

☞ 아래쪽 문단 ← 위쪽에 생겨난 빈 공간으로 끌어올려지게 된다!

                                    
                                        
                                    
                                

위 코드는 부트스트랩의 패딩 유틸리티를 써서 <h5> 요소에 아래쪽 패딩을 주었다: <h5 class="pb-5">h5<h5>


* cf) 특정 요소에 position: relative; 값을 추가하면; position: absolute; 값을 가진 모든 자식요소의 컨테이닝 블록이 된다. 이는, 자식요소에 position: absolute; 값이 적용되는 경우; 기존의 상위 부모요소 대신 이 relative 요소 아래로 재배치됨을 의미한다!


이러한 특성은, 일반 흐름에서 요소를 완전히 제거하고, 대신 컨테이닝 블록의 가장자리(좌상단 모서리)로부터의 오프셋을 사용하여 요소를 배치할 때(예컨대, 화면 밖에 숨어 있지만, 버튼을 클릭하여 나타나고 사라지는 패널창 등)에 유용하게 사용된다!

3. position: fixed;는 화면 스크롤과 무관하게 뷰포트의 현재 위치에 고정한다 - 문서의 흐름과 무관하게 좌표값을 써서 원하는 위치에 배치하는데, 그 기준은 body가 된다
Position: fixed;
                                    
                                        
                                    
                                
                                    
                                        /* ---
                                            .h5-fixed {
                                                position: fixed; top: 0px; right: 120px; background-color: transparent;
                                            }
                                        */
                                    
                                

여기서는 위 Css 스타일을 잠시 잠궈뒀습니다(풀어주면; 스크롤 시 우측 상단에 고정된 채 계속 떠있으면서 시선을 혼란스럽게 하기에 ㅡㅡ;) 위 Css의 주석을 풀어주고 스타일시트에 추가하여 결과를 확인해보십시오..


* cf) 이는 컨텐츠가 스크롤될 때도, 항상 화면의 같은 위치에서 떠다니는 탐색 메뉴창, 메시지창, 광고창 등을 만드는 데 유용하게 사용된다. 예컨대, 웹페이지 탐색 시 상단 내비게이션바나 하단 바닥글, 좌우측 사이드바 등이 고정되어 있는 경우를 흔히 접하게 되는데, 이러한 각 방면 고정바는 position: fixed; 속성과 박스 좌표, 너비(및 높이) 값을 써서 만들게 된다

컨테이닝 블록

요소의 크기와 위치는 의 영향을 받는 경우가 많다 - 예컨대, %를 사용한 widthheight, paddingmargin 값, absolutefixed 로 설정된 요소에서의 오프셋 값들은 자신의 컨테이닝 블록을 기준으로 하여 계산되는데, 이 컨테이닝 블록은 position 속성의 값에 따라 극명하게 달라지게 된다!

박스 좌표 설정하기
박스 좌표는 자신을 품은 부모요소(곧, 컨테이닝 블록)의 좌상단 모서리를 기준점으로 삼아 top/right/bottom/left: 값; 속성으로 설정하는데, 부모요소 박스의 원점(= 좌상단 모서리)을 기준으로 상/우/하/좌로부터의 (양수는 박스 안쪽으로, 음수는 박스 바깥쪽으로의)오프셋 거리값 을 의미한다
left: 0; top: 0;
left: 0; bottom: 0;
right: 0; top: 0;
right: 0; bottom: 0;
left: 300px; top: -20px;
right: 300px; bottom: -20px;
                                    
                                        
                                    
                                
                                    
                                        #ex_position-div { /* 부모 div 박스 position: relative; */
                                            position: relative; height: 200px;
                                        } #ex_position-div div { /* 내부 div 박스들 position: absolute; */
                                            position: absolute; width: 150px; height: 50px;
                                        }
                                    
                                

위 코드에서, position: absolute;로 지정된 자식 div 요소들의 좌표는 position: relative;로 지정되어 있는 부모 div 요소의 좌상단 꼭지점을 기준으로 한다 - 곧, position: absolute;로 지정된 요소는 가장 가까운 (fixed, absolute, relative, sticky로 설정된)부모요소를 자신의 컨테이닝 블록으로 삼게된다!

컨테이닝 블록
기본적으로(positionstatic/relative/sticky 인 경우) 컨테이닝 블록은 가장 가까운 부모요소(inline-block, block, list-item 요소), 또는 가장 가까우면서 서식 맥락을 형성하는 조상요소(table, flex, grid, 혹은 블록 컨테이너 자기 자신)의 컨텐츠 영역 경계를 따라 형성된다:

* cf) 위 정적 컨테이닝 블록 예제에서 <section>에다 style="display: inline;" 속성을 준다면 어떻게 될까요?

positionabsolute인 경우; 컨테이닝 블록은 position 속성 값이 static이 아닌 가장 가까운 (fixed, absolute, relative, sticky로 설정된)부모요소의 내부 여백 영역이 되며(), positionfixed인 경우; 컨테이닝 블록은 뷰포트나 웹페이지 영역이 된다()

* cf) 참고로, positionabsolutefixed인 경우, transform이나 filter 등의 가장 가까운 조상요소의 내부 여백 영역이 컨테이닝 블록이 될 수도 있다:

스티키 고정
요소에 position: sticky; 값을 주면; 해당 요소는 설정된 (뷰포트 기준)오프셋에 도달할 때까지는 일반 흐름으로 스크롤되다가, 설정된 오프셋 지점에 이르면 position: fixed; 값을 준 것처럼 그 위치에 고정된다 - 곧, 뷰포트가 해당 요소를 지나쳐가며 스크롤할 때에도 요소 자체는 설정된 오프셋 값에 맞춰 자기 자리를 고수하는 것이다!
코딩 입문하기
  1. html 입문
  2. Css 입문
  3. 코딩 가이드
Css 3) 시작하기
  1. Css 선택자 기본
  2. Emmet 코딩
  3. Css 스타일링
                                                    
                                                        
                                                    
                                                
                                                    
                                                        .h5-Sticky {
                                                            position: sticky; top: 0; left: 0; /* Sticky 고정이 설정된 뷰포트 기준 오프셋 좌표 */
                                                            margin: 0 auto; padding: 1em;
                                                            color: white; background-color: rgb(63, 79, 63);
                                                        }
                                                    
                                                

Css 3) z-Index

Css에서 는 브라우저의 3차원 공간인 z축(x축: 가로, y축: 세로)을 기반으로 요소의 레이어 겹침 순서(곧, 어느 요소가 사용자의 눈에서 더 가까이 있는가)를 정하는데, 포지셔닝 기본값인 static 을 제외한 relative, absolute, fixed 에서 번호순으로 요소를 위로 겹쳐서 배치하게 된다

일반 문서에서의 쌓임맥락
같은 부모요소 영역 내에서, 포지션이 지정되지 않은 요소는 포지션이 지정된 요소 이전에 우선적으로 렌더링된다

(! 맨 밑에는 부모요소의 배경과 테두리가 깔린다)

[DIV #4]

position: absolute; opacity: 0.7;

[DIV #5]

같은 부모요소 영역 내에서, 포지션이 지정되지 않은 요소(DIV #5)는 (코드 순서상 나중에 나오더라도)포지션이 지정된 요소((DIV #4)) 이전에 우선적으로 렌더링 된다!

                                    
                                        
                                    
                                

곧, 포지션이 지정되지 않은 요소(DIV #5)는 (문서 흐름상 나중에 나올지라도 )포지션이 지정된 요소(DIV #4) 밑에 깔린다!

한편, 포지션이 지정된 요소들끼리는; 일반 요소들과 마찬가지로, (주어진 포지션 값들과 무관하게)문서의 흐름상 순서대로 (아래, DIV #1 -> DIV #2 -> DIV #3 -> DIV #4)쌓이게 된다

(! 맨 밑에는 부모요소의 배경과 테두리가 깔린다)

[DIV #1]

position: absolute; opacity: 0.7;

[DIV #2]

position: relative; opacity: 0.7;

[DIV #3]

position: relative; opacity: 0.7;

[DIV #4]

position: absolute; opacity: 0.7;

[DIV #5]

같은 부모요소 영역 내에서, 포지션이 지정되지 않은 요소(DIV #5)는 (코드 순서상 나중에 나오더라도)포지션이 지정된 요소 이전에 우선적으로 렌더링 된다!

                                                    
                                                        
                                                    
                                                
요소의 겹침 순서
z-index 값이 지정되지 않은 경우(즉, 기본값인 0); 문서에 나오는 소스코드 순서대로 1, 2, 3, .. 순이 된다 - 곧, 나중에 작성된 요소가 먼저 작성된 요소를 덮는다

[부모요소 div]

먼저 작성된 p 문단입니다

나중에 작성된 p 문단인데, 음수 마진을 주었습니다!

                                    
                                        
                                    
                                

위 코드에서는 부모요소 <div>보다 두 자식요소 <p>가 나중에 작성되었습니다 - 곧, z-index가 없는 경우, 나중에 작성된 요소가 위로 올라옵니다!

반면, z-index 값을 음수로 주면; 일반 정적(Static) 요소의 밑으로 들어가게 된다

[부모요소 div]

위 말만 믿고 z-index-1 값을 주었는데.. 음~ 소용없네요 ㅡㅡ;

                                    
                                        
                                    
                                
1. 일반 흐름에서 z-index에 특정 값을 설정했는데 작동하지 않는다면; 요소의 position 값을 기본값인 static 이외의 값으로 설정해주어야 한다 이는 가장 흔히 일어나는 z-index 관련 혼동이다!

[부모요소 div]

드디어.. 저는 제 부모님 품을 벗어났습니다!

                                    
                                        
                                    
                                

자식요소에 (static 이외의)position 값을 주어야 한다는 말의 요점은, 자식요소의 z-index 값은 자식요소의 '직계' 부모요소에게만 의미가 있다는 것이다!


* cf) 문서의 일반 흐름에서와는 다른 쌓임 순서를 적용하고자 한다면; 먼저 부모요소 내부 자식요소에서 (staticauto 외의)position 값을 설정해주고 z-index 값도 지정해주어야 한다 - 곧, z-indexposition이 설정된 요소에 대해서만 자신의 존재 의의가 있다!

2. 플렉스박스나 그리드에서는 굳이 position: relative;를 추가해주지 않아도 플렉스나 그리드 항목의 z-index 값을 변경할 수 있다

[부모요소 div]

플렉스박스 안에서, 좀 더 간단하게.. 이제 저는 제 부모님 뒤에 숨었습니다!!

                                    
                                        
                                    
                                

플렉스박스나 그리드에서는 이러한 기능이 자체 내장되어 있다!

3. 부모요소에 position 설정(과 함께 z-index 값)을 설정해주면; 새로운 스택 컨텍스트가 생성되며, 이 안에서는 자식요소의 z-index 값을 -999 까지 설정해주더라도 여전히 부모요소보다 밑에 놓일 수는 없다 - 곧, 이 자식요소는 새로운 스택 컨텍스트의 일부이기에 결코 부모요소로부터 벗어날 수 없다!
[부모요소]
이제 저는 다시 제 부모님에게 묶였습니다 ㅡㅡ;
                                    
                                        
                                    
                                

부모요소 <div>에서의 z-index 값도 반드시 필요합니다! 아니면? 직접 코드를 제거한 뒤 확인해보십시오..

스택 컨텍스트

스택 컨텍스트란 하나 이상의 자식요소를 포함하는 상위요소를 말하는데, 내부 자식요소들은 소스 순서 규칙에 따라 쌓이고, z-index 값은 이 부모요소 내에서만 자신의 존재 의의가 있다!

쌓임 맥락 계층구조
하나의 쌓임 맥락은 그 내부에 또 다른 쌓임 맥락을 포함할 수도 있고, 이는 전체 계층구조상의 쌓임 맥락에서는 통째로 하나의 묶음 단위로 움직이게 된다. 곧, 각각의 쌓임 맥락은 서로 독립적이어서, 어느 요소가 자기 영역 내에 자신의 컨텐츠를 쌓은 후에, 자신은 또 통째로 그 위 부모 컨테이너 영역의 쌓임 맥락 안에서 하나로 묶인 단일 단위로 작동하는 것이다 나아가, html 문서 내 모든 요소가 쌓임 맥락을 생성하는 건 아니므로, 쌓임 맥락의 계층구조는 html 문서 계층구조의 부분 집합이 된다!
1. 먼저, 맨 밑에 [부모요소] 컨테이너(<div class="container>)의 배경과 테두리가 깔리고, 내부 각 DIV 요소들은(모두 position 속성이 정의되어 있기에) 각각의 쌓임 맥락 속에서 문서의 일반 흐름 순으로(코드가 작성된 순서대로) 위로 겹쳐가며 표시된다

부모 컨테이너: 여기서는 쌓임맥락을 만들지 않았다!

[DIV #1] position: relative;
div #1-2 position: absolute;

* 이 div #1-2는 [DIV #1]의 컨테이닝 블록에 포함된다!

[DIV #2] position: relative;
DIV #2-2 position: absolute;

* 이 div #2-2는 [DIV #2]의 컨테이닝 블록에 포함된다!

                                    
                                        
                                    
                                

[DIV #1]과 [DIV #2]는 투명도를 1보다 적은 값으로 지정하였기에(background-color: rgb(167 169 173 / 0.7);) [부모요소] 내부에서 쌓임 맥락을 만든 것처럼 보이는 것인데, 이는 마치 z-index를 설정한 것처럼 보인다!

2-1. [div #1-2]에 z-index: 2; 값을 주었다: 이제, [div #1-2]가 맨 위로 올라온다!

부모 컨테이너: 여기서는 쌓임맥락을 만들지 않았다!

[DIV #1] position: relative;
div #1-2 position: absolute; z-index: 2;

* 이제, div1-2가 맨 위로 올라온다!

[DIV #2] position: relative;
DIV #2-2 position: absolute;

* 이 div #2-2는 [DIV #2]의 컨테이닝 블록에 포함된다!

                                    
                                        
                                    
                                
2-2. [div #2-2]에 z-index: 3; 값을 주었다: 다시, [div #2-2]가 맨 위로 올라온다!

부모 컨테이너: 여기서는 쌓임맥락을 만들지 않았다!

[DIV #1] position: relative;
div #1-2 position: absolute; z-index: 2;

* 이 div #1-2는 [DIV #1]의 컨테이닝 블록에 포함된다!

[DIV #2] position: relative;
DIV #2-2 position: absolute; z-index: 3;

* 이제, div2-2가 맨 위로 올라온다!

                                    
                                        
                                    
                                

[div #1-2]와 [div #2-2]는 서로 부모가 다르고, 따라서 형제가 아님에도 z-index 값을 써서 서로간 쌓임 순서를 바꾸었다 - 이는 [DIV #1]과 [DIV #2] 모두 z-index를 이용한 독자적 쌓임 맥락을 만들지 않았기에 [div #1-2]와 [div #2-2]는 둘 다 최상위 <div> 부모 컨테이너의 쌓임 맥락에 속해있고, z-index 값을 변경하여 쌓임 순서를 바꿀 수 있는 것이다!

3. [DIV #2]에 z-index: 1; 값을 주었다: 다시, [div #1-2]가 맨 위로 올라온다!

부모 컨테이너: 여기서는 쌓임맥락을 만들지 않았다!

[DIV #1] position: relative;
div #1-2 position: absolute; z-index: 2;

* 여기서 문제는, div #2-2가 div #1-2보다 z-index 값이 높음에도 밑에 있다는 점이다!

[DIV #2] position: relative; z-index: 1;
DIV #2-2 position: absolute; z-index: 3;

* 이 div #2-2는 [DIV #2]의 쌓임 맥락에 포함된다!

                                    
                                        
                                    
                                

여기서 문제는, [div #2-2]가 [div #1-2]보다 z-index 값이 높음에도 밑에 있다는 점이다! 이는 [DIV #2]에 z-index: 1; 값이 설정됨으로 인해, [DIV #2]는 자식요소 [div #2-2]를 포함하는 자신만의 독자적인 Z-index 쌓임 맥락을 만들게된 때문이다. 반면, 독자적인 쌓임 맥락을 만들지 않은 [DIV #1]은 z-index의 쌓임 맥락 계층구조에서는 완전히 벗어나고, z-index: 2;가 설정되어 있는 자식요소 [div #1-2] 또한 z-index: 1;인 [DIV #2](& [div #2-2])의 쌓임 맥락보다 위에 자리잡게 되는 것이다. 결론적으로, [최상위 컨테이너](<div class="container>) 내부에서 (일반 흐름의)[DIV #1] -> (z-index: 1;인)[DIV #2](& [div #2-2]) -> (z-index: 2;인)[div #1-2] 순으로 겹쳐서 표시되는 것이다!


* cf) 참고로, 스택 컨텍스트를 위해 반드시 z-indexposition 속성을 써야만 하는 것은 아니다. (none 값 이외의)transform, filter, clip-path 등의 속성을 사용할 때도 스택 컨텍스트가 형성된다. 또한, 자식요소에서 1 이하의 opacity 값을 설정해줄 때도 (사실상의)스택 컨텍스트가 형성된다!

Css 오버플로

박스display 속성값, 설정된 박스 크기 및 박스 안 컨텐츠에 따라 다르게 동작한다. 이러한 컨텐츠는 자식요소에 의해 만들어진 더 많은 수의 박스일 수도, 또는 일반 텍스트 컨텐츠일 수도 있지만, 어느 쪽이건 간에, 이러한 컨텐츠는 기본적으로 박스의 크기에 영향을 미치게 된다!

박스 넘침처리: overflow
박스의 크기보다 컨텐츠의 내용이 너무 많을 때, 박스 바깥으로까지 컨텐츠가 넘쳐나는 가 발생하는데, 이는 컨텐츠 손실 방지를 위한 Css의 기본 메카니즘이 작동하여 모든 내용을 표시하고자 하는 때문이다! 컨테이너 박스 영역을 (블록레벨인)자식요소가 넘어서게 될 때 화면에 어떻게 나타낼 것인가? html은 기본적으로 자기 영역을 넘어서라도 넘치는 컨텐츠를 표시해준다(기본값인 visible)
  • overflow: hidden; 자기 영역에서 벗어나는 부분은 잘라낸다 곧, 자식요소의 해당 부분이 숨겨진다!
  • overflow: scroll; 항상 스크롤바를 표시한다
  • overflow: auto; 자기 영역을 넘칠 때만 해당 방향의 스크롤바를 표시한다
  • overflow-x/y: 값; x/y축 방향의 오버플로우 설정
  • overflow: x값 y값; x, y 각 방향의 오버플로우 설정

부모 컨테이너의 공간(이 작은 박스 - 거실 창문이라고 가정하자)은 크기가 정해져 있으며 변경되지 않는다. 따라서, 내부 자식요소(이 작은 박스 안의 내용 - 거실 안에서 거닐고 있는 자신의 모습을 상상해보라)를 부모요소의 작은 창문을 통해 다 보여주려면; 부모 컨테이너(곧, 창문의 크기)보다 더 큰 공간이 필요해진다. 이 거실 내부의 숨겨진 부분을 창문 바깥에서 어떤 방식으로 보도록 할 것인지를 정해주는 것이 바로 Css의 overflow 속성이다!

                                    
                                        
                                    
                                

* cf) 박스 내부 컨텐츠가 부모 박스에 설정된 크기를 벗어나게 되면; 내부 컨텐츠가 부모박스 바깥으로까지 넘쳐나는 오버플로우가 발생하게 되는데, 이에 대처하는 overflow 값이 visible 이외의 다른 값으로 설정되면; 가 형성되며, 이 오버플로우에 대처하여 박스에 설정되는 스크롤바는 기본적으로 패딩 영역에 자리잡게 되는데.. 이는 또한 전체 박스의 크기에도 영향을 미치게 되므로 유의할 필요가 있다 예컨대, 위에서 scroll 값을 넣었을 때 내부 컨텐츠 영역이 스크롤바 만큼 줄어든다!


결과적으로, 스크롤 설정된 박스의 내용은 그 자체의 미니 레이아웃이 되는데, 이는 박스의 모든 내용을 포함하되, 또한 페이지의 다른 항목과 겹치지 않도록 하기 위한 것이다 참고로, 오버플로우가 효력을 가지려면; 반드시 부모 컨테이너 박스의 높이(height 또는 max-height)가 설정되어 있어야 한다!

오버플로우와 가변 박스
예컨대, 빈 <div> 요소는 (블록레벨 요소이기에)전체 너비를 차지하지만, 높이는 제로이다 - 여기에 텍스트 등 컨텐츠가 들어가야 비로소 그 크기가 결정되는 것이다. 반면, 블록레벨 요소에 너비높이 를 설정해주면; (그 안에 어떤 내용이 들어가든 간에)박스 크기가 고정되는데, 이때 내부 컨텐츠가 박스 크기보다 더 커진다면; 박스 넘침overflow 현상이 발생하게 된다!
1. 박스는 display 속성, 지정된 크기 및 내부 컨텐츠의 양에 따라 다르게 동작하여 레이아웃에 영향을 미치게 된다. 이에, 외부 크기 조정을 사용하여 이를 제어하거나 내부 크기 조정을 사용하여 컨텐츠 크기를 기반으로 브라우저가 결정하도록 할 수도 있다. 우선, 박스가 외부 크기 조정을 사용할 때, 박스 범위에서 추가할 수 있는 컨텐츠의 양에는 제한이 있음에 유의해야 한다. 이는 아래 "Box is overflow!"이라는 문장을 넘치게 만든다:

Box is overflow!

                                    
                                        
                                    
                                
                                    
                                        .box { /* box의 외부적 크기 설정: */
                                            width: 300px; // 이것이 내부 자식요소 컨텐츠의 크기를 제한한다 ← 넘치면; 오버플로우가 발생한다!
                                            padding: 1rem 2rem; border: 10px dotted cornflowerblue; font-size: 5rem;
                                        }
                                    
                                

이렇게 오버플로우되는 현상을 방지하는 방법 중 하나가, 외부적 크기 지정인 width 값을 min-content 로 주어 내부 컨텐츠의 양에 따라 박스 크기가 신축적으로 변경되도록 해주는 것이다: .box { width: min-content; }

2. 아래 예제에서는 외부적으로 widthheight 값이 모두 지정되어 있고(width: 430px; height: 170px;), 이는 박스 내부의 모든 것에 엄격한 경계를 부여하여, 내부 이미지(400 x 116)가 박스보다 커져서 가시적으로 오버플로우하는 상황이 발생하지 않는 한 그대로 적용된다. 하지만, 내부 문장이 박스 크기를 초과하게 된다면?
눈내린불국사

이 문장이 박스를 넘쳐 오버플로우가 발생하는 경우, 체크해주세요:

                                    
                                        .box-demo { width: 430px; height: 230px; } /* 기본 설정된 외부 크기 */

                                        .box-demo[data-sizing="intrinsic"] { /* 토글 버튼이 눌리면; */
                                            width: max-content; height: max-content; /* 내부 컨텐츠 양에 따라 박스가 늘어난다! */
                                        }

                                        .box-layout {
                                            display: grid; grid-template-columns: 1fr min-content; gap: 0.5rem;
                                            width: max-content;
                                        }
                                    
                                

박스에 외부 크기가 주어져 있지만, 내부 크기 조정을 통해 컨텐츠(와 박스)를 더 많이 제어할 수 있다. 곧, 이 요소가 외부 크기 조정을 사용하는 경우 요소의 경계를 오버플로우하기 전까지 추가할 수 있는 콘텐츠의 양에 제한이 있지만, 내부 크기 조정 토글이 켜져 있는 경우에는 그렇지 않다 곧, 내부 컨텐츠를 오버플로우 없이 채울 수 있도록 박스가 커진다!

3. 박스의 크기를 고정할 때, 안의 컨텐츠에 의해 오버플로우가 일어나는 문제를 피하려면; min|max-width/height: 값; 속성으로 컨텐츠 영역의 최소|최대 크기를 추가적으로 설정하여 컨텐츠의 양에 따라 신축적으로 박스의 너비/높이가 늘어나고 줄어들도록 해줄 수 있다. 이는 또한 화면의 크기 변화에 따라 이미지가 잘리거나 퍼지는 문제를 제거하고자할 때에도 이용된다!
가변 이미지: 이미지 등의 멀티미디어 요소들은 너비와 높이 값을 지정하지 않은 경우; 기본적으로 원본 크기대로 삽입된다. 예컨대, <img> 요소는 그 이미지 파일 고유의 너비와 높이를 갖고 있고, (따로 크기를 정해주지 않은 한)그 크기대로 웹문서에 나타난다. 따라서, 브라우저 창의 크기가 변할 때도 이미지의 너비는 바뀌지 않으므로 브라우저 크기를 줄이면 이미지의 일부가 잘리고, 늘리면 화질이 저하되는 문제가 생겨난다!
width: 100%;로 주면; 화면 너비에 맞추어 늘어나거나 줄어들지만, 원래 크기 이상으로 늘어나면 이 또한 화질이 저하된다 - 이에 이미지를 감싸고 있는 부모 요소만큼만 커지거나 작아지도록 max-width: 100%;로 지정해주는 것이 바로 가변 이미지다!

                                    
                                        img { width: 100%; max-width: 100%; min-width: 75%; height: auto; }
                                    
                                

가변 이미지는 heightauto 값을 주어 너비에 따라 높이가 자동 조절되도록 해주는 것이 좋다. 나아가, min-width 속성으로 축소되는 너비 값을 제한해줄 수도 있다!


* cf) 스타일시트에서 body { width: 960px; margin: 0 auto; }와 같이 설정해주면; 해당 박스(여기서는, 웹문서 전체)는 브라우저 크기에 맞추어 가변적인 크기로 항시 화면 정중앙에 위치하게 되는데, 브라우저가 박스 크기보다 작아지는 경우에 대비하고자 한다면; max-width: 960px; 식으로 스타일을 추가하여 스크롤바가 생기는 대신 컨텐츠가 밑으로 내려가도록 해주면 된다!

플렉스 박스

로 작동시키기 위해서는; 먼저, 해당 요소들을 플렉스 컨테이너로 묶어준 뒤 display: flex; 속성값을 주어 플렉스박스임을 선언해주어야한다

플렉스박스 선언 및 정의
플렉스 박스로 작동시키기 위해서는; 먼저, 해당 요소들을 플렉스 컨테이너로 묶어준 뒤 display: flex;(또는, display: inline-flex;)로 플렉스박스임을 선언해주어야한다(이하, 가로쓰기 모드 기준임)

Flexbox

[플렉스 컨테이너]
플렉스박스로 작동시키기 위해서는; 먼저, 해당 요소들(= 플렉스 아이템)을 플렉스 컨테이너로 묶어준 뒤 플렉스박스임을 선언해주어야한다: div { display: flex; }
[주축]
주축플렉스 아이템들이 배치되는 방향이며(여기서는, 좌측에서 우측으로 나아간다), 이 기본축의 시작과 끝 가장자리는 main start/end 가 된다
[교차축]
교차축플렉스 아이템들이 배치되는 방향에 직각을 이루는 축이며(여기서는, 위에서 밑으로 내려간다), 이 교차축의 시작과 끝 가장자리는 cross start/end 가 된다
                                    
                                        
                                    
                                
이어서, 플렉스박스 내부 각 아이템들을 배치할 방향 및 넘칠 시의 대처 방식을 지정해준다: flex-flow: flex-direction flex-wrap; flex-flowflex-direction: 값;flex-wrap: 값으로 나누어 각각 따로 설정해줄 수도 있다
  • flex-direction의 기본값인 row는 가로 방향으로(이것이 주축이 된다!) 아이템이 배치되며(위 예제), column 값을 주면; 세로 방향으로(이것이 주축이 된다!) 아이템이 배치된다 한편, row-reversecolumn-reverse 는 각각 역순으로(뒤쪽 및 아래쪽에서부터) 배치된다
  • flex-wrap:의 기본값인 nowrap은 아이템이 넘쳐나도 아래로 내려가지 않으며(컨텐츠 영역이 밑으로 늘어난다!), wrap 값을 주면; 아이템이 넘치면 밑으로 내려가서 다음 행 라인으로 배치된다
[ 플렉스박스 선언 및 정의 ]
                                        
                                            .flex-container { /* 플렉스 컨테이너 */
                                                display: flex; /* 플렉스박스 선언 */
                                                width: 800px; height: 600px; /* 플렉스박스 크기 지정 */

                                                /* flex-flow: row nowrap; ← 기본값 */
                                                flex-direction: row; /* 가로 방향으로 아이템을 배치한다 ← 기본값 */
                                                flex-wrap: nowrap; /* 아이템이 넘칠 때; 다음 줄로 내려가지 않는다 ← 기본값 */
                                            }
                                        
                                    

플렉스박스에서 (flex-wrap: wrap; 시)넘쳐서 아래로 내려가는 부분은 새로운 플렉스박스로 작동하게 된다 - 곧, 플렉스 컨테이너가 래핑되면 여러 플렉스 라인이 생성되고, 각 라인은 새로운 플렉스 컨테이너처럼 움직이는 것이다!

아이템 공간배분
flex: flex-grow flex-shrink flex-basis; 속성은 플렉스 아이템간 공간 배분을 지정하는데, 각 옵션별로 따로 설정해줄 수도 있다
[ 플렉스박스 아이템 공간배분 ]
                                        
                                            .flex-item { /* flex: 0 1 0; */
                                                flex-grow: 0; /* 공간이 남으면; (아이템 크기를)확대할 것인가? ← 기본값 No */
                                                flex-shrink: 1; /* 공간이 모자라면; (아이템 크기를)축소할 것인가? ← 기본값 Yes */
                                                flex-basis: 0; /* 플렉스 아이템의 초기 너비(및 높이) 값 ← 기본값 0 */
                                            } 
                                        
                                    

플렉스박스 아이템의 기본 크기를 설정하는 flex-basisflex-direction 방향에 따라 row 에서는 너비, column 에서는 높이가 사용된다!

아이템 1
아이템 2
좀 더 긴 아이템입니다

플렉스 컨테이너에 항목을 표시하는 데 필요한 공간보다 더 많은 공간이 있다고 가정할 경우; 최대 컨텐츠 크기에서 항목이 처음에 정렬된 후 공간을 채우기 위해 확대되지 않는다 이는 flex 속성의 기본값이 initial(= flex: 0 1 auto;)인 때문이다)

1. 단위 없는 비례값인 flex: 1;(= flex-grow 옵션과 같다!)로 주면; 플렉스 컨테이너의 사용 가능한 공간은 3개가 되고, 각 아이템별로 1:1:1 의 비율로 분배된다 flex:의 두번째, 세번째 옵션은 기본값으로 설정된다!
아이템 1
아이템 2
아이템 3
                                    
                                        
                                    
                                
2. 위 플렉스박스 컨테이너 안 모든 아이템에 flex: 1;로 주고(일단은; 모든 아이템이 1씩 같은 크기로 설정된다), 그 아이템 중 하나에 flex: 2;와 같이 설정해줄 수도 있다 이제 각 아이템의 사용 가능한 공간은 먼저 각각 1씩 똑같이 나누어진 뒤, 2 값으로 추가 설정해준 하나의 아이템은 2배로 늘어나서 총 4개의 공간이 1/1/2 비율로 배분된다
아이템 1
아이템 2
아이템 3
                                    
                                        .flexbox_container { display: flex; gap: 1rem; }
                                        .flexbox_container div { flex: 1; }
                                        .flexbox_container div:nth-of-type(3) { flex: 2; }
                                    
                                
3. flex 값 내에서 최소 크기 값을 지정해줄 수도 있다. 아래 예제에서는 모든 아이템들이 같은 1 씩 갖지만, 세번째 아이템에는 최소 400px 크기로 지정해주었다. 이제, (세번째 아이템이 먼저 최소 400px 만큼 차지한 다음)나머지 아이템들은 남는 공간만으로 똑같이 나누어 차지하게 된다
아이템 1
아이템 2
아이템 3
                                    
                                        .flexbox_container { display: flex; gap: 1rem; }
                                        .flexbox_container div { flex: 1; }
                                        .flexbox_container div:nth-of-type(3) { flex-basis: 400px; }
                                    
                                

플렉스 아이템의 보이는 순서를 지정하는 order 속성은 z-index와 비슷해 보이지만, z-index와는 달리 레이어층으로 구성되지 않고 요소의 흐름상 해당 항목이 어디서 보여져야 하는지 그 위치를 결정할 뿐이다!


order 속성은 논리적인 순서나 탭 순서와도 전혀 무관하게 오직 화면상 보이는 순서에만 영향을 준다. 따라서, 이 속성을 사용하고자 할 때는, 먼저 html을 재검토해 보고 소스코드 순서를 변경함으로써 처리할 수 있다면; 그렇게 하는 것이 좋다!

아이템 정렬

플렉스박스는 아이템을 정렬하고 아이템 사이의 공간 배분을 위해 관련 속성들을 마련해 두었는데, 주축 방향을 대상으로 하는 경우는 justify-로 시작하고, 교차축 방향을 대상으로 하는 경우에는 align-으로 시작한다

플렉스박스 아이템 정렬
플렉스박스에서는 주축 방향으로의 공간 배분 및 교차축 방향으로의 아이템 정렬 속성들을 설정해줄 수 있다. 공간을 분배하는 데에는 justify-content(주축 방향으로의 공간 배분) 속성과 align-content(주축 공간이 넘쳐서 교차축 방향으로 내려갈 때의 공간 배분) 속성을 쓸 수 있고, 교차축 방향으로의 아이템 정렬에는 align-items(모든 아이템 대상)와 align-self(특정 아이템 대상) 속성을 쓸 수 있다
[ 플렉스박스 아이템 정렬 속성 ]
                                        
                                            .flex-container { /* 플렉스 컨테이너 ← 아래 옵션 값들은 모두 기본값임 */
                                                display: flex; /* 플렉스박스 선언 */
                                                justify-content: flex-start; /* 주축(row라면; 가로, column이라면; 세로) 방향으로의 아이템 배치 기준점 */
                                                align-content: stretch; /* (아이템이 넘칠 때)교차축 방향으로의 아이템 배치 기준점 */
                                                align-items: stretch; /* 교차축 방향으로의 아이템 배치 수직 기준선 */
                                            } .flex-container .item1 { /* 플렉스 컨테이너 내 개별 아이템 .item1 */
                                                align-self: stretch; /* 개별 아이템 대상 교차축 방향으로의 아이템 배치 수직 기준선 */
                                            } 
                                        
                                    
1. 주축 방향으로(flex-direction: row;) 아이템을 배치할 때는 justify-content 속성을 사용한다(기본값은 flex-start)
item 1
item 2
item 3

참고로, flex-direction: column;인 경우라면; justify-content가 해당 열에서 상하 방향으로 작동한다 이 경우, 플렉스 컨테이너에 heightblock-size 값을 설정해주어야 한다!


* cf) justify-contentalign-content 값을 한번에 설정해줄 수도 있는데, place-content: 교차축값 주축값; 속성을 사용하면 된다: .flex-container { place-content: center flex-end; } 값을 하나만 주면; 같은 값으로 교차축과 주축 모두에 적용된다

2. 플렉스 라인 내에서 교차축 방향으로 아이템을 배치할 때는 align-items 속성(아이템 배치의 수직 기준선)을 사용한다: align-items: stretch/flex-start/center/flex-end/baseline; 기본값인 stretch는 모든 아이템의 너비 및 높이를 (안의 내용물 양과 무관하게)동일하게 배분한다!
3. 한편, 특정 아이템만을 대상으로 할 때는 align-self 속성(개별 아이템 배치의 수직 기준선)을 사용해주면 된다 기본값인 stretch 는 해당 아이템의 높이 및 너비를 (안의 내용물 양과 무관하게)최대 크기로 확장한다!
1st item: align-self
더 긴 2nd item
with a line break
보다 더 긴 3rd item
with a line break
with a line break
플렉스박스 자동마진
플렉스박스 그룹에서 한 항목을 분리하거나 그룹을 두 그룹으로 분리해야 하는 경우; 플렉스박스 자동 마진을 적용하여 이를 수행할 수 있다. 플렉스 아이템의 어느 한쪽 방향에 자동마진(auto 값)을 설정하면; 해당 아이템은 적용된 방향의 남은 공간 모두를 차지하면서 나머지 그룹을 밀어내어 그룹을 분할하게 된다
margin-inline-end: auto;
아이템 2
아이템 3
                                    
                                        
                                    
                                
                                    
                                        .container_boxing1 {
                                            display: flex; gap: 1rem;
                                        } .container_boxing1 :nth-child(1) { margin-inline-end: auto; }
                                    
                                

.container_boxing1 :nth-child(2) { margin-inline-end: auto; }로 바꿔주면; [아이템 2] 이후부터 뒤로 밀려나게 된다!

아이템 1
아이템 2
margin-inline-start: auto;
                                    
                                        
                                    
                                
                                    
                                        .container_boxing2 {
                                            display: flex; gap: 1rem;
                                        } .container_boxing2 :nth-child(3) { margin-inline-start: auto; }
                                    
                                

.container_boxing2 :nth-child(2) { margin-inline-start: auto; }로 바꿔주면; [아이템 2] 이전부터 앞으로 밀려나게 된다!


* cf) 플렉스박스 수직/수평 센터링

display: flex; align-items: center; justify-content: center;

그리드 레이아웃

는 2차원 컨텐츠용으로 설계된 레이아웃 방식으로서, 행과 열에 동시에 내용을 배치한다. 이 그리드 레이아웃은 웹페이지를 주요 영역들로 나누거나 html 기본 요소로 구축된 컨트롤 부분 간의 크기, 위치 및 레이어 등의 관계를 정의하는 데 매우 탁월하다!

그리드 선언 및 정의
그리드는 웹페이지 디자인 요소들을 수평/수직으로 정렬하는 2차원 레이아웃으로서, 그리드 레이아웃을 구축할 때는 먼저 이 있는 그리드 컨테이너를 정의한 뒤, 해당 그리드 컨테이너 아래에 각각의 항목(= 아이템)들을 배치해주면 된다. 하나의 그리드는 Columns(= )과 Rows(= )으로 구성되며, 각 행과 행, 열과 열 사이에는 Gap (= 간격)이 존재한다
1. 웹페이지를 그리드로 작동시키기 위해서는; 먼저 그리드 컨테이너에서 display: grid; 선언 이후 그리드 행(및 열), 갭 등을 작성해준다. 아래, 코드는 3개의 열 트랙과 2개의 행 트랙을 생성한다
[ Grid 선언 및 정의 ]
                                        
                                            .grid-container { /* 그리드 컨테이너 */
                                                display: grid; /* 그리드 선언 */
                                                grid-template-columns: 1fr 1fr 1fr; /* 그리드 열: 같은 lfr 너비의 3열 */
                                                grid-template-rows: 150px auto; /* 그리드 행: 첫번째 행은 150px 높이, 두번째 행은 안의 내용물에 맞게 높이가 결정된다 */
                                                gap: 12px; /* 갭 설정: 각 셀간 간격*/
                                            }
                                        
                                    
2. 그리드 컨테이너display: grid;가 적용된 html 요소로, 직속 하위요소들에 대한 그리드 맥락을 만들며, 그리드 아이템은 그리드 컨테이너 아래 직계 하위요소들(항목들)이다
[ Grid 컨테이너와 아이템 ]
                                        
                                            
                                        
                                    
그리드 라인
각각의 세로선(열 라인)은 앞쪽에서부터 1 ~ 4(= 열 라인번호), 가로선(행 라인)은 위쪽에서부터 1 ~ 3(= 행 라인번호)까지 라인번호가 붙는다
그리드 아이템 1
그리드 아이템 2
그리드 아이템 3
그리드 아이템 4
그리드 아이템 5
그리드 아이템 6

Grid Cell은 Table의 셀로, 행/열 Grid Track은 각각 Table의 행/열로 생각하면 된다. 한편, Grid Area는 여러 행, 또는 여러 열을 포괄하는 영역이 된다. Grid Line에서 맨 앞쪽 세로선(1)부터 맨 끝 세로선(4)까지의 영역은 각각의 행 트랙이 되며, 맨 위 가로선(1)부터 맨 아래 가로선(3)까지의 영역은 각각의 열 트랙이 된다


* cf) Grid Gap은 행/열 트랙들 사이의 간격 으로서, 일반 트랙처럼 작동하여 크기 조정에 활용된다 - 컨텐츠를 배치할 수는 없지만, 그리드 항목이 갭에 걸쳐지게 할 수는 있다!

                                    
                                        gap: 값; /* 행과 열 트랙간 간격 ← 단위는 px 및 % */
                                        row-gap: 행 트랙간 간격; column-gap: 열 트랙간 간격;
                                    
                                
그리드 컬럼 레이아웃: fr 단위
그리드의 fr 단위는 플렉스박스에서의 auto 값과 유사하게, 먼저 항목이 배치된 이후에 공간이 분배된다. 또한, fr 단위는 사용가능한 공간을 공유하므로 고정 크기 단위와 함께 쓸 수도 있다
1.
2fr
2.
1fr
3.
1fr
4.
100px
5.
6.
7.
                                    
                                        
                                    
                                
                                    
                                        .grid-container {
                                            display: grid; /* 그리드 선언 */
                                            grid-template-columns: 2fr 1fr 1fr 100px;
                                            gap: 12px; /* 행과 열 모두에 갭 설정 */
                                        }
                                    
                                

첫 4개의 컬럼이 하나의 행 트랙에 배치되고(고정 단위로 주어진 100px이 먼저 결정되고, 남은 공간으로 2:1:1 비율로 나눈다), 나머지 컬럼들은 자동으로 다음 줄로 내려간다!

그리드 컬럼

그리드 컬럼grid-template-columns 속성을 써서 px 등의 절대 크기 단위 외에도 Grid fr 단위, Css 키워드, Grid 함수 등을 결합하여 다양한 방식으로 작성해줄 수 있다

그리드 트랙
그리드 트랙은 Css의 min/max/fit-content 키워드나 fit-content(최대크기); 함수를 사용하여 그 크기를 조정해줄 수도 있다
Item 1
Item 2

[Item 3]

min-content 값은 트랙 컨텐츠가 넘치지 않게 하면서 가능한 한 트랙을 작게 만들어준다(단, 아래로 오버플로우가 발생할 수 있다!).

반대로, max-content 값은 모든 컨텐츠가 끊어지지 않은 하나의 긴 문자열에 표시될 만큼 충분히 넓혀준다(단, 옆으로 오버플로우가 발생할 수 있다!)

fit-content 값은 사용 가능한 공간 전부를 사용하되, 절대 부모박스의 크기보다 크지는 않음을 의미한다

Item 4
Item 5
                                    
                                        
                                    
                                
                                    
                                        :root { --var-keycol: auto; }
                                        
                                        .gridkeyword-container {
                                            display: grid;
                                            grid-template-columns: repeat(3, var(--var-keycol)); /* 그리드 열: 개수 3, 너비 auto */
                                            grid-template-rows: 300px auto; /* 그리드 행 높이: 첫 행은 300px, 이후 행은 auto */
                                            gap: 10px; /* 그리드 갭: 셀간 간격 10px */
                                        }
                                    
                                

키워드 fit-content 는 부모박스 내 최대 크기까지 확장되지만, fit-content(최대크기); 함수를 쓰면 그 확장을 적절하게 제한해줄 수 있다!

그리드 트랙
Css의 minmax(최소크기, 최대크기); 함수를 쓰면 트랙이 그리드 컨테이너에서 갭을 뺀 나머지 공간을 동일하게 공유하도록 할 수 있다
                                    
                                        .container {
                                            display: grid;

                                            /* 같은 크기의 12컬럼 그리드 트랙 */
                                            grid-template-columns: minmax(0, 1fr), minmax(0, 1fr), minmax(0, 1fr), minmax(0, 1fr), minmax(0, 1fr), minmax(0, 1fr), minmax(0, 1fr), minmax(0, 1fr), minmax(0, 1fr), minmax(0, 1fr), minmax(0, 1fr), minmax(0, 1fr);
                                        }
                                    
                                

예컨대, minmax(auto, 1fr);로 주면; 그리드는 컨텐츠의 고유 크기를 확인하여 컨텐츠에 충분한 공간을 제공해준 다음 사용가능한 공간을 나누게 된다. 하지만, minmax(0, 1fr);로 주면; 트랙의 최소 크기는 최소 컨텐츠 크기가 아니라 0 이 되고, 그런 다음 그리드는 컨테이너에서 사용 가능한 모든 크기를 가져오고 갭에 필요한 크기를 뺀 다음 fr 단위에 따라 나머지를 분배하게 되는 것이다

그리드 트랙
1. Css의 repeat(반복횟수, 트랙세트); 함수와 auto-fillauto-fit 키워드를 결합할 수도 있다: 아래 코드는 최소 200px, 최대 1fr 크기에 맞는 만큼의 트랙을 생성하는데, 그리드가 200px 트랙을 배치하고 남은 공간은 모두 균등하게 분배된다
Item 1
Item 2
Item 3
Item 4
Item 5
                                    
                                        .container_autofill {
                                            display: grid;
                                            grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
                                            gap: 10px;
                                        }
                                    
                                

곧, 미디어쿼리가 필요없는 2차원 반응형 레이아웃인데, 뷰포트 너비가 변경됨에 따라 그에 맞추어 적절히 오르락 내리락하면서 재배치된다!

2. auto-fillauto-fit 사이에는 미묘한 차이점이 존재한다. 곧, auto-fill 에서는 비워진 공간이 있는 반면, auto-fit 에서는 빈 공간 없이 꽉 채워진다 - 이는 남은 공간을 모두 차지하도록 트랙이 커짐을 의미한다
Item 1
Item 2
Item 3
                                    
                                        .container_autofit {
                                            display: grid;
                                            grid-template-columns: repeat(autofit, minmax(100px, 1fr));
                                            gap: 10px;
                                        }
                                    
                                

단, 첫 행 트랙이 다 채워지는 경우라면; 둘 사이에는 아무런 차이가 없다!


* cf) 아래처럼, repeat()minmax() 함수를 함께 결합하여 쓸 수도 있는데, 이는 트랙 리스트의 반복되는 패턴을 나타내는 다수의 열 및 행을 보다 간결한 형식으로 작성할 수 있도록 해준다:

                                    
                                        .container_12 { /* 같은 크기의 12컬럼 그리드 트랙 */
                                            display: grid;
                                            grid-template-columns: repeat(12, minmax(0, 1fr)); /* minmax(0, 1fr)을 12번 반복 */
                                        }

                                        .container_6 { /* 6컬럼 그리드 트랙 */
                                            display: grid;
                                            grid-template-columns: 200px repeat(2, 1fr 2fr) 200px; /* 200px [1fr 2fr] [1fr 2fr] 200px */
                                        }
                                    
                                

가변 그리드

그리드에서 항목이 넘쳐나게 되면(예컨대, 다음 줄로 내려갈 때); 자동적으로 추가 그리드 선이 그려지면서 그리드가 확장되는데(= 암시적 그리드), 이렇게 자동 그리드로 생성되는 트랙은 기본값으로 auto 크기이며, 이는 일반적으로 컨텐츠를 담기에 충분히 크다는 것을 의미한다!

가변 그리드
암시적 으로 생성되는 그리드 트랙은 기본적으로 크기가 자동 조정되지만, grid-auto-rowsgrid-auto-columns 속성을 사용하여 '명시적'으로 그 크기를 조정해줄 수도 있다
[ '명시적' 그리드 트랙 설정 ]
                                        
                                            .grid-container {
                                                display: grid; /* 그리드 선언 */
                                                grid-template-columns: repeat(3, 1fr); /* 같은 너비의 3컬럼 생성 ← '명시적' 그리드! */
                                                grid-auto-rows: 50px; /* 행 높이 수동 설정 ← '명시적' 그리드! */
                                                gap: 12px; /* 그리드갭 설정 */
                                            }
                                        
                                    
1. 위와 같이 행 높이를 고정된 값으로 주는 경우; 내부 컨텐츠가 늘어나는 경우 오버플로우가 발생할 수 있는데, 이를 방지하기 위하여 Css의 minmax(); 함수를 써서 grid-auto-rows: minmax(50px, auto);와 같은 식으로 트랙의 최소 크기, 최대 크기 를 설정해줄 수 있다
1.
2.
3.
4.
5.
6. grid-auto-rows: minmax(50px, auto);
7.
                                                    
                                                        
                                                    
                                                
                                                    
                                                        .grid-container1 {
                                                            display: grid; /* 그리드 선언 */
                                                            grid-template-columns: 2fr 1fr 1fr 100px; /* 고정 단위인 100px이 먼저 결정되고, 남은 공간으로 2:1:1로 나눈다 */
                                                            grid-auto-rows: minmax(50px, auto); /* 가변 행높이 설정: 최하 50px, 최대 auto */
                                                            gap: 12px; /* 그리드갭 설정 */
                                                        }
                                                    
                                                

행 높이의 최소 크기는 50px 이지만 최대 크기는 auto 값으로 줌으로써 필요시 더 많은 컨텐츠를 수용하기 위해 (해당 행 전체에 걸쳐서)확장된다!

2. Css의 repeat(); 함수를 써서 grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); 식으로 그리드 컨테이너에 들어갈 수 있는 만큼의 컬럼을 만들도록 요청할 수도 있다
1
2
3
4
5
6
7
                                                    
                                                        
                                                    
                                                
                                                    
                                                        .grid-container2 {
                                                            display: grid; /* 그리드 선언 */
                                                            grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); /* 가변 열너비 */
                                                            grid-auto-rows: minmax(50px, auto); /* 가변 행높이 */
                                                            gap: 12px; /* 그리드갭 설정 */
                                                        }
                                                    
                                                

그리드 컨테이너에 들어갈 수 있는 만큼의 200px 열을 생성한 다음 모든 열에 남은 공간을 공유한다 - 최소 크기는 200px 이지만, 최대 크기 1fr 에 의해 트랙간 공간이 균등하게 분배된다!

그리드 아이템에는 기본적으로 자동배치가 작동된다 - 곧, 각 항목은 소스에 나타나는 순서대로 셀당 하나씩 그리드에 배치된다. 대개의 경우는 이것으로 충분하지만, 필요하다면; 추가적으로 레이아웃을 조정해줄 수 있다

1. 그리드 레이아웃은 기본적으로 행을 따라 항목을 배치하지만(문서 및 구성요소의 쓰기모드에서 텍스트가 표시되는 방향이 바로 행 라인이 된다!), 문서의 쓰기모드가 vertial: lr;이나 vertial: rl;인 경우 grid-auto-flow: column; 속성을 써서 항목을 열 방향으로 배치할 수 있다

2. Css의 span 키워드를 써서 그리드 자동배치 레이아웃의 일부 또는 전체 항목이 둘 이상의 트랙에 걸쳐지도록 할 수 있다: .greed_item { grid-column: auto / span 2; } 앞 부분은 auto로 주고, 맨 뒤에서 2개이 열 트랙을 하나로 합친다!

3. 일부 항목이 여러 트랙에 걸쳐진 자동배치 레이아웃의 경우, 그리드에 일부 채워지지 않은 셀이 생길 수 있다 - 곧, 레이아웃이 완전히 자동배치된 그리드 레이아웃의 기본 동작은 항상 앞으로 진행하는 것인데, 다음 항목을 넣을 공간이 충분하지 않다면; 그리드는 갭을 남기고 다음 트랙으로(예컨대, 아래 행으로) 건너뛰게 되는 것이다. 여기서, grid-auto-flow: dense; 속성을 사용하면; 그리드가 나중에 레이아웃에서 항목을 가져와 건너뛴 빈 갭을 채우는 데 사용할 수 있다 단, 이러한 설정은 디스플레이가 논리적 순서에서 분리된다는 것을 의미할 수 있다!

그리드 배치/정렬

그리드의 시작 라인과 끝 라인을 번호로 지정하여 이 라인을 따라 그리드 아이템을 배치해줄 수 있다. 나아가, 그리드 영역에 이름을 지정하여 해당 그리드에 셀을 할당해줄 수도 있다!

그리드 아이템 배치
라인 기반 그리드 배치는 그리드 아이템의 라인, 범위 또는 자동설정(auto) 값을 제공하여 그리드 영역의 인라인 시작 및 끝 가장자리를 지정함으로써 그리드 컨테이너 내에서 그리드 항목의 크기와 위치를 지정한다:
  • grid-column: 시작번호/끝번호; 그리드 열의 시작번호/끝번호 끝번호 생략시는; auto
  • grid-row: 시작번호/끝번호; 그리드 행의 시작번호/끝번호 끝번호 생략시는; auto
  • grid-column/row-start/end: 시작번호/끝번호; 시작번호/끝번호 지정

마지막 열 또는 행 라인을 상대로 -1 값을 사용할 수도 있는데, 이렇게 음수값을 사용하면 끝에서 안쪽으로 카운트할 수 있다 단, 음수 라인번호는 '명시적' 그리드에서만 작동하며, '암시적' 그리드로까지 확장되지는 않는다!

1. grid-column: 1/3; grid-row: 1;
2. grid-column: 2/4; grid-row: 1/3;
3. grid-column: 1; grid-row: 2/5;
4. grid-column: 3; grid-row: 3;
5. grid-column: 2; grid-row: 4;
6. grid-column: 3; grid-row: 4;

* cf) 라인기반 그리드 배치 이름지정 그리드 배치 로 간단히 변경해줄 수 있다. grid-template-areas 속성은 이름붙은 그리드 영역을 지정하여 그리드에 셀을 할당하는데, 그리드로 이뤄진 전체 셀을 채워야 하며, 여러 셀을 합칠 때는; 해당 이름을 반복하여 적어주면 된다

그리드 아이템 정렬
플렉스박스에서와 같이, 그리드에서도 justify-로 시작하는 속성은 인라인 축(곧, 문단이 진행되는 방향)으로 사용되며, align-으로 시작하는 속성은 블록 축(곧, 블록이 진행되는 방향)으로 사용된다:
  • justify-contentalign-content는 트랙 주변이나 트랙 사이의 그리드 컨테이너에 추가 공간을 분배한다
  • justify-selfalign-self는 그리드 아이템에 적용되어 해당 항목이 배치된 그리드 영역 내에서 이동한다
  • justify-itemsalign-items는 항목의 모든 justify-self 속성을 설정하기 위해 그리드 컨테이너에 적용된다

그리드 레이아웃에서의 justify-selfjustify-items 속성은 인라인 축에서 작동하여 그리드 영역 내의 해당 축에 항목을 정렬하는 작업을 수행한다. 반면, 플렉스박스의 아이템은 주축에서 하나의 그룹으로 작동하고, 따라서 해당 그룹에서 개별 항목을 따로 분리한다는 개념이 없다. 그리하여 플렉스박스에서는 자동 마진을 써서 이 단점을 메꾸는 것이다!


* cf) 그리드 수직/수평 센터링

display: grid; place-items: center;

플렉스박스나 그리드를 제대로 써먹을 수 있다면; 웹문서에 고정되는 헤더나 푸터 등을 만드는 작업들이 많이 쉬워집니다 - 아래 예제들을 살펴보십시오..

그리드 레이아웃

은 자신의 웹사이트에서 구현할 필요가 있는 일반적인 레이아웃 패턴에 대한 레시피를 모으는 것을 목표로 한다!

그리드 카드
는 일반적으로 그룹 또는 컬렉션 내에 표시되며, 각 카드에는 제목, 이미지, 컨텐츠(및 바닥글)이 포함된다. 카드는 1차원 레이아웃임에도 Css 그리드 레이아웃을 사용하여 배치하는데, 그럼으로써 그리드 트랙에 대한 컨텐츠 크기 조정을 사용할 수 있게 된다!
1. 단일 열 그리드 카드는 grid-template-rows 속성으로 다음과 같이 설정해줄 수 있다. 아래 Css 코드는 카드 제목행은 최대 크기(max-content)로 주어 늘어나는 것을 방지하고, 이미지 트랙은 (이미지의 높이인)200px 높이로 고정하며, 컨텐츠가 있는 맨 아래 행은 1fr로 주어 나머지 공간을 채우고 있다
[ 단일 열 Grid 카드 작성 ]
                                        
                                            .card {
                                                display: grid; /* 그리드 컨테이너 선언 */
                                                grid-template-rows: max-content 200px 1fr; /* 3행: header, img, div(및 footer) */
                                            }
                                        
                                    

명시적으로 정의된 크기를 가진 3개 외에 추가되는 자식요소(footer)는 암시적 그리드에 (크기가 자동 조절되는)행을 생성한다 바닥글이 있는 경우 그리드의 맨 아래에 붙는데, 그리드 컨테이너도 그에 따라 자동으로 늘어나게 된다!

2. 다음은 그리드컬럼 카드 을 생성하는데, grid-template-columns 속성으로 그리드 컬럼들의 너비를 정의하고 gap 속성으로 카드간 간격을 준다
[ 다중 열 Grid 카드 작성 ]
                                        
                                            .cards {
                                                display: grid;
                                                grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
                                                gap: 20px; /* 카드간 간격 */
                                            }
                                        
                                    

여기서는 그리드 컬럼의 너비 값을 자동 채우기(auto-fill)로 주었다 곧, 최소 250px 크기지만, 사용가능한 공간을 모두 채우기 위해 커질 수 있는 반복되는 컬럼들이다!


플렉스박스를 사용하여 각 카드를 배치할 수도 있는데, 이 경우 각 카드 행의 크기가 카드 컨테이너가 아닌 각 행의 flex 속성으로 설정된다. 또한, flex 항목의 크기가 부모 컨테이너가 아닌 자식요소에서 정의된다 어느 것을 사용할 지 여부는 그리드 카드에서와 같이 컨테이너에서 트랙을 다루는 것을 선호하는지, 아니면; 각 카드들에 부가적인 설정을 더하여 다룰 필요성이 있는지에 달려있을 뿐이다!

그리드 래퍼
그리드 래퍼 패턴은 중앙 래퍼 내에서 그리드 내용을 정렬하는 동시에 항목이 분리되어 포함하는 요소 또는 페이지의 가장자리에 정렬되도록 하는 데 유용하다. 그리드에 배치된 항목은 가로 가운데의 max-width 래퍼 및 그리드의 바깥쪽 가장자리, 또는 둘 다에 정렬할 수 있어야 한다.

grid-column: 2 / -2;

grid-column: 1 / -4;

grid-column: 4 / -1;

grid-column: 1 / -1;

                                                    
                                                        
                                                    
                                                
                                                    
                                                        body { max-width: 960px; margin: 0 auto; } /* 화면 정중앙 배치 */

                                                        .grid-wrapper2 {
                                                            margin: 0 auto; max-width: 75vw; /* 화면 정중앙에 뷰포트에 따라 유동적인 75vw 크기로 배치한다 */
                                                            display: grid;
                                                            grid-template-columns: minmax(20px, 1fr) repeat(6, minmax(0, 60px)) minmax(20px, 1fr); /* 1/6/1 컬럼 */
                                                            grid-auto-rows: minmax(50px, auto);
                                                            grid-gap: 10px;
                                                        } .grid-wrapper2 > * { border: 2px solid rgb(95 97 110); border-radius: 0.5em; padding: 20px; }

                                                        .grid-wrapper2 .wrapper { grid-column: 2 / -2; }
                                                        .grid-wrapper2 .left-edge { grid-column: 1 / -4; }
                                                        .grid-wrapper2 .right-wrapper { grid-column: 4 / -1; }
                                                        .grid-wrapper2 .full-width { grid-column: 1 / -1; }
                                                    
                                                

맨 바깥쪽 앞/뒤 컬럼의 최대 크기는 1fr 이며, 이는 그리드 컨테이너에서 사용 가능한 나머지 공간을 채우기 위해 각각 확장됨을 의미한다!

미디어 객체
웹에서 흔히 볼 수 있는 형태인 (예컨대, 소셜 미디어 게시물 등)는 보통 이미지와 설명 텍스트로 나뉘어 모바일에서는 상/하 스택으로 쌓이고, 데스크탑에서는 좌/우 열로 나뉘어 배치되는데, 이 또한 그리드 레이아웃을 사용하여 배치한다
남산부석

미디어객체에 그리드 레이아웃을 사용할 때의 장점은 필요할 때 레이아웃을 2차원으로 제어할 수 있기 때문이다(곧, 바닥글이 있는 경우; 바닥글을 미디어객체의 맨 아래로 푸시할 수 있게 된다!). 나아가, 이미지의 트랙 크기 조정에 fit-content 키워드를 사용할 수 있다는 장점도 있다. 예컨대, 최대 300px 크기로 적용하면; 작은 이미지가 있을 때 트랙은 해당 이미지의 크기만큼만 커지게 되고, 이미지가 더 크다면; 트랙이 300px 에서 증가를 멈추고 열에 맞도록 크기가 줄어드는 것이다!

                                                    
                                                        
                                                    
                                                
                                                    
                                                        body { max-width: 960px; margin: 0 auto; }

                                                        @media (min-width: 600px) { /* 뷰포트 너비가 600px보다 작아지면; 적층 레이아웃으로 변경된다! */
                                                            .ns-image { grid-area: image; }
                                                            .ns-content { grid-area: content; }
                                                            .ns-footer { grid-area: footer; }

                                                            .ns-media { /* 수평 레이아웃 */
                                                                display: grid;
                                                                grid-template-columns: fit-content(300px) 1fr; /* 이미지 너비는 최대 300px 까지로 제한함 */
                                                                grid-template-rows: 1fr auto;
                                                                grid-template-areas:
                                                                    "image content"
                                                                    "image footer";
                                                                grid-gap: 1em;
                                                            }
                                                        }
                                                    
                                                

참고로, grid-template-areas 속성값을 "content image" "footer image" 로 주면; 좌/우 컬럼 위치가 반대로 변경된다. 한편, "image content" "image content" "footer footer" 로 주면; 바닥글이 맨 밑 행으로 분리된다!

다단컬럼 레이아웃

플렉스박스, 그리드, 다단컬럼 등은 기본적으로 반응형 레이아웃이며, 미디어쿼리뷰포트 메타태그 등은 반응형 레이아웃을 위한 것이다!

다단컬럼 레이아웃
Css 을 사용하기 위해서는; 먼저 다단 컨테이너 래퍼를 만들고, column-count: 개수;로 가변 너비의 개수 만큼의 컬럼을 생성하거나, column-width: 너비;로 고정된 너비 (가능한 개수만큼)의 컬럼(남는 공간은 각 컬럼별로 공평하게 배분된다!)을 생성해 준다. 추가적으로, column-gap 속성으로 컬럼간 간격을 설정해줄 수 있고, column-rule 속성으로 컬럼간 구분선을 그어줄 수 있다:
[ 다단컬럼 레이아웃 기본 설정 ]
                                        
                                            .Multicol-container { /* 다단 컨테이너 래퍼 */
                                                column-count: 3;
                                                column-gap: 5%;
                                                column-rule: 4px dotted gray;
                                            }
                                        
                                    

다단 컬럼은 개별적으로 크기나 색상, 배경 등을 스타일링할 수는 없다 - 오직 column-gap으로 컬럼간 간격을 설정하고, column-rule로 컬럼 구분선을 추가해줄 수 있을 뿐이다 컬럼 구분선은 Css의 border 속성에서와 같은 방식으로 사용하면 된다!

Css 다단 레이아웃을 위해서는 먼저 다단 컨테이너 래퍼를 만들고, column-countcolumn-width를 써서 다단 레이아웃을 작성해준다. 한편, 다단 컬럼은 개별적으로 크기나 색상, 배경 등을 스타일링할 수는 없다. 오직 column-gap으로 컬럼간 간격을 설정하고, column-rule로 컬럼 구분선을 추가해줄 수 있을 뿐이다:


Css 다단 레이아웃을 위해서는 먼저 다단 컨테이너 래퍼를 만들고, column-countcolumn-width를 써서 다단 레이아웃을 작성해준다. 한편, 다단 컬럼은 개별적으로 크기나 색상, 배경 등을 스타일링할 수는 없다. 오직 column-gap으로 컬럼간 간격을 설정하고, column-rule로 컬럼 구분선을 추가해줄 수 있을 뿐이다:

                                                    
                                                        
                                                    
                                                
                                                    
                                                        .Multicol-container {
                                                            column-count: 3;
                                                            column-gap: 20px;
                                                            column-rule: 4px dotted gray;
                                                        }
                                                    
                                                
스패닝 컬럼
컨텐츠를 다단 컬럼으로 만들면 컨텐츠가 나뉘어져 다음 컬럼으로 분할되는데, 규격에 있는 break-inside: avoid; 속성을 주어 다단 컬럼 컨텐츠가 깨지는 것을 막을 수 있다:
컨텐츠 1
Css 조각화 fragment는 콘텐츠가 여러 페이지, 영역 또는 열에서 끊어졌을 때 표시되는 방식을 정의한다
컨텐츠 2
Css 조각화 fragment는 콘텐츠가 여러 페이지, 영역 또는 열에서 끊어졌을 때 표시되는 방식을 정의한다
컨텐츠 3
Css 조각화 fragment는 콘텐츠가 여러 페이지, 영역 또는 열에서 끊어졌을 때 표시되는 방식을 정의한다
                                    
                                        
                                    
                                
                                    
                                        .Spaning-column { column-count: 2; column-gap: 20px; }

                                        .Spaning-column > div {
                                            margin: 0 0 8px 0; background-color: rgb(207, 232, 220); border: 4px dotted rgb(156, 155, 151);
                                            break-inside: avoid;
                                        }
                                    
                                

위 코드에서 break-inside: avoid; 부분을 주석 처리한 뒤의 모양과 비교해보십시오..


Css 조각화 fragment 는 컨텐츠가 여러 페이지, 영역 또는 열에서 끊어졌을 때 표시되는 방식을 정의한다. 이러한 단편화는 인라인 상자가 여러 줄로 줄 바꿈될 때, 또는 블록레벨 박스가 열 레이아웃 컨테이너 내에서 둘 이상의 열에 걸쳐 있거나 인쇄할 때 페이지 나누기에 걸쳐 있는 경우에도 발생한다!

그리드 다단컬럼
컬럼 항목들이 행과 열로 정렬되는 2차원 다단컬럼은 Grid 레이아웃으로 간단히 작성할 수 있다. 그리드 컨테이너에 설정되는 grid-template-columnsgrid-template-rows 속성은 컬럼이 행과 열을 따라 분산되는 방식을 정의한다

그리드 2차원 행/열 레이아웃

컨텐츠 2
컨텐츠 3
                                    
                                        
                                    
                                
                                    
                                        .Multicol-Grid {
                                            display: grid;
                                            grid-template-columns: 1fr 1fr;
                                            grid-template-rows: auto;
                                            grid-gap: 20px;
                                        }
                                    
                                
플렉스박스 다단컬럼
플렉스박스에서는; 단지 플렉스 컨테이너의 자식요소들에 flex: 1; 값을 주는 것만으로 플렉스 컨테이너 내부 자식요소들을 한 라인상에 위치하는, 또한 사용가능한 모든 공간이 균등하게 분배되는 플렉스 항목들로 분할된다
높이가 같은 항목의 단일 행
컨텐츠 2
컨텐츠 3
                                    
                                        
                                    
                                
                                    
                                        .Multicol-container3-1 { display: flex; }
                                        .Multicol-container3-1 > div { flex: 1; margin: 0 20px; }
                                    
                                

이 경우, margin이나 gap 속성을 사용하여 항목간 간격을 만들 수는 있지만, 플렉스 열 사이에 구분선을 그어주는 플렉스박스의 Css 속성은 아직 없다!


* cf) 단, 플렉스박스는 레이아웃을 행 또는 열로 제어하도록 설계되었지만 동시에 둘 다 제어할 수는 없고, 각 플렉스 라인은 해당 행 및 열 라인에 대해서만 공간을 분배할 수 있다. 따라서, 다음 행으로 내려가는 플렉스 항목이 있는 레이아웃을 만들고자 한다면; 플렉스 컨테이너에서 flex-wrap: wrap;으로 설정해주어야 한다

아래 행으로 내려가는 flex 항목 레이아웃
컨텐츠 2
컨텐츠 3
                                    
                                        
                                    
                                
                                    
                                        .Multicol-container3-2 { display: flex; flex-wrap: wrap; }
                                        .Multicol-container3-2 > div { flex: 1 1 200px; margin: 0 20px; }
                                    
                                

두 경우의 차이를 보려면; 화면 너비를 좁히면서 위쪽과 비교해보십시오..

의사클래스 선택자

html 요소는 상호작용하거나 자식요소 중 하나가 특정 상태에 있을 수 있기에 다양한 상태로 존재하게 된다. 는 (해당 유형의 첫 번째 요소이거나 마우스 포인터로 가리키고 있는 등)특정 상태에 있는 요소를 의미하는데, 이 의사 클래스는 마치 해당 상태에 대한 스타일을 동적으로 DOM에 추가한 것처럼 동작한다!

요소 위치 의사클래스
의사클래스 선택자 :는 html DOM에 클래스를 추가한 것처럼, 특정 상태(주로, 요소의 위치)에 있는 문서의 일부를 대상으로 하여 동작한다: div p:first-child { color: green; } 부모요소 <div> 아래(= 내부)에 있는 <p> 요소 중 첫번째 <p>

p(1)

p(2)

p(3)

                                    
                                        
                                    
                                

위 코드의 선택자를 div :first-child(div 아래 있는 첫번째 자식요소) 및 div *:first-child(div 아래에 있는 모든 자식요소들 중 첫번째 요소)로 대체해도 같은 결과를 가져온다!

사용자 반응 의사클래스
1. 일부 의사 클래스는 사용자가 요소와 상호작용할 때만 적용되는데, 대표적으로 요소에 마우스가 올라간 상태를 가리키는 요소:hover(예: 마우스 롤오버 효과를 만들 때)가 있다: 여기 마우스를 올려보세요..
                                    
                                        
                                    
                                
                                    
                                        .link_hover_ex:hover {
                                            color: white; background: rgb(130, 163, 91); text-decoration: none;
                                        }
                                    
                                
2. 요소:active는 요소와 활발하게 상호작용 중인 때를 가리키는데, 예컨대 마우스를 클릭한 채 아직 놓지않은 상태를 가리킨다:
                                    
                                        
                                    
                                
                                    
                                        .btn_active_ex:active {
                                            transform: scale(1.05); color: red;
                                        }
                                    
                                
3. 요소:focus는 요소에 포커스가 주어진 상태(예: 입력 필드에 커서를 놓거나 TAB 키를 눌러 포커스를 이동했을 때, 테이블의 특정 셀에 커서를 놓거나 특정 요소에 마우스를 올렸을 때 등..)를 가리킨다. 예컨대, <button>과 같이 포커스를 받을 수 있는 요소의 경우; :focus 의사클래스를 써서 해당 상태에 반응할 수 있다. 나아가, 해당 요소의 자식요소가 :focus-within으로 포커스를 받으면 이에 반응할 수도 있다

입력폼에 관련된 의사클래스 선택자 몇가지 간략히 정리합니다. 좀 어려우니 이런게 있다 하면서 살짝씩 살펴보시고, 나중에 필요해지면; 더 깊이있게 공부하십시오..

입력폼 필드에서 해당 요소의 사용 가능/불가 상태(예컨대, <textarea> 필드를 게시판 입력 화면으로 사용할 때는 enabled, 단순히 회원 약관 등을 보여줄 때는 disabled)를 가리킨다:

                                                    
                                                        
                                                    
                                                
                                                    
                                                        #imsi_form fieldset { margin-bottom:30px; width: 400px; }
                                                        #imsi_form input:disabled { background:#ddd; border:1px #ccc solid; }
                                                    
                                                

체크박스나 라디오버튼에서 해당 요소의 현재 상태를 가리키는데, 요소:checked는 해당 요소가 선택된 때를 가리킨다: input[type="radio"] :checked{ .. }


* cf) :checked는 오직 true 또는 false 상태이지만, 체크박스는 체크되거나 체크되지 않은 채로 있는 중간 상태(:indeterminate 상태)도 가질 수 있다: 예컨대, 체크박스 그룹 내 모든 확인란을 선택하는 [모두 선택] 컨트롤이 있는 경우이다 - 곧, 사용자가 [모두 선택]에 체크한 이후 개별 확인란 중 하나를 [선택 취소]하는 경우; 이제 [모두 선택] 확인란은 다시 결정되지 않은 상태로 전환되어야 하는 것이다!

현재 플레이스홀더 텍스트를 표시중인 <input> 또는 <textarea> 요소를 나타낸다:

                                                    
                                                        
                                                    
                                                
                                                    
                                                        input:placeholder-shown {
                                                            color: red; font-style: italic; background-color: rgb(225, 225, 215);
                                                            border-color: rgb(197, 176, 13);
                                                            text-overflow: ellipsis;
                                                        }
                                                    
                                                

:valid:invalid는 유효한 필드가 되기 위해 일치해야 하는 패턴이 있는 이메일 필드와 같은 컨텍스트에 유용하다:

                                                    
                                                        
                                                    
                                                
                                                    
                                                        #email_validis:valid { color: green; }
                                                        #email_validis:invalid { color: red; }
                                                    
                                                

:required는 필수입력 필드에 사용할 수 있고, 필수가 아닌 필드는 :optional로 선택할 수 있다 html 폼 양식의 required 속성으로 해당 필드를 필수 입력필드로 지정할 수 있다!

:in-range는 숫자 입력필드에 min, max 값이 있고 그 값이 해당 범위 내에 있는 경우; 숫자 범위의 유효성검사 상태를 가리킨다:

(1 ~ 10 사이의 숫자로 입력하시오)

                                                    
                                                        
                                                    
                                                
                                                    
                                                        #number_validis:in-range {
                                                            background: rgb(198, 197, 194);
                                                        } .number_info { font-size: 0.8rem; font-style: italic; }
                                                    
                                                
요소 특정 의사클래스
요소:not(x) { .. }는 해당 요소 중 x를 제외한 나머지 요소들만 선택한다:
                                    
                                        p:not(#exNot) { color: blue; } /* id가 exNot인 p만 제외한 모든 p 요소 */
                                    
                                
요소:is(x, y, z) { .. }는 해당 요소에서 x, y, z를 선택한다:
                                    
                                        article :is(h1, h2, h3) { line-height: 1.5; } /* atticle 안에서 h1, h2, h3를 모두 찾는다 */
                                    
                                

:is 의사클래스에 전달된 선택자에 오류가 있어도 잘못된 선택자만 무시함으로써 (오류를 내지 않고)유효한 선택자만 선택하여 적용한다는 점에서 atticle h1, atticle h2, article h3 { .. }로 작성하는 것에 비해 좀 더 관대하다!

요소:empty{ .. } 의사클래스는 자식요소가 없는 '빈' 요소(자식요소는 html 요소나 텍스트 노드, 또는 공백일 수도 있다!)를 선택한다:
                                    
                                        
                                    
                                
                                    
                                        .post_wysiwyg :empty { display: none; }
                                    
                                

이 의사 클래스는 html을 거의 제어할 수 없고 WYSIWYG 편집기와 같은 빈 요소를 숨기려는 경우에 유용하게 쓰일 수 있다!

요소:target{ .. } 의사클래스는 앵커의 목적지 요소를 선택하는데, 이는 웹사이트의 주요 컨텐츠와 같이 앵커를 통해 특별히 연결되었을 수 있는 영역을 강조하는 데 매우 유용하게 쓰일 수 있다
링크 스타일 의사클래스
A 링크 상태표시 의사클래스 선택자를 써서 링크 스타일을 지정해주는데, 먼저 링크가 존재할 수 있는 다양한 상태에 대한 이해가 요구된다: a:link는 텍스트 링크(파란색 밑줄), a:visited는 방문한 링크(자주색), a:focusTab 키 등으로 이동하여 포커스가 주어진 링크(초점이 맞춰져 윤곽선이 표시된 때), a:hover는 마우스 커서가 올라온 때(손모양 포인터), a:active는 클릭한 순간(빨간색)인데.. 스타일 설정 시 반드시 이 순서를 지켜주어야 한다!
                                                    
                                                        
                                                    
                                                
                                                    
                                                        /* [A 링크 스타일] */
                                                        .A-container-Box {
                                                            display: flex; gap: 0.625%;
                                                        } .A-container-Box a {
                                                            flex: 1;
                                                            color: black; text-align: center; line-height: 3;
                                                            text-decoration: none; outline: none;
                                                        }
                                                    
                                                        .A-container-Box a:link, .A-container-Box a:visited {
                                                            background-color: palegoldenrod;
                                                        } .A-container-Box a:focus, .A-container-Box a:hover {
                                                            color: white; background-color: orange;
                                                        } .A-container-Box a:active { background-color: darkred; }
                                                    
                                                

문서 위치지정 선택자

문서 위치지정 선택자는 문서 구조상의 부모-자식간, 형제간 관계를 가리키는데, 원칙적으로 child는 자식 요소를 의미하며(손자 요소는 이에 해당되지 않는다!), type은 형제 관계에 있는 요소를 의미한다

위치지정 선택자
:first-child는 (부모요소 아래)첫번째 형제요소(= 장남), :last-child는 (부모요소 아래)마지막 형제요소(= 막내)를 가리킨다. 한편, :only-child는 형제가 없는 요소(= 독자)를 가리킨다
  1. 맏형 li
  2. 둘째 li
  3. 막내 li
    • 형제가 없는 독자 li
                                                    
                                                        
                                                    
                                                
                                                    
                                                        .ol-1 li:first-child { background: rgb(191, 227, 247); } /* 부모(.ol-1) 밑 자식 중 장남 */
                                                        .ol-1 li:last-child { background: rgb(236, 236, 186); } /* 부모(.ol-1) 밑 자식 중 막내 */

                                                        /* 부모가 어떤 ul이나 ol이건간에.. 부모 아래 유일한 독자로 태어난 li */ 
                                                        .ol-1 li:only-child { color: red; }
                                                    
                                                

ol-1 :only-child { color: red; } 식으로 해도 같습니다!

:first-of-type은 같은 요소 타입에서 처음에 위치한 요소를 가리키며, :last-of-type은 같은 요소 타입에서 마지막에 위치한 요소를 가리킨다. 한편, :only-of-type은 (다른 자식요소들과는 무관하게)해당 타입의 요소로는 유일할 때를 가리킨다:

Para

Div 1
Div 2
Div 3
                                                    
                                                        
                                                    
                                                
                                                    
                                                        .my-parent :first-child { /* .my-parent 아래, 첫번째 자식*/
                                                            color: blue;
                                                        }
                                                        
                                                        .my-parent div:first-of-type {  /* .my-parent 아래, div 타입 중 첫번째 */
                                                            color: red;
                                                        } .my-parent div:last-of-type {  /* .my-parent 아래, div 타입 중 맨 끝 */
                                                            color: goldenrod;
                                                        }
                                                    
                                                

.my-parent div:last-child { color: green; } 식으로 해도 같습니다!


실제로는 자식과 형제 관계가 그리 명쾌하게 구분되지 않고, 따라서 언제 child 를 쓸지 언제 type 을 쓸지도 애매하고, 거기에 앞에 부모요소를 붙일 때와 그렇지 않을 때의 차이점도 그렇고, 순서 번호도 0 이 시작인지 1 이 시작인지도 명확히 구분되지 않는 경우도 있고 하니.. 실제로는 각 상황에 맞춰 그때 그때 직접 결과를 확인해가면서 코딩해야할 것입니다 ㅡㅡ;

순서지정 선택자
:nth-child(n)는 (자식 대상)n 번째 요소를 선택하며, :nth-of-type(n)는 (타입 대상)n 번째(모두 1 부터 센다) 요소를 선택한다. 반면, :nth-last-child(n):nth-last-of-type(n)는 뒤에서부터 n 번째(1 부터 센다) 요소를 선택한다:
  1. html 5
  2. Css 3
  3. Bootstrap 5
                                    
                                        
                                    
                                
                                    
                                        .ol-2 li:nth-child(2) {
                                            background-color: yellow;
                                        }
                                    
                                
n 대신 an + b 도 사용할 수 있다. 예컨대, 2n + 1은 홀수번째가 된다 여기서 n 는 0부터 시작한다!
                                    
                                        table tr:nth-child(2n+1) { /* n에는 순차적으로 0, 1, 2, ..가 들어간다 ← 곧, 홀수 행들이 된다 */
                                            background:lightgray; color:black;
                                        }                                                    
                                    
                                

참고로, 단순히 짝수/홀수 라면; 키워드 even/odd 를 사용할 수도 있다!

                                                    
                                                        
                                                    
                                                
                                                    
                                                        #doc_structure {
                                                            overflow: hidden;
                                                        } #doc_structure ul {
                                                            list-style: none;
                                                        } #doc_structure li {
                                                            float:left;
                                                            width: 8em; height: 3em;
                                                            line-height: 3em;
                                                            text-align: center;
                                                            border: 1px #818181 solid;
                                                            box-shadow: 1px 1px 2px #bbb;
                                                        }
                                                        
                                                        #doc_structure li a {
                                                            padding: 1em;
                                                            color: #292929;
                                                            text-shadow: 1px 1px 2px #cccccc;
                                                            text-decoration: none;
                                                        }
                                                        
                                                        #doc_structure li:hover {
                                                            background-color: #333333;
                                                        } #doc_structure li:hover > a {
                                                            color: #FFF;
                                                            text-shadow: 0px 1px 0px #fff;
                                                        }
                                                        
                                                        #doc_structure li:first-child {
                                                            border-top-left-radius: 1em; border-bottom-left-radius: 1em;
                                                        } #doc_structure li:last-child {
                                                            border-top-right-radius: 1em; border-bottom-right-radius: 1em;
                                                        }
                                                    
                                                

이 문서 위치(순서) 지정 선택자는 가상요소 선택자와 더불어 Css와 JavaScript 등에서 빈번히 사용되긴 하지만, 또한 가장 혼란스러운 선택자이니 여러 상황에서(예컨대, ul 아래 li.. 들이 들어있는 경우와 여러 div 아래 각각의 h4 & p.. 들이 들어있는 경우 등) 직접 여러 상황을 만들어 코딩하면서 수많은 시행착오를 거쳐야만 그 움직임들을 제대로 파악할 수 있습니다 - 그래도 역시 혼란스럽고 애매하긴 합니다, 그저 코딩 시 이넘들은 최대한 피하는게 상책입니다 ㅡㅡ;

가상요소 선택자

는 기존 요소에 클래스를 적용하는 것이 아니라, DOM에 완전히 새로운 html 요소를 마크업에 추가한 것처럼 작동한다!

가상요소 선택자
가상요소 선택자는 지정한 요소의 앞이나 뒤 공간에 텍스트나 이미지 요소를 생성하는데, 다른 선택자와는 달리 content 속성을 사용할 수 있다(사용해야만 한다!) - 곧, 가상요소 선택자 ::before::aftercontent 속성을 정의하는 경우에만 요소 내에 하위 요소를 만든다!

[앞과 뒤를 채웁니다]

                                    
                                        
                                    
                                
                                    
                                        .before-after::before { content: '(::before)'; color: blue; }
                                        .before-after::after { content: '(::after)'; color: red; }
                                    
                                

참고로, 이 코드는 단지 가상요소가 무언가를 보여주기 위한 것일 뿐, 가상요소를 써서 실제로 텍스트 문자열을 넣는 것은 바람직하지 않다!

가상요소는 보통 불릿 기호, 버튼의 그림자 효과나 아이콘, 캐릭터 이미지 등을 만들 때, 또는 레이아웃상의 가로/세로 선을 그어줄 때, 자동 번호 매기기 등의 경우에 태그 대신 사용된다

[div::before, div::after]

                                    
                                        
                                    
                                
                                    
                                        .box_before_p::before {
                                            content: "";
                                            display: inline-block; width: 1em; height: 1em; background-color: green;
                                        } .box_after_p::after { content: " ➥"; }
                                    
                                

::before::after 가상요소가 생성되면 제한없이 원하는 대로 스타일을 지정할 수 있다. 단, ::before::after 요소는 내부에 하위요소를 허용하는 요소(= 문서 트리가 있는 요소)에만 삽입할 수 있다 따라서 닫기 태그가 없는 <img> 및 <video>, <input>와 같은 요소에서는 사용할 수 없다!

  • 서울
  • 부산
  • 대구
                                                    
                                                        
                                                    
                                                
                                                    
                                                        ul.bullet_list_ex li { position: relative; padding-left: 10px; list-style-type: none; }
                                                        ul.bullet_list_ex li::after {
                                                            display: block;
                                                            position: absolute; left: 0; top: 10px; width: 5px; height: 5px;
                                                            background-color: #3c4147; border-radius: 50%;
                                                            content: "";
                                                        }
                                                        ul.bullet_list_ex.green li::after { background-color: #14d518; }
                                                    
                                                

가상요소는 태그가 아니므로 스크립트를 적용할 수 없으며, 아이콘을 표시할 때는 반드시 그 크기도 함께 지정해주어야 한다!

  • 서울
  • 부산
  • 대구
                                                    
                                                        
                                                    
                                                

이 사용자정의 가상요소 클래스를 이용하면; html 기본 불릿 기호를 이 모양으로 바꿔서 자신의 불릿 기호로 사용할 수 있습니다 - 리스트 작성 시 위 클래스만 적용해주면 됩니다

                                                    
                                                        .style-check2 li {
                                                            position: relative; padding-left: 0.25rem; list-style-type: none;
                                                        } .style-check2 li:before {
                                                            position: absolute; top: 0.0625rem; left: -1rem; width: 1rem;
                                                            padding-right: 0.5rem; background-repeat: no-repeat;
                                                            color: goldenrod; /* 기호 색상 */
                                                            content: '✓'; /* 기호 모양 */
                                                        }
                                                    
                                                

위 Css 코드에서 content= ""; 안의 문자만 바꿔주면(복사하여 넣든, 해당하는 엔티티 코드값을 넣든간에) 다른 불릿 기호를 사용할 수 있습니다 원한다면; 위 코드의 color: 색상;에서 불릿 기호의 색상도 바꿔줄 수 있습니다!

플레이스 홀더 가상요소
가상요소 선택자 요소::placeholder는 <input>나 <textarea> 요소 내의 사전 입력 텍스트를 나타내는데, 이 플레이스 홀더 텍스트는 사용자가 <input> 요소에 컨텐츠를 입력하기 시작하면 사라지게 된다
                                    
                                        
                                    
                                
                                    
                                        #your_name::placeholder, #your_email::placeholder {
                                            color: gray; opacity: 0.5;
                                        }
                                    
                                

가상요소 ::placeholder에 사용가능한 속성들로는 color, background, font-text- 관련 속성 등이 있다


* cf) 특정 사용자에게는 이 텍스트 정보가 입력된 값으로 받아들여질 위험성이 상존한다! 따라서, 플레이스홀더를 사용하는 대신; 입력필드 외부 가까운 위치에 포함시키고, aria-describedby 속성을 사용하여 <input> 요소와 해당 힌트를 연결해주는 것도 좋다 - 이를 통해 입력필드에 컨텐츠가 입력되어도 힌트 내용은 계속 제공되며, 페이지가 로드될 때 입력필드에는 사전 입력된 내용 없이 나타나게 된다:

(Ex: Kjc@gmail.com)
                                    
                                        
                                    
                                
백드롭 가상요소
<dialog>나 <video>와 같이 풀스크린 모드로 표시되는 요소가 있는 경우; 가상요소 선택자 ::backdrop을 써서 배경(해당 요소와 페이지의 나머지 부분 사이의 공간) 스타일을 지정해줄 수 있다:
                                    
                                        video::backdrop { background-color: goldenrod; }
                                    
                                
WebVTT 큐 가상요소
가상요소 선택자 요소::cue는 <video> 요소의 자막인 WebVTT 큐를 스타일링하는데, ::cue(요소)로 캡션 내 특정 요소의 스타일을 지정해줄 수도 있다:
                                    
                                        video::cue { color: green; }
                                        video::cue(i) { color: pink; } /* <i> 요소에만 색상을 달리한다! */
                                    
                                

Marker 가상요소

Css 레이아웃 모델에서 Marker는 각 목록 항목과 연결된 마커 상자로 표시되는데, 마커 상자는 일반적으로 불릿 기호를 포함하는 컨테이너이다. 예컨대, <li> 요소 전체가 아닌 마커 상자만의 스타일을 지정하고자 할 때, ::marker 가상요소 선택자를 사용한다!

Marker 가상요소
가상요소 선택자 ::marker는 목록 리스트의 글머리 기호(나 숫자), <summary> 요소의 화살표 스타일을 지정할 수 있다 참고로, ::marker 가상요소는 ::before 의사클래스를 사용하여 삽입한 요소보다 앞에 위치한다!
  • html 5
  • Css 3
  • Bootstrap 5
                                    
                                        
                                    
                                
                                    
                                        .ul_marker_ex ::marker { color: rgb(239, 97, 168); }
                                    
                                

가상요소 ::marker에 사용가능한 속성들로는 글자색(color), font 관련(font-size, font-weight 등), 텍스트 관련(white-space 등), content, animationtransition 속성 등이 있다 바로 위에서 엄청 복잡한 Css 스타일 설정을 통해 리스트 불릿 색상을 바꿔봤는데, 이 방식이 훨씬 간결하군요 ^^


* cf) <li>가 아닌 항목에도 display: list-item; 속성을 추가하여 리스트 항목으로 만들 수 있다 - 예컨대, 타이틀에 불릿 기호를 넣어 ::marker 가상요소를 사용하여 다른 것으로 변경할 수 있도록 하는 것이다

Web Codding Stydy

  • html 5
  • Css 3
  • Bootstrap 5
                                                    
                                                        
                                                    
                                                
                                                    
                                                        ul.list-marker {
                                                            list-style-type: "⪧";
                                                        } ul.list-marker li { padding-left: 0.5em; }
                                                        
                                                        .list-marker ::marker { color: orangered; }
                                                        
                                                        .list-marker-h4 {
                                                            display: list-item; margin-left: 2rem;
                                                        } .list-marker-h4::marker { content: " ¶ "; }
                                                    
                                                

이처럼, 무엇이든 목록 리스트 뷰로 변환할 수는 있지만.. 사용자 접근성이라는 측면에서는; 실제 목록의 경우에는 올바른 목록 마크업을 사용하는 것이 보다 바람직하다!

아코디언 마커
아코디언에서 ::marker 가상요소는 <summary> 요소의 닫힌 상태 및 열린 상태에서의 기호 모양, 텍스트 색상 등을 변경해줄 수 있다
[요약] ← 상세히 보려면 클릭하세요..

[* 세부 상세정보] 이곳은 처음에는 보이지 않다가 위 [요약]을 클릭하면 펼쳐져서 보여진다 ← 다시 클릭하면 닫힌다!

                                    
                                        
                                    
                                
                                    
                                        .details_marker ::marker {
                                            color: green; font-weight: bold; /* 마커 색상과 글자 굵기 설정 */
                                        }
                                        
                                        .details_marker summary::marker { /* 닫힌 상태에서의 마커 */
                                            content: '+ '; /* + 기호와 공백으로 변경 */
                                        } .details_marker[open] summary::marker { /* 열린 상태에서의 마커 */
                                            content: '- '; /* - 기호와 공백으로 변경 */
                                        }
                                    
                                

복수의 <details> 요소에 같은 name 값을 주어 여러 <details> 요소를 그룹화하여 한 번에 하나씩(만!) 열리도록 할 수 있는데, 이를 이용하면 자바스크립트 없이도 아코디언과 같은 UI(예컨대, FAQs 게시판 등)을 쉽게 만들 수 있습니다!

문단/텍스트 가상요소

가상요소 선택자에는 원칙적으로 :: 기호를 쓰도록 규정되어 있지만, 모든 브라우저에서 이전 웹페이지들과의 호환성을 위하여 : 또한 지원한다!

문단 첫 글자
가상요소 선택자 요소::first-letter는 지정한 (블록)요소의 첫 글자 를 지정하여 선택한다. 이 위 제목을 작성한 코드: <dt class="dropcap">문단 첫 글자</dt> 첫 글자가 더 커졌나요?
                                    
                                        .dropcap::first-letter {
                                            font-size: 3em; line-height: 0.92; margin-right: 0.375rem;
                                            float: left;
                                        }
                                    
                                

가상요소 ::first-letter에 사용가능한 속성들로는 color, 배경 관련(background-image 등), 테두리 관련(border-color 등), 글꼴 관련(font-size, font-weight 등), 텍스트 관련(text-decoration, word-spacing 등), float 등이 있다

문단 첫 줄
가상요소 선택자 요소::first-line은 지정한 (블록)요소의 첫 줄 을 지정하여 선택한다:

가상요소 선택자에는 원칙적으로 :: 기호를 쓰도록 규정되어 있지만, 모든 브라우저에서 이전 웹페이지들과의 호환성을 위하여 : 기호 또한 지원한다!

가상요소는 기존 요소에 클래스를 적용하는 것이 아니라 완전히 새로운 html 요소를 마크업에 추가한 것처럼 작동한다!

                                    
                                        
                                    
                                
                                    
                                        
                                            .firstline_ex p:first-child::first-line { /* .firstline_ex 아래에 있는 첫번째 p의 첫번째 줄 */
                                                font-style: italic; color: goldenrod;
                                            }
                                        
                                    
                                

가상요소 선택자 ::first-line에 사용가능한 속성들로는 color, 배경(background), font- 및 text- 관련 속성 등이 있다

선택한 영역
가상요소 선택자 요소::selection은 사용자가 드래그한 영역을 지정하여 선택한다

(* 이 <p> 문단 내에서 드래그해보시고, 이 위 문단에서도 드래그해보세요.. 다른가요?)

                                    
                                        
                                    
                                
                                    
                                        /* [선택한 영역 ::selection] */
                                        p::selection { color: white; background: orange; }
                                    
                                

가상요소 ::selection에 사용가능한 속성들로는 color, background-color, text- 관련 속성 등이 있다

wave