본문 바로가기
Front/CSS

CSS - 반응형 웹

by Hyeon_ 2021. 12. 6.

반응형 웹

  • PC, TV, 내비게이션, 스마트 기기 등 다양한 기기의 화면이나 환경에 맞게 자유자재로 변하도록 만들어진 웹

img

장점

  • 유지보수가 간편함
    • 모바일 버전과 데스크탑 버전 두 개의 웹사이트 만들게 될 경우
    • 웹 사이트 수정 / 갱신할 때 모바일, 데스크탑 버전의 수정/갱신 동시 지원
    • 모바일, 태블릿, 데스크탑 모두 하나의 html, css에서 유지보수 가능(한 파일에서 관리가 가능하다는 의미. 쉽다는건 아님)
  • 마케팅에 유리함
    • 환경이나 기기에 따라 최적화된 구조로 웹사이트를 변경해서 보여줄 수 있기 때문에 확실한 내용 전달 가능
  • 비용면에서 효과적임
    • 두 가지 버전의 웹사이트를 만들지 않아도 되기 때문에 기업 비용 측면에서 상당히 효과적임
  • 검색 엔진 최적화
    • 특정 키워드 검색 시, 검색 결과에서 상위권에 나타나도록 하는 작업에서 반응형 웹은 하나의 주소나 하나의 파일(HTML)로만 이루어져 있기 때문에 검색 결과에 더 잘 노출될 수 있음
  • 미래지향적(현재) 기술
    • 환경에 따라서 최적화된 구조로 바꾼 웹사이트를 보여주게 되므로, 앞으로 어떤 화면의 기기가 나올지 모르는 상황에서 미래에 대비할 수 있는 웹 기술 발전 가능

반응형 웹의 핵심기술

  1. 가변 그리드
  2. 미디어 쿼리
  3. 뷰포트(viewport)
  4. 플렉서블 박스

(1) 가변 그리드

  • 고정 크기인 픽셀(px) 표현은 한계가 있기 때문에 픽셀 대신에 퍼센트(%)로 제작하는 기술
  • width:90%
  • 그리드 기술을 사용하여 px을 %로 바꾸어 비율로 제작하면 가변적으로 작동하나, 기기나 환경에 따라서 구조를 바꿀 수 없음
    • 화면을 제어할 '뷰포트'와 화면의 크기나 환경을 감지하여 구조를 바꿔줄 '미디어 쿼리' 필요

(2) 미디어 쿼리

  • 화면의 크기나 환경을 감지하여 웹사이트를 변경하는 기술
  • 컴퓨터 기기의 환경 또는 종류 감지해야 그 기기에 맞게 웹사이트 구조를 바꿀 수 있기 때문에 반응형 웹을 제작할 때 반드시 필요한 기술
  • query : 질의(질문)
    • 미디어에게 질문하고 감지하여 웹사이트를 변경하는 기술
    • '어떤 종류의 미디어인가?'
    • '미디어 화면의 크기는 어느정도인가?'

(3) 뷰포트

  • 화면에 보이는 영역을 제어하는 기술
  • 데스크탑 컴퓨터 : 해상도를 화면 크기로 감지
  • 스마트 기기 : 기본 설정값을 보이는 영역(viewport)으로 감지
  • 뷰포트 기술로 스마트 기기의 보이는 영역을 실제 화면 크기로 변경
  • 미디어 쿼리가 기기의 화면 크기를 정확하게 감지할 수 있도록 하기 위해 뷰포트 기술 활용

(4) 플렉서블 박스

  • 가변적인 박스를 만드는 기술인 동시에 웹사이트의 구조 설계를 위한 기술
  • 가변적인 박스를 간단하게 만들어줄 뿐 아니라 박스를 쉽게 배치할 수 있다는 장점
  • 플렉서블 박스의 특정 속성값을 설정하여, 여러 박스의 높이 / 길이 / 위치 등이 유연하게 작동하는 박스를 간단히 만들 수 있음

가변 그리드

  • 픽셀 대신 퍼센트로 제작하는 기술

가변 그리드 적용

  • 가변 영역
  • 가변 폰트
  • 가변 마진 / 패딩
  • 멀티미디어 요소 가변적 가동

가변영역

  • 웹 브라우저 크기 변경해도 가로 비율 일정하게 유지됨
  • <div> 태그에 wrap 또는 wrapper 아이디 사용
  • <div id="wrap">
  • wrap 또는 wrappe라는 id의 <div> 태그로 모든 태그를 감싸면 편한 이유
    • 웹 문서 내용 전체의 크기나 배경색을 한번에 조절할 수 있음
    • 브라우저 화면 크기에 상관 없이 웹문서의 내용 중앙배치 가능
    • 반응형 웹에서 자식 박스들이 가변 크기로 설정되었을 때 무제한으로 늘어나는 것을 방지할 수 O
    • 자식 박스들을 가변 크기로 만들 때 기준 크기로 사용 가능
varArea.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>가변그리드 : 가변 영역</title>
    <style type="text/css">
        #wrap{
            margin:0 auto;
            width:90%;
            height:300px;
            border:4px solid #000;
        }
        #wrap div{
            display:inline-block;
            height:100%;
        }
        #wrap div:nth-child(1){
            width:33.3%;
            background-color:green;
        }
        #wrap div:nth-child(2){
            width:66.7%;
            background-color:yellow;
        }
    </style>
</head>
<body>
    <div id="wrap">
        <div></div><div></div>
    </div>
</body>
</html>

가변 폰트

  • 글자를 가변적이에 반들어주는 가변 폰트
  • viewport-relative length units(뷰포트 비례 단위)
    • vw, vh, vmin, vmax 단위
    • vw, vh, vmin, vmax 단위를 사용하면 브라우저의 비율에 따라 글자 크기가 늘어나거나 줄어듦
    • vw: 브라우저의 너비를 100 기준으로 해서 글자 크기 결정
    • vh: 높이를 100으로 기준
    • vmin: 너비, 높이 중 작은 쪽 기준
    • vmax: 너비, 높이 중 큰 쪽 기준

varFont.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>가변 폰트</title>
    <style type="text/css">
        .vw{font-size:5vw;}
        .vh{font-size:5vh;}
        .vmin{font-size:5vmin;}
        .vmax{font-size:5vmax;}
    </style>
</head>
<body>
    <p>기본 단위</p>
    <p class="vw">vw단위</p>
    <p class="vh">vh단위</p>
    <p class="vmin">vmin단위</p>
    <p class="vmax">vmax단위</p>
</body>
</html>

가변 마진과 가변 패딩

varMargin.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style type="text/css">
        /* 문서 전체에 적용 */
        * {margin: 0 auto; padding:0; font-size:100%;}
        #wrap{
            margin: 0 auto;
            width: 90%;
            padding:0.5%;
            background-color:lightblue;
        }

        #wrap div {
            width:90%;
            margin:5%;
            background-color:lightyellow;
        }

        p{padding:4%;}
    </style>
</head>
<body>
    <div id="wrap">
        <div>
            <p>
                화면의 크기나 환경을 감지하여 웹사이트를 변경하는 기술
                컴퓨터 기기의 환경 또는 종류 감지해야 그 기기에 맞게 웹사이트 구조를 바꿀 수 있기 때문에 반응형 웹을 제작할 때 반드시 필요한 기술
            </p>
        </div>
        <div>
            <p>
                모바일 버전과 데스크탑 버전 두 개의 웹사이트 만들게 될 경우
                웹 사이트 수정 / 갱신할 때 모바일, 데스크탑 버전의 수정/갱신 동시 지원
                모바일, 태블릿, 데스크탑 모두 하나의 html, css에서 유지보수 가능(한 파일에서 관리가 가능하다는 의미. 쉽다는건 아님)
            </p>
        </div>
    </div>
</body>
</html>

멀티미디어 요소 가변적 패딩 만들기

  • 브라우저의 비율에 따라 웹사이트의 구조가 늘어나거나 줄어드는 가변형 레이아웃에서 브라우저 너비에 맞게 이미지나 기타 멀티미디어 요소들을 가변적으로 작동하게 구성해야 함
  • widthmax-width 속성의 차이
    • width : 100%; : 화면의 너비에 맞춰 크기 조정
    • max-width: 100%;
      • 화면의 너비에 맞춰 크기 조정
      • 멀티미디어 요소 자신의 기본 크기 이상으로는 커지지 않게 제어
varMedia.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>가변적 멀티미디어 요소</title>
    <style type="text/css">
        video{
            width: 100%;
            /*max-width:100%;*/
        }
    </style>
</head>
<body>
    <div id="video">
        <video controls>
            <source src="media/Wildlife.mp4" type="video/mp4"></source>

            <track src="media/track.vtt" kind="captions" srclang="ko" label="Korean"></track>
            <track src="media/track2.vtt" kind="captions" srclang="eng" label="English"></track>
            <track src="media/track2.vtt" kind="captions" srclang="chn" label="Chinese"></track>
            <track src="media/track2.vtt" kind="captions" srclang="jp" label="Japanese"></track>
        </video>

    </div>
</body>
</html>

미디어 쿼리

  • 화면의 크기와 환경 감지 및 웹사이트를 변경하는 기술
@media[미디어 유형] [and] (조건문) {실행문}
  • (조건문)
    • 조건문이 사실일 경우 뒤에 오는 것을 해석하라는 의미
    • (max-width:320px)
  • {실행문}
    • 일반적으로 CSS 코드로 작성
@media all and (min-width:960px) {
    body{background-color: yellow;}
}
  • [미디어 유형] : 생략 가능
    • all, print, screen, tv projection, handheld ...
    • 생략 시 all로 적용
    • 스마트 기기는 screen 사용

미디어 쿼리 사용할 때 주의점

  • and 다음에 반드시 공백이 있어야 함
  • min 접두사는 반드시 크기가 작은 순서대로 작성해야 함
  • max 접두사는 반드시 크기가 큰 순서대로 작성
  • 순서가 중요한 이유
    • min은 최고 또는 그 이상이라는 의미. 점차 커지는 것 의미
    • max는 최대 또는 그 이하라는 의미. 점차 작아지는 것 의미
  • 크기 감지 기준은 HTML 문서 크기
    • 미디어 쿼리 사용해서 브라우저 크기 감지할 때, 어떤 대상을 기준으로 크기를 감지하는지 모르는 경우 많음
    • 크기 기준을 감지하지 못해 웹사이트 제작 시 혼란 겪는 경우 많음
    • 미디어 쿼리 사용하여 브라우저 크기 감지할 때는 HTML 문서 크기를 기으로 함

미디어 쿼리 예제

  • 문서 내부에 CSS 정의
  • min-width 사용
MediaQuery.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>미디어 쿼리</title>
    <style type="text/css">
        @media all and (min-width: 320px) {
            body {background-color: red;}
        }

        @media all and (min-width: 768px) {
            body {background-color: green;}
        }

        @media all and (min-width: 960px) {
            body {background-color: blue;}
        }

        * { margin: 0; padding: 0;}
        div {
            margin: 0 auto;
            width: 50%;
            max-width: 420px;
        }
        img {
            width: 100%;
            height: auto;
            border: solid 1px;
        }
    </style>
</head>
<body>
<div>
    <img src="image/사진.jpg">
</div>
</body>
</html>
  • 문서 내부에 CSS 정의.
  • orientation (portrait / landscape) 사용
mediaQuery2.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>미디어쿼리 예제-2</title>
    <style type="text/css">
        @media screen and (orientation:portrait) {
            body {background: red;}
        }

        @media screen and (orientation:landscape) {
            body {background: green;}
        }
        * { margin: 0; padding: 0;}
        div {
            margin: 0 auto;
            width: 50%;
            max-width: 420px;
        }
        img {
            width: 100%;
            height: auto;
            border: solid 1px;
        }
    </style>
</head>
<body>
<div>
    <img src="image/사진.jpg">
</div>
</body>
</html>
  • 스마트폰 크기일 경우 스타일 해제
mediaQuery3.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>미디어쿼리 : 스마트폰에서 스타일 해제</title>
    <style type="text/css">
        * {margin: 0; padding: 0}
        body {
            width:960px;
            margin: 0 auto;
            overflow: hidden;
        }

        #menu {
            width: 260px;
            float: left;
        }

        #section {
            width: 700px;
            float: right;
        }

        @media screen and (max-width:767px) {
            /* 스마트폰 사이즈에서는 전부 해제 */
            body{width:auto;}
            #menu{width: auto; float: none;}
            #section{width: auto; float: none;}
        }
    </style>
</head>
<body>
    <div id="menu">
        <ul>
            <li>메뉴1</li>
            <li>메뉴2</li>
            <li>메뉴3</li>
        </ul>
    </div>
    <div id="section">
        <h1>반응형 웹</h1>
        <p>
            크기 감지 기준은 HTML 문서 크기
            미디어 쿼리 사용해서 브라우저 크기 감지할 때, 어떤 대상을 기준으로 크기를 감지하는지 모르는 경우 많음
            크기 기준을 감지하지 못해 웹사이트 제작 시 혼란 겪는 경우 많음
            미디어 쿼리 사용하여 브라우저 크기 감지할 때는 HTML 문서 크기를 기으로 함
        </p>
        <p>
            브라우저의 비율에 따라 웹사이트의 구조가 늘어나거나 줄어드는 가변형 레이아웃에서 브라우저 너비에 맞게 이미지나 기타 멀티미디어 요소들을 가변적으로 작동하게 구성해야 함
        </p>
    </div>
</body>
</html>
  • 모바일과 PC 에서 각각 다르게 적용되게
  • 외부 CSS 사용
mediaQuery4.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>미디어쿼리 : 외부 css 사용</title>
    <style type="text/css">
        div {
            margin: 0 auto;
            width: 50%;
            max-width: 420px;
        }
        img {
            width: 100%;
            height: auto;
            border: solid 1px;
        }
    </style>
    <!--모바일용-->
    <link rel="stylesheet" href="css/mobile.css" media="(max-width:600px)">
    <!--PC 용-->
    <link rel="stylesheet" href="css/pcc.css" media="(min-width:600px)">
</head>
<body>
    <div>
        <img src="image/사진.jpg">
    </div>
</body>
</html>
mobile.css
body {background: yellow;}
pcc.css
body {background: red;}

뷰포트

  • 화면에 보이는 영역을 제어하는 기술
  • <meta> 태그의 name 속성을 "viewport"로 지정
<meta name="viewport" content="width=divice-width, initial-scale=1,minium-scale=1, maximum-scale=1, user-scalable=no">
  • width : 뷰포트의 너비
  • initial-scale : 뷰포트의 초기 배율
    • 1 보다 작으면 : 축소
    • 1 보다 크면 : 확대
  • minimum-scale
    • 뷰포트의 최소 축소 비율
    • 기본값: 0.25
  • maximum-scale
    • 뷰포트의 최대 확대 비율
    • 기본값: 0.25
  • user-scalabel
    • 뷰포트의 확대/축소 여부
    • 기본값 : yes
    • no로 설정하면 사용자가 페이지 확대할 수 없음

뷰포트 영역 확인 방법

  • 크롬 브라우저의 '검사' 도구를 사용해서 확인 (F12)

플렉서블 박스(Flexable Box)

  • 가변적인 박스를 만드는 기술인 동시에 웹사이트의 구조 설계를 위한 기술
  • 플렉서블 박스와 플렉서블 아이템으로 구성
  • 플렉서블 박스
    • 부모 박스(flex container)
    • 가변적인 박스로 작동하기 위한 기본 개념
    • wrap 처럼 모든 요소를 감싸고 있는 존재
    • 특정 속성값을 적용해서 가변적인 박스로 작동하게 함
  • 플렉서블 아이템
    • 자식 박스(flex item)
    • 플렉서블 박스 안에 들어있는 박스
    • 정렬 대상
    • 속성값에 의해 작동

플렉서블 박스의 축과 방향

  • 플렉서블 박스에는 플렉스 아이템을 지탱하기 위한 축이 2개 존재
  • 주축(maix axis)과 교차축(cross axis)
  • 주축(maix axis)
    • 중심이 되는 축
    • 주축을 따라 플렉스 아이템이 배치됨
  • 축의 방향
    • 주축이 가로일 경우 박스들이 왼쪽에서 오른쪽으로 배치(역방향 가능)
    • 주축이 세로일 경우 박스들이 위에서 아래쪽으로 배치(역방향 가능)
  • 교차축(cross axis)
    • 주축에 교차하는 축

img

flexbox 적용

  • 플렉서블 박스 (부모박스)에 설정하는 속성
  • dispaly : 부모 박스 배치 형태
    • flex : 수직 정렬 (block 형태)
    • inline-flex : 수평 정렬 (inline-block 형태)
  • flex-direction : 아이템 배치 형태
    • row : 왼쪽 -> 오른쪽
    • row-reverse : 오른쪽 -> 왼쪽
    • column : 위 -> 아래
    • column-reverse : 아래 -> 위
  • flex-wrap
    • wrap : 여러 줄
    • nowrap : 1줄
    • wrap-reverse : 여러 줄. 아래 -> 위
  • justify-content (주축에서의 정렬 방식. 수평 방향)
    • flex-start : 시작점으로 배치
    • flex-end : 끝점으로 배치
    • space-between : item 사이에 간격 배치. 빈 공간이 있을 때 간격 동일하게
    • space-around : item 사이에 간격 배치. 빈 공간이 있을 때 양 옆으로 공간 부여
    • space-evenly: 동일한 공간으로 배치
flexBox.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>플렉서블 박스</title>
    <style type="text/css">
        * {margin: 0; padding: 0}
        .wrap {
            display:flex; /* 부모 박스 배치 형태 : flex(위아래 block) */
            /*display:inline-flex;
            justify-content:space-between;
            justify-content:space-around;*/
            justify-content: space-evenly;
            width:90%;
            height:300px;
            margin:0 auto;
            border:4px solid #000;
            margin-bottom:10px;
        }
        .wrap div{
            width:20%;
        }
        .wrap div:first-child {
            background-color:red;
        }

        .wrap div:nth-child(2) {
            background-color:blue;
        }

        .wrap div:nth-child(3) {
            background-color:yellow;
        }
    </style>
</head>
<body>
  <div class='wrap'>
      <div></div><div></div><div></div>
  </div>
  <div class='wrap'>
      <div></div><div></div><div></div>
  </div>
</body>
</html>

'Front > CSS' 카테고리의 다른 글

Bootstrap - 주요 기능  (0) 2021.12.07
Bootstrap  (0) 2021.12.06
CSS 연습문제  (0) 2021.12.06
CSS - 속성  (0) 2021.12.05
CSS - 정의, 선택자  (0) 2021.12.05