국비교육(22-23)

117일차(1)/CSS(16) : CSS3 Flex 활용(4)

서리/Seori 2023. 3. 28. 19:51

117일차(1)/CSS(16) : CSS3 Flex 활용(4)

 

 

- css3 flexbox 지난 예제 복습

 

 

- 화면 폭이 줄어들면 배치 방식이 바뀌는 navbar 를 만들어보았다.

 

 

- nav의 자식 요소로 ul, form이 있는데,

  이 자식 요소들을 가로로 배치하느냐 세로로 배치하느냐의 문제일 뿐이다.

- 가로 : flex-direction:row;

- 세로 : flex-direction:column;

 

- ul, form575픽셀까지는 column 으로 적용되었다가 그 이상이 되면 가로로 바뀐다.

 

 

- 위에서는 row 정렬을 적용하고 아래에서는 세로로 정렬하겠다는 css요소를 넣어 충돌한다면?

- 한 요소에 적용하는 css 두개가 존재한다면 나중에 정의한 것이 이긴다!

- 아래에 있는 미디어 쿼리 조건을 충족한다면 column으로 설정한 것은 없어지는 것과 같다.

 

 

- 미디어쿼리 ( ) 안에 존재하는 css는 조건부로 존재하는 css이다. 마치 if문을 사용하는 것과 같다.

- 선택자의 구체성이 같다면(현재 클래스 선택자 사용중) 나중에 정의한 것이 이긴다.

 

 

- 그래서 폭이 좁아진 경우에만 ul, form이 세로로 배치된 것!

 

 

- 브라우저 폭이 넓을 경우: 기본 css 적용

 

 

- 브라우저 폭이 좁아진 경우: 미디어쿼리 안에 들어있는 css 적용

 

- nav 요소 안의 ul, form을 row로 가로 배치하는데, 누가 얼마만큼의 width를 가질 것인지 결정하려면?

→ ul의 flex:3, form의 flex:1 으로 css를 적용하면 3:1의 비율로 나누어 가진다.

 

 

flex:1;

- flex: 1 1 0px 을 의미한다. 확대될 때 1의 비율, 축소될때 1의 비율을 가진다는 뜻

 

 

- input과 button은 버튼이 먼저 공간을 가지고 남는 부분을 input 요소가 가지는 레이아웃으로 만들었다.

 


 

Step08_example_media.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Step08_example_media.html</title>
    <style>
        .media {
            display: flex;
            align-items: flex-start;
            background: #F6F3EB;
            padding: 1em;
            border-radius: 3px;
            max-width: 24em;
        }
        .media-object {
            margin-right: 1em;
        }
        .media-body {
            flex: 1;
        }
        .media-heading {
            margin: 0 0 .5em;
        }
    </style>
</head>
<body>
    <div class="media">
        <img class="media-object" src="images/puff2.png">
        <div class="media-body">
            <h3 class="media-heading">바나나</h3>
            <p>Lorem ipsum dolor sit amet consectetur, adipisicing elit. Quae dignissimos officiis dolorum explicabo hic sed repellendus sit laudantium nam consequatur expedita saepe, veritatis natus quia quidem repellat nemo. Perferendis, tenetur!</p>
        </div>
    </div>
</body>
</html>

 

- 미디어 쿼리 활용 예제

 

 

 

- 아무것도 적용하지 않은 기본 레이아웃 상태! (세로로 일렬로 배치)

 

 

- 이런 이미지를 아래와 같이 배치하고 싶다면 어떻게 해야할까?

- 이전에는 float를 사용했는데, flex를 활용해볼 수 있다.

 

 

- css flex를 활용해 이런 구조로 만들어보기

- 가로 폭의 최대 크기를 max-width 로 제한한다.

- 1em : 16px 이다. 물려받은 글자의 크기가 기준이 된다.

 

 

- .media-body 의 가로폭은 이미지가 차지하고, 남는 폭은 div가 다 가진다는 의미!

 


 

Step08_example_form.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Step08_example_form.html</title>
    <style>
        .wrapper{
            background-color: whitesmoke;
            list-style-type: none;
            padding: 0;
            border-radius: 3px;
        }
        .form-row{
            display: flex;
            justify-content: flex-end;
            padding: .5em;
        }
        .form-row > label {
            padding: .5em 1em .5em 0;
            flex: 1;
        }
        .form-row > input {
            flex: 2;
        }
        .form-row > input, .form-row > button {
            padding: .5em;
        }
        .form-row > button {
            background: gray;
            color: white;
            border: 0;
        }
    </style>
</head>
<body>
    <div class="container">
        <h3>회원가입 폼</h3>
        <form action="">
            <ul class="wrapper">
                <li class="form-row">
                    <label for="name">이름</label>
                    <input type="text" id="name">
                </li>
                <li class="form-row">
                    <label for="addr">주소</label>
                    <input type="text" id="addr">
                </li>
                <li class="form-row">
                    <button type="submit">가입</button>
                </li>
            </ul>
        </form>
    </div>
</body>
</html>

 

- 회원 가입 폼의 각각의 정보도 목록이다.(li 요소)

 

 

- 기본 레이아웃. 이렇게 생긴 폼에 css를 적용해볼 것

 

- 각각의 form-row 클래스에 css적용

 

 

- 부모요소에 css를 한번에 적용하면 편리하다. 자식요소를 묶어서 한번에 서식을 적용할 수 있다.

- css를 사용하면 가로 폭을 어떻게 나눠가질지 등등을 쉽게 정할 수 있다.

 

 

- flex-end 때문에 뒤쪽(우측)에 배치됨

 

 

- 자식 요소들끼리 폭을 나눠 가진 것

- 가로 폭을 label 1, input 2의 비율로 하여 1:2로 배치

 

 

- 이런 형태로 만들어진다.

- 입력 폼은 폭에 상관없이 우측 정렬된다.

 

 

 

- grow, shrink, basis 이 3개의 값을 한번에 적용하는 것이 flex 요소이다.

- 만들어둔 util로 연습해보며 flex의 활용법 익히기!