본문 바로가기
SeSAC

[SeSAC] 웹 풀스택 과정_CSS/Bootstrap

by hotdog7778 2023. 8. 1.

반응형 이란 동일한 웹 페이지를 상황에 따라 레이아웃을 다르게 보여주는 것입니다.

예로 https://www.kakaomobility.com 웹사이트에서 브라우저의 크기를 변경하거나 모바일로 웹사이트를 볼 때 같은 내용의 레이아웃들이 변경되는 것을 볼 수 있습니다.

 

1. 뷰포트

뷰포트(viewport)는 현재 화면에 보이고 있는 다각형(보통 직사각형)의 영역입니다. 웹 브라우저에서는 현재 창에서 문서를 볼 수 있는 부분(전체화면이라면 화면 전체)을 말합니다.

 

2. CSS 미디어 쿼리

CSS Media Query는 예를 들어 "뷰포트가 480 픽셀보다 넓다."라고 여러분이 지정한 규칙에 브라우저 및 장치 환경이 일치하는 경우에만 CSS를 적용할 수 있는 방법을 제공합니다.

 

2-1. 미디어 쿼리 구문

@media media-type and (media-feature-rule) {
  /* CSS rules go here */
}

구문 예시 (media-type 을 생략)

@media (max-width: 480px) {
  /* 뷰포트의 width 가 480px 이하일때 */
  .aside {
    display: none;
  }
}

 

2-2. media-type

all, print, screen, speech 등이 있습니다. 기본값은 all 이며 생략 시 기본값이 적용됩니다.

예를 들어 print 적용 시 페이지 인쇄 시에만 동작합니다.

 

 

2-3. media-feature-rule

규칙을 적용할 기능을 작성합니다.

자주 사용하는 기능 규칙은 min-width , max-width , width와 같은 뷰포트의 너비와 관련된 기능 규칙입니다.

 

 

2-3-1. Orientation

세로 모드인지 가로 모드인지를 검사할 수 있도록 해주는 기능 규칙입니다.

세로 모드: Portrait(포트레이트) 모드

가로 모드: Landscape(랜드스케이프) 모드

구문 예시 : @media (orientation: landscape) {}

 

 

2-3-2. Hover

마우스 커서를 올렸는지 아닌지로 검사합니다. 터치스크린은 적용되지 않습니다.

구문 예시 : @media (hover: hover) {}

 

2-4. 논리연산 media-feature-rules

  • 논리 곱 (and) :
@media screen and (min-width: 400px) and (orientation: landscape) {
  body {
    color: blue;
  }
}
  • 논리 합 ( , ) :
@media screen and (min-width: 400px), screen and (orientation: landscape) {
  body {
    color: blue;
  }
}
  • 논리 부정 (not) :
@media not all and (orientation: landscape) {
  body {
    color: blue;
  }
}

 

 

실습. 브라우저의 너비에 따라 직사각형을 가로 - 세로로 배치하기

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>실습. 크기에따라 자리바꾸기</title>
    <link rel="stylesheet" href="./prac02.css" />
  </head>

  <body class="body">
    <div class="div">
      <div class="box1"></div>
      <div class="box2"></div>
      <div class="box3"></div>
    </div>
  </body>
</html>
#header {
  height: 100px;
  display: flex;
  justify-content: space-around;
  background-color: greenyellow;
  border: 1px solid red;
  align-items: center;
}
#div2 {
  display: flex;
}

.menu {
  margin-right: 10px;
}

@media (max-width: 768px) {
  #header {
    flex-direction: column;
    align-items: center;
  }
  #div2 {
    background-color: greenyellow;
    flex-direction: column;
    width: 100%;
    align-items: center;
  }
}

 

3. 부트스트랩

부트스트랩은 웹디자인을 쉽게하기 위해 미리 몇가지의 CSS의 클래스 선택자와 정의된 스타일시트, 자바스크립트 플러그인을 모은 프레임워크입니다.

 - 공개 HTML CSS JS

 - CSS 프레임워크

 - https://getbootstrap.com

 

 

 

3-1. 부트스트랩 적용방법

 - DOC 링크 : https://getbootstrap.kr/docs/5.2/getting-started/introduction/

 - 추가로 부트스트랩을 적용한다음에 내가만든 css 코드를 추가로 적용하거나 태그에 클래스를 추가할 수 도 있다. 이때 부트스트랩에서 미리 정의된 클래스사용하지 않고 내가 클래스를 만들어서 사용하고싶을때가 있는데, 이때 이미 부트스트랩에서 그 클래스이름을 사용중인지 확인하는 일이 필요하다. 아니면 이런일을 방지하고자 부트스트랩에서 사용되는 명명규칙 [부트스트랩 에서는 단어-단어]과 다른 명명규칙을 사용하도록 하는것도 좋다.

 - 적용 예시 (HTML에 부트스트랩 CDN을 추가해준다.)

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Components</title>
    <!-- Bootstrap CDN (css) -->
    <link
      href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css"
      rel="stylesheet"
      integrity="sha384-4bw+/aepP/YC94hEpVNVgiZdgIC5+VKNBQNGCHeKRQN+PtmoHDEXuppvnDJzQIu9"
      crossorigin="anonymous"
    />

    <!-- Bootstrap CDN (js) -->
    <script
      src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"
      integrity="sha384-HwwvtgBNo3bZJJLYd8oVXjrBZt8cqVSpeBNS5n7C8IVInixGAoxmnlMuBnhbgrkm"
      crossorigin="anonymous"
    ></script>

    <!-- 내가 작성한 css도 참조 -->
    <link rel="stylesheet" href="./index.css" />
  </head>
  <body>
    <h1>Components</h1>
  </body>
</html>

 

 

 

4. 부트스트랩의 그리드 시스템

뷰포트 크기에 따라 12열을 적절하게 조정하는 반응형 시스템. 그리드 시스템은 콘텐츠를 보관할 행과 열 시리즈를 통해 페이지 레이아웃들 만드는데 사용됩니다.

* CSS 그리드, 부트스트랩의 그리드시스템은 다르다.

CSS 그리드 - https://developer.mozilla.org/ko/docs/Web/CSS/CSS_grid_layout

부트스트랩 그리드 시스템 - https://getbootstrap.kr/docs/5.0/layout/grid/

 

 

4-1. 중단점(Breakpoints)

Breakpoints는 반응형 디자인의 구성 요소입니다. 
Breakpoints를 사용하여 레이아웃을 특정 뷰포트 크기 또는 기기에서 조정할 수 있는 시기를 제어합니다.

 

 

부트스트랩에 정의된 중단점들은 미디어쿼리의 동작규칙들을 사용해 구현되었습니다.

출처. 부트스트랩 doc

 

/* 중단점 sm 과 같은 576px 이상 범위를 미디어쿼리로 표현 */
@media (min-width: 576px) { ... }

/* 중단점 md 과 같은 768px 이상 범위를 미디어쿼리로 표현 */
@media (min-width: 768px) { ... }

...

결과적으로 그리드를 사용해서 정적인 레이아웃도 만들 수 있고, 뷰포트 사이즈에 따른 반응형 레이아웃도 만들 수 있습니다.

 

 

4-2. 부트스트랩 그리드 실습

작성방법 : col-중단점-(x of 12)

 

case) col / col / col > 무조건 셋이한줄인데 넓이를 동등하게 나눠가짐

case) col-3 / col-3 / col-6 > 무조건 셋이 한줄인데 넓이를 설정값에 맞게 나눠가짐 ( 3:3:6)

case) col-sm-1 / col / col >

 - 중단점 이후에서 : col-1 / col / col

 - 중단점 이전에서 : col-12 / col / col (12를 다차지해서 행바뀜 > 2행)

case) col / col-sm-1 / col >

 - 중단점 이후에서 : col / col-1 / col

 - 중단점 이전에서 : col / col-12 / col (12를 다차지해서 행바뀜 > 3행)

case) col / col-sm-auto / col >

 - 중단점 이후에서 : col / col-auto / col (col-auto 컨텐츠 사이즈에의해 자동조절)

 - 중단점 이전에서 : col / col-12 / col (12를 다차지해서 행바뀜 > 3행)

 

참고. width: 100% 는 .container-fluid 로 구현

 

 

Equal-width

container 안에 row로 묶은 col 들을 넣어주면 됌

<div class="container text-center">
  <div class="row">
    <div class="col">
      1 of 2
    </div>
    <div class="col">
      2 of 2
    </div>
  </div>
  <div class="row">
    <div class="col">
      1 of 3
    </div>
    <div class="col">
      2 of 3
    </div>
    <div class="col">
      3 of 3
    </div>
  </div>
</div>

 

 

한열의 너비를 다르게 설정

위에 row는 한줄중에 중간 col이 그리드6개를 차지함. 나머지들은 남은 6개의 그리드를 나눠가짐

<div class="container text-center">
  <div class="row">
    <div class="col">
      1 of 3
    </div>
    <div class="col-6">
      2 of 3 (wider)
    </div>
    <div class="col">
      3 of 3
    </div>
  </div>
  <div class="row">
    <div class="col">
      1 of 3
    </div>
    <div class="col-5">
      2 of 3 (wider)
    </div>
    <div class="col">
      3 of 3
    </div>
  </div>
</div>

 

 

한줄의 넓이가 변하도록 (뷰포트에 따른 반응형)

- col-{breakpoint}-{x of 12}

 - col-{breakpoint}-auto

<div class="container text-center">
  <div class="row justify-content-md-center">
    <div class="col col-lg-2">  <!-- 중단점이 lg 일때(width lg기준보다크면 > col-2 가 적용), 다를땐 그냥 col이 적용(작을때겠지) -->
      1 of 3
    </div>
    <div class="col-md-auto">  <!-- md < x < lg . x에서 col 자동으로 -->
      Variable width content
    </div>
    <div class="col col-lg-2">
      3 of 3
    </div>
  </div> <!-- md 보다 작아지면 행이 여러개로 나뉘어짐 -->

  <div class="row">
    <div class="col">
      1 of 3
    </div>
    <div class="col-md-auto">
      Variable width content
    </div>
    <div class="col col-lg-2">
      3 of 3
    </div>
  </div>
</div>

 

 

중단점이 있는 경우이면 중단점 이하에서는 행이 분리됨

<div class="container-fluid text-center">
      <div class="row">
        <div class="col">
          1 of 3
        </div>
        <div class="col-md-auto"> <!-- md 중단점 기준으로 알아서 col이 적용되는데 사이즈는 넓이는 내부 컨텐츠 기준-->
          Variable width content
        </div>
        <div class="col">
          3 of 3
        </div>
      </div>
    </div>

 

 

어쨋든 중단점이 하나라도 들어가면 중단점 이하에서 행이바뀐다

이렇게 첫번째 col에 중단점이 들어가면 중단점이하에서 첫번째 div만 줄바꿈이 일어남 (2줄됨)

<div class="container-fluid text-center">
      <div class="row">
        <div class="col-md-auto">
          Variable width content
        </div>
        <div class="col">
          1 of 3
        </div>
        <div class="col">
          3 of 3
        </div>
      </div>
    </div>

 

 

중단점 사용해서 수평으로 div를 쌓기

sm 중단점인 576px 이상에서는 col이 적용되고,

그 이하 width 에서는 div가 3줄로 쌓입니다. col-12 라고 생각하면 될듯

  <div class="row">
    <div class="col-sm">col-sm</div>
    <div class="col-sm">col-sm</div>
    <div class="col-sm">col-sm</div>
  </div>

 

 

중단점 + 그리드중 몇개를 할당할지 까지 같이 사용

sm 중단점 이후부터는 8:4 로 그리드를 할당한다

  <div class="row">
    <div class="col-sm-8">col-sm-8</div>
    <div class="col-sm-4">col-sm-4</div>
  </div>

 

 

이러면 sm 중단점 이후에도 총량 12가 넘쳐서 두번째 div는 아랫줄에 나옵니다.

첫범째 div에 남은공간은 그냥여백으로 남음

<div class="row">
    <div class="col-sm-10">col-sm-10</div>
    <div class="col-sm-5">col-sm-5</div>
</div>

 

 

거터를 사용해서 한 행의 열끼리 사이 여백을 만들 수 있음

gx-5 가 거터 설정입니다. p-3 는 열 하나하나의 크기 키우려고 패딩 설정

<div class="row gx-5">
  <div class="col-9 p-3">
    <div>얍</div>
  </div>
  <div class="col-3 p-3">
    <div>얍</div>
  </div>
</div>