[HTML/CSS] 활용

KIM DA MI·2023년 2월 16일
2

HTML/CSS

목록 보기
3/4
post-thumbnail

오늘은 웹 페이지의 레이아웃을 구성하기 위해 빼놓을 수 없는 Flexbox에 대해 알아보았다.

1. 레이아웃


와이어프레임(Wireframe)

  • 웹 또는 애플리케이션을 개발할 때 레이아웃의 뼈대를 그리는 단계를 와이어프레임이라고 한다.
  • 와이어프레임은 말 그대로 "와이어로 설계된 모양"을 의미하며, 단순한 선이나, 도형으로 웹이나 앱의 인터페이스를 시각적으로 묘사한 것이다.
  • 와이어프레임은 아주 단순하게, 레이아웃과 제품의 구조를 보여주는 용도이다.
  • 와이어프레임의 가장 큰 목적은, 화면의 영역을 구분하는 일이다.

목업(Mock-up)

  • 산업에서 목업은 실물 크기의 모형을 뜻한다.
  • 웹 또는 앱을 제품이라고 할 때, 목업은 실제 제품이 작동하는 모습과 동일하게 HTML 문서를 작성한다.
  • 와이어프레임과 목업을 작성하는 단계를 반드시 진행해야한다.
  • HTML 문서를 통해 화면을 다 그려보지 않으면, JavaScript를 적용한 완성본이 어떤 형태를 가질지 상상하기 어렵다. (마치 설계도 없이 건물을 짓는 것과 같다!)

2. 화면을 나누는 방법


HTML 구성하기

  • 대부분의 경우 콘텐츠의 흐름은 좌에서 우, 위에서 아래로 흐른다.
  • CSS로 화면을 구분할 때는 수직 분할과 수평 분할을 차례대로 적용하여 콘텐츠의 흐름을 따라 작업을 진행한다.
    1. 수직 분할 : 화면을 수직으로 구분하여, 콘텐츠가 가로로 배치될 수 있도록 요소를 배치한다.
    2. 수평 분할 : 분할된 각각의 요소를 수평으로 구분하여, 내부 콘텐츠가 세로로 배치될 수 있도록 요소를 배치한다.

레이아웃 리셋

  • HTML 문서는 기본적인 스타일을 가지고 있다. 때때로 HTML 문서가 갖는 기본 스타일이, 레이아웃을 잡는 데 방해가 되기도 한다.

  • 박스의 시작을 정확히 (0,0)의 위치에서 시작하고 싶은데, <body> 요소가 가진 기본 스타일에는 약간의 여백이 있다.

  • width, height 계산이 여백을 포함하지 않아 계산에 어려움이 있다.

  • 브라우저(크롬, 사파리 등)마다 여백이나 글꼴과 같은 기본 스타일이 조금씩 다르다.

  • 이러한 수요에 따라 초기화(리셋)을 위한 다양한 라이브러리(Normalize.css)가 등장했지만, 사실 굳이 라이브러리를 사용할 필요는 없으며, 위에 언급한 문제를 해결할 몇 줄의 코드를 적용시키면, 기본 스타일링을 제거하여 디자인한 대로 레이아웃을 구현할 수 있다.

  • [코드] 기본 스타일링을 제거하는 CSS 코드의 예시

    * {
      box-sizing: border-box;
    }
    
    body {
      margin: 0;
      padding: 0;
    }

3. Flexbox


📖 학습 목표

  • display: flex; 를 자식 요소가 아닌 부모 요소에 적용해야 함을 이해한다.
  • flex-direction 을 이용하여 요소를 정렬할 방향을 결정할 수 있다.
  • justify-contentalign-items 를 이용하여 수평-수직 정렬을 결정할 수 있다.
  • flex-grow 를 이용하여 요소를 얼마나 늘릴 것인지 결정할 수 있다.
  • flex-basis 를 이용하여 요소의 기본 크기를 결정할 수 있다.
  • VSCode의 레이아웃을 Flexbox를 이용하여 구현할 수 있다.

Flexbox로 레이아웃 잡기

  • Flex(Flexible)는 "잘 구부러지는, 유연한"이라는 뜻이다.
  • Flexbox로 레이아웃을 구성한다는 것은, 박스를 유연하게 늘리거나 줄여 레이아웃을 잡는 방법이다.

display: flex 분석하기

  • display: flex 는 부모 박스 요소에 적용해, 자식 박스의 방향과 크기를 결정하는 레이아웃 구성 방법이다.

부모 요소에 적용해야하는 Flexbox 속성들


  • Flexbox 속성중에서는 부모 요소에 적용해야하는 속성들, 자식 요소에 적용해야하는 속성들이 있다.
  • 적절한 위치에 속성을 지정해주지 않으면 요소들이 원하는대로 정렬되지 않는다.

1. flex-direction : 정렬 축 정하기

  • flex-direction 속성은 부모 요소에 설정해주는 속성으로, 자식 요소들을 정렬할 정렬 축을 정한다. 아무 설정도 해주지 않으면 기본적으로 가로 정렬을 한다.
    • 주요 속성값으로는 row, column, row-reverse, column-reverse 등이 있다.

2. flex-wrap : 줄 바꿈 설정하기

  • flex-wrap 속성은 하위 요소들의 크기가 상위 요소의 크기를 넘으면 자동 줄 바꿈을 할 것인지 정한다. 설정해 주지 않으면 줄 바꿈을 하지 않는다.
    • 주요 속성값으로는 nowrap, wrap, wrap-reverse 등이 있다.

3. justify-content : 축 수평 방향 정렬

  • justify-content 속성은 자식 요소들을 축의 수평 방향으로 어떻게 정렬할 것인지 정한다.
  • 요소들이 가로로 정렬되어 있다면 가로 방향으론 어떻게 정렬할 것인지, 세로로 정렬되어 있다면 세로 방향으론 어떻게 정렬할 것인지 정하는 속성이다.
    • 주요 속성값으로는 flex-start , flex-end, center, space-between, space-around
      이 있다.
      • flex-direction : row인 경우 ↔
      • flex-direction : column인 경우 ↕️

4. align-items : 축 수직 방향 정렬

  • align-items 속성은 자식 요소들을 축의 수직 방향으로 어떻게 정렬할 것인지 정한다.

  • 요소들이 가로로 정렬되어 있다면 세로 방향으론 어떻게 정렬할 것인지, 세로로 정렬되어 있다면 가로 방향으론 어떻게 정렬할 것인지 정하는 속성이다.

    • 주요 속성값으로는 stretch , flex-start , flex-end , center , baseline
      이 있다. (각 속성값의 특징이 명확하게 드러날 수 있도록 자식 요소의 글씨 크기를 각각 다르게 설정함)
      • flex-direction : row 인 경우 ↕️
      • flex-direction : column 인 경우 ↔


자식 요소에 적용해야 하는 Flexbox 속성


  • 부모 요소에 적용해야 하는 속성들이 자식 요소들의 정렬과 관련이 있었다면, 자식 요소에게 적용해야 하는 속성인 flex 는 요소가 차지하는 공간과 관련이 있다.

flex 속성의 값

  • flex 속성에는 세 가지 값을 지정해줄 수 있다.

    • grow(팽창 지수) : 요소의 크기가 늘어나야 할 때 얼마나 늘어날 것인지를 의미
    • shrink(수축 지수) : 요소의 크기가 줄어들어야 할 때 얼마나 줄어들 것인지를 의미
    • basis(기본 크기) : 늘어나고 줄어드는 것과 상관없이 요소의 기본 크기는 얼마인지를 의미
  • 자식 요소에 flex 속성을 따로 설정해주지 않으면 다음과 같은 기본값이 적용되며, 왼쪽에서부터 오른쪽으로 콘텐츠의 크기만큼 배치된다.

    flex: 0 1 auto; /* flex: grow shrink basis */

  • 꼭 flex 속성 안에 세 가지 값을 한 번에 설정해줄 필요 없이, 다음과 같이 각 값을 따로 지정해줄 수 있다.

    flex-grow: 0;
    flex-shrink: 1;
    flex-basis: auto;

1. grow : 자식 박스는 얼마나 늘어날 수 있을까?

  • grow 의 기본 값인 0은 빈 공간이 있어도 늘어나지 않음을 의미한다.
  • 따라서 빈 공간이 있음에도 박스들이 늘어나지 않는다.
  • box1만 flex-grow : 1 로 설정
    flex-grow 의 기본값은 0이므로 나머지 박스는 flex-grow : 0 인 상태이다.
    • grow는 box1 : box2 : box3 = 1 : 0 : 0 이므로 box1이 모든 공간을 차지
  • box2도 flex-grow : 1 로 설정
    box3만 flex-grow : 0 인 상태이다.
    • grow는 box1 : box2 : box3 = 1 : 1 : 0 이므로 box1과 box2가 1:1로 공간을 나눠 가짐
  • box3도 flex-grow : 1 로 설정
    세 박스 모두 flex-grow : 1 인 상태
    • grow는 box1 : box2 : box3 = 1 : 1 : 1 이므로 세 박스가 1:1:1로 공간을 나눠 가짐
  • 이처럼 팽창지수는 자식 요소의 grow값 / 자식 요소들의 grow값의 총합 의 비율로 빈 공간을 가져간다.
  • 팽창지수의 절대적 크기가 아닌 총합에서의 비율로 빈 공간을 차지한다.

2. shrink : 자식 박스는 얼마나 줄어들 수 있을까?

  • shrink(수축 지수)는 grow와 반대로, 설정한 비율만큼 박스 크기가 작아진다.
    (비율이 클수록 더 많이 줄어든다.)
  • 그러나 flex-grow 속성과 flex-shrink 속성을 함께 사용하는 일은 추천하지 않는다.
    flex-shrink 속성은 width 나 이후 설명할 flex-basis 속성에 따른 비율이므로 실제 크기를 예측하기가 어렵기 때문이다.
  • 비율로 레이아웃을 지정할 경우 flex-grow 속성 또는 flex: 1 auto와 같이 grow 속성에 변화를 주는 방식을 권장한다.
  • flex-grow 속성으로 비율을 변경하는 경우, flex-shrink 속성은 기본값인 1로 두어도 무방하다.

3. basis : 이 박스의 기본 크기는 얼마일까?

  • basis(기본 크기) 는 자식 박스가 flex-grow 나 flex-shrink 에 의해 늘어나거나 줄어들기 전에 가지는 기본 크기이다.
  • flex-grow 가 0일 때, basis 크기를 지정하면 그 크기는 유지된다.
  • grow 는 0 : 1 : 1 로 설정하고, box1에 flex-basis : 50px로 설정했을 경우
    • box1의 크기가 늘어나거나 줄어들지 않고 50픽셀을 유지한다.
  • flex-grow 속성의 값이 0인 경우에만 flex-basis 속성의 값이 유지된다.
  • diplay 속성에 flex 가 적용된 컨테이너 내부에 존재하는 자식 박스는 경우에 따라, basis 로 설정된 크기가 항상 유지되는 것은 아니다.
  • flex-grow 속성의 값이 양수일 경우, 늘어나면서 flex-basis 속성에 적용한 값보다 커질 수도 있다.

1개의 댓글

comment-user-thumbnail
2023년 2월 17일

😍👍

답글 달기