반응형 디자인의 첫 번째 원칙: 모바일 버전을 먼저 만들어라
데스크탑에 필요한 디자인을 다 만든 후 모바일 버전을 위해 scale down 하는 것이 더 힘들다.
모바일 버전을 먼저 갖춰놓은 후 데스크탑을 위한 기능들을 점진적으로 붙여나가는 것이 훨씬 편한 방법이다.
1) mobile size viewport
2) medium-sized viewport
3) large viewport
🙌🏻 추후 데스크탑 버전에서 <nav>
와 <header>
가 수직 방향으로 stack 될 수 있도록 <nav>
를 <header>
안에 자식요소로 포함시키지 않고 형제요소로 구현함
<header id="header" class="page-header">
<div class="title">
<h1>Wombat Coffee Roasters</h1>
<div class="slogan">We love coffee</div>
</div>
</header>
<nav class="menu" id="main-menu">
<button class="menu-toggle" id="toggle-menu">
toggle menu
</button>
<div class="menu-dropdown">
<ul class="nav-menu">
<li><a href="/about.html">About</a></li>
<li><a href="/shop.html">Shop</a></li>
<li><a href="/menu.html">Menu</a></li>
<li><a href="/brew.html">Brew</a></li>
</ul>
</div>
</nav>
<header>
안에 <nav>
요소가 들어올 수 있도록 absolute positioning을 사용 .menu {
position: relative;
}
.menu-toggle {
position: absolute;
top: -1.2em;
right: 0.1em;
border: 0;
background-color: transparent;
font-size: 3em;
width: 1em;
height: 1em;
line-height: 0.4;
text-indent: 5em;
white-space: nowrap;
overflow: hidden;
}
<meta>
태그를 붙여서 모바일 기기에서 모바일 버전을 위해 화면을 만들었음을 알려준다.
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Wombat Coffee Roasters</title>
...
<meta>
태그의 content가 하는 기능은 다음과 같다.
- 브라우저가 CSS을 읽을 때 content에 의도된 device-width를 사용하라고 알려줌. 뷰포트의 너비를 디바이스의 너비와 동일하게 설정하기 때문에 웹 페이지가 디바이스 화면에 꽉 차게 표시됨
- 초기 축척을 1로 설정하여 웹 페이지가 처음 로드될 때 디바이스 화면에 균일하게 맞춰지도록 함. 초기 축척을 1로 설정하면 사용자가 확대 또는 축소하지 않은 경우에도 페이지가 올바른 크기로 표시됨.
여러 viewport 사이즈를 사용할 경우 각 구간에 해당될 때 특정 기능이 나타날 수 있도록 설정함
@media (min-width: 560px) {
.title > h1 {
font-size: 2.25rem;
}
}
※ 미디어 쿼리 안에서 단위는 em을 쓰는 것이 좋다. 모든 브라우저에서 가장 안정적으로 작동되는 것은 물론 사용자의 글자 크기와 비례하여 scaling up / down 된다는 장점이 있다.
and
: 두 조건을 모두 만족하는 경우 해당 미디어쿼리 실행됨@media (min-width: 20em) and (max-width: 35em) { ... }
,
: 둘 중 한 조건만 만족해도 해당 미디어쿼리 실행됨 @media (max-width: 20em), (min-width: 35em) { ... }
min-height
, max-height
, orientation
, min-resolution
, max-resolution
...orientation: landscape
—Targets viewports that are wider than they are tallorientation: portrait
—Targets viewports that are taller than they are widemin-resolution: 2dppx
—Targets devices with a screen resolution of 2 dotsmax-resolution: 2dppx
—Targets devices with a screen resolution of up to 2
<link>
태그에도 적용할 수 있는 미디어쿼리<link rel="stylesheet" media="(min-width: 45em)" href="large-screen.css" />
=>
min-width
조건을 만족시킬때만 large-screen.css 파일을 적용시킨다는 뜻
print
@media print { *{
color: black !important;
background: none !important;
}
}
모바일 버전을 먼저 정한 후 min-width
를 설정해 medium & large breakpoint를 정한다.
Header 타이틀 제목 크기
배경화면 이미지 패딩과 글씨 크기
드롭다운 없애고 네비게이션 고정
.menu-dropdown {
display: none;
position: absolute;
right: 0;
left: 0;
margin: 0;
}
.menu.is-open .menu-dropdown {
display: block;
}
@media (min-width: 35em) {
.menu-toggle {
display: none;
}
.menu-dropdown {
display: block;
position: static;
}
}
.menu.is-open .menu-dropdown {
display: block;
}
: 뷰포트의 너비에 따라 컨테이너가 커지고 작아지는 것
고정된 값을 주지 않고 퍼센트(%)를 주는 것.
@media (min-width: 50em) {
.page-header {
padding: 1em 4em;
}
}
@media (min-width: 50em) {
.hero {
padding: 7em 6em;
}
}
@media (min-width: 50em) {
main {
padding: 2em 4em;
}
}
@media (min-width: 50em) {
.nav-menu {
padding: 0 4em;
}
}
:root {
box-sizing: border-box;
font-size: calc(1vw + 0.6em);
}
@media (min-width: 50em) {
:root {
font-size: 1.125em;
}
}
모바일에서 fluid layout을 적용할때 표는 유독 구현 난이도가 높다. 이런 경우 데스크탑에서 보여주는 width를 그대로 고수하지 않고 display:block"
을 사용하여 stacked tile 형태로 만드는 것을 고려해볼 수 있다.
모바일에서 화면을 보여줄 때 압축(compression)을 통해 이미지 용량을 줄이고 필요 이상의 해상도로 보여주지 않도록 유의한다.
뷰포트에 맞는 이미지를 각각 보여준다
.hero {
padding: 2em 1em;
text-align: center;
background-image: url(coffee-beans-small.jpg);
background-size: 100%;
color: #fff;
text-shadow: 0.1em 0.1em 0.3em #000;
}
@media (min-width: 35em) {
.hero {
padding: 5em 3em;
font-size: 1.2rem;
background-image: url(coffee-beans-medium.jpg);
} }
@media (min-width: 50em) {
.hero {
padding: 7em 6em;
background-image: url(coffee-beans.jpg);
}
}
미디어 쿼리는 CSS를 통한 접근이라면, 만약 이미지가 <img>
태그를 이용한 경우 srcset
속성을 이용할 수 있다.
브라우저가 판단하여 해당 뷰포트에 따른 이미지를 띄우게 된다.
<img alt="A white coffee mug on a bed of coffee beans"
src="coffee-beans-small.jpg"
srcset="coffee-beans-small.jpg 560w,
coffee-beans-medium.jpg 800w,
coffee-beans.jpg 1280w">