프론트

CSS 반응형 웹

짱코딩러 2022. 8. 29. 16:45

반응형 웹 디자인 : 화면 크기에 ‘반응’해 화면 요소들을 자동으로 바꾸어 사이트를 구현

 

뷰포트

뷰포트 : 웹 페이지가 브라우저 화면상에서 실제로 표시되는 영역

속성

  - width (뷰포트 너비) : device-width 또는 숫자값을 사용해 지정

  - height (뷰포트 높이) : device-width 또는 숫자값을 사용해 지정

  - user-scalable (사용자의 확대/축소 가능 여부) : yes(기본값) 또는 no

  - initial-scale (초기 확대/축소 값) : 1~10

단위 (viewport를 기준으로 한 상대적 사이즈)

  - vw(viewport width) : viewport 너비의 1/100 (1vw는 뷰포트 너비의 1%와 같다.)

  - vw(viewport width) : viewport 높이의 1/100

  - vmin(viewport minimum) : viewport 너비 또는 높이 중 작은 쪽의 1/100

  - vmax(viewport maximum) : viewport 너비 또는 높이 중 큰 쪽의 1/100

<meta name="viewport" content="속성1=값1", "속성2=값2", ...>
//뷰포트의 너비를 스마트폰 화면 너비에 맞추고 초기 화면 배율을 1로 지정
<meta name="viewport" content="width=device-width, initial-scale=1">

*기기에 맞는 뷰포트 크기값

yesviz.com/devices.php

 

미디어 쿼리

미디어 쿼리(media queries) : 접속하는 장치(미디어)에 따라 특정한 CSS 스타일을 사용하는 방법.<style>에 적어줌

속성

  - only : 미디어 쿼리를 지원하지 않는 브라우저에서는 실행하지 않는다.

  - not : not다음에 지정하는 미디어 유형을 제외한다.(not tv => TV제외하고 적용)

  - and : 조건을 여러개 연결해서 추가할 수 있다.

미디어 유형 종류 : all, print, screen, tv, aural, braille, handheld, projection, tty, embossed

조건

  - width, height : 웹페이지의 가로너비, 세로높이(정확히 이 크기일때만 적용됨)

  - min-width, min-height / max-width, max-height 웹페이지의 최소/ 최대 가로너비, 세로높이

  - device-width / device-height : 단말기의 가로너비, 세로높이

  - orientation : portrait  =>단말기의 세로모드

  - orientation : landscape  =>단말기의 가로모드

@media [only | not] 미디어 유형 [and 조건]*[and 조건] {  }
/* 너비가 768픽셀 이하인 스마트폰 */
@media only screen and (max-width: 768px) {
    [class*="c"] {
        width: 100%;
    }
}
/* 너비가 600픽셀 이상인 태블릿을 위한 설정 */
@media only screen and (min-width: 600px) {
    .c_m_1 {width: 8.33%;}
    .c_m_2 {width: 16.66%;}
    .c_m_3 {width: 25%;}
    ...생략...
/* 스마트폰을 가로로 돌릴 경우 */
@media screen and (min-device-width: 375px) and (min-device-height: 812px) { 
	...생략...
    }

 

일반적인 사용 예(Break Point)

  - 스마트폰: 모바일 페이지는 미디어 쿼리를 사용하지 않고 기본 CSS로 작성.

    만일 스마트폰의 방향까지 고려해서 제작한다면 min-width의 세로와 가로를 각각 portrait 320px, landscape 480px로 지정.
  - 태블릿: 세로 크기가 768px 이상이면 태블릿으로 지정.  가로 크기는 데스크톱과 똑같이 1024px 이상으로 지정.
  - 데스크톱: 화면 크기가 1024px 이상이면 데스크톱으로 설정

 

 

그리드 레이아웃

여러 개의 칼럼(column)으로 나눈 후 웹 요소를 배치(표 처럼!)

 

플렉스 박스 레이아웃(flex box layout)

플렉스 박스 레이아웃(flex box layout) : 수평 방향이나 수직 방향 중 하나를 주축으로 정하고 박스를 배치(1차원)

플렉스 컨테이너 : 플렉스 박스 레이아웃을 적용할 대상을 묶는 요소(겉 상자) =>display:flex;

플렉스 항목 : 컨테이너 속 작은 상자

주축 : 플렉스 항목을 배치하는 기본 방향(왼->오)

교차축 : 주축과 교차하는 방향(위->아래)

속성

flex-direction : 플렉스 항목의 배치를 위해 주축과 방향 지정. (다른 속성들을 적용할 때 기준이 됨)

  - row(기본값) : 주축을 가로로 지정, 왼->오 배치

  - row-reverse : 주축을 가로로 지정, 오->왼 배치

  - colum : 주축을 세로로 지정, 위->아래 배치

  - colum-reverse : 주축을 세로로 지정, 아래->위 배치

flex-wrap : 플렉스 항목을 한 줄 또는 여러 줄로 배치

  - nowrap(기본값) : 항목을 한 줄에 표시

  - wrap : 항목을 여러줄에 표시(넘치면 아래줄로 넘어감)

  - wrap-reverse : 항목을 여러줄에 표시(넘치면 윗줄로 올라감)

justify-content : 플렉스 항목을 주축(가로) 방향으로 배치할 때의 배치 기준

  - flex-start : 주축의 시작점(왼쪽)에 붙어 배치

  - flex-end : 주축의 끝점(오른쪽)에 붙어 배치

  - center : 주축의 중앙에 맞춰 배치

  - space-between : 양끝에 맞춰 배치하되, 항목들의 간격을 일정하게

  - space-around : 항목들의 간격을 일정하게(양끝에도 간격생김)

align-items, align-self : 교차축(세로) 기준 (특정 항목만 지정하고 싶다면 align-self 사용)

  - flex-start : 교차축의 시작점(위)에 붙어 배치

  - flex-end : 교차축의 끝점(아래)에 붙어 배치

  - center : 교차축의 중앙에 맞춰 배치

  - baseline : 교차축의 문자 기준선(크기)에 맞춰 배치

  - stretch : 플렉스 항목을 늘려 교차축에 가득 차게 배치

align-content : 플렉스 항목이 여러 줄로 표시될 때(flex-wrap : wrap인 경우) 교차 축 기준의 배치 방법 지정

  - flex-start : 교차축의 시작점에 맞춰 배치

  - flex-end : 교차축의 끝점에 붙어 배치

  - center : 교차축의 중앙에 맞춰 배치

  - space-between : 첫번째 항목과 끝 항목을 시작점과 끝점에 맞추고 나머지는 같은 간격으로 배치

  - space-around : 모든 항목들을 같은 간격으로 배치

  - stretch : 플렉스 항목을 늘려 교차축에 가득 차게 배치

<style>
    .container {
      display:flex;  /* 플렉스 컨테이너 지정 */
      /* 인라인 요소 플렉스 컨테이너를 지정하고 싶으면 inline flex로 적어준다. */
      background-color:#eee;
      border:1px solid #222;
      margin-bottom:10px;
    }
    #opt1{
      flex-flow: row wrap;   /* 왼쪽에서 오른쪽, 여러 줄 */     
    }           
    .box {
      padding:5px 45px;
      margin:5px;   
      background-color:#222;   
    }
    p {
      color:#fff;
      text-align: center;
    }
  </style>
</head>
<body>
  <div class="container" id="opt1">
    <div class="box"><p>1</p></div>
    <div class="box"><p>2</p></div>
    <div class="box"><p>3</p></div>
    <div class="box"><p>4</p></div>
  </div>

 

 

CSS 그리드 레이아웃

CSS 그리드 레이아웃 : 주축/교차축 개념이 없음. 양쪽 방향 모두 사용(2차원)

속성

grid-template-columns, grid-template-rows : 칼럼/줄의 크기와 개수 지정 

  - grid-template-columns : 그리드 컨테이너 안의 칼럼 개수와 너빗값

  - grid-template-rows: 그리드 컨테이너 안의 줄 개수와 너빗값

<style>
      #wrapper{
        display:grid;
        grid-template-columns: 2fr 1fr 2fr; /* 각 칼럼이 (2:1:2)의 비율을 차지 */
        grid-template-rows:100px;
      }
      ...생략...
<body>
    <div id="wrapper">
      <div class="items">...생략...

*Fraction(fr) 단위 : 남는 공간을 비율로 계산해 사용하겠다.

*repeat( ) : 똑같은 값을 반복해 적용할 때 사용

*auto-fill, auto-fit : 자동으로 컬럼 개수 조절(화면 너비에 따라)

grid-template-columns:repeat(auto-fill, minmax(200px, 1fr));  /* 칼럼 최소 너비만큼 채워서 표시 */
grid-template-columns:repeat(auto-fit, minmax(200px, 1fr));  /* 화면을 꽉 채울만큼 칼럼 너비를 늘려서 표시 */

 

그리드 라인 배치

  - grid-column-start : 칼럼 시작의 라인 번호를 지정(grid-column-start : 1)

  - grid-column-end : 칼럼 마지막의 라인 번호를 지정(grid-column-end : 1)

  - grid-column : 칼럼 시작 번호와 칼럼 끝 번호 지정(grid-column: 1/4  =>1번부터 4번줄까지 차지)

  - grid-end-start : 줄 시작의 라인 번호를 지정(grid-end-start :2)

  - grid-row-end : 줄 마지막의 라인 번호(grid-row-end: 4)

  - grid-row : 줄 시작번호와 줄 끝 번호(grid-row: 2/4)

 

템플릿 영역 배치

  - grid-area : 그리드 영역(아이템)의 이름을 지정할 때 사용

  - grid-template-areas : 그리드 영역의 이름을 이용해 레이아웃 형태를 정의

#wrapper{
        width:700px;
        display:grid;
        grid-template-columns:repeat(3, 1fr);
        grid-template-rows:repeat(3, 100px);
        grid-template-areas: 
          "box1 box1 box1"	/*차지할 공간만큼 반복해서 적어줌*/
          "box2 box3 box3"
          "box2 . box4";	/*빈 공간은 . 으로 표시*/
      }
      .box{
        padding:15px;
        color:#fff;
        font-weight:bold;
        text-align:center;
      }   
      .box1 {
        background-color:#3689ff;
        grid-area:box1;
      }
      .box2 {
        background-color:#00cf12;
        grid-area:box2;
      }
      .box3 {
        background-color:#ff9019;
        grid-area:box3;
        }
      .box4 {
        background-color:#ffd000;
        grid-area:box4;
      }
    </style>
  </head>
  <body>
    <div id="wrapper">
      <div class="box box1">box1</div>
      <div class="box box2">box2</div> 
      <div class="box box3">box3</div>
      <div class="box box4">box4</div>
    </div>
  </body>
  </html>