반응형 웹이란?
반응형 웹이란 환경(해상도)에 반응하여 그에 맞는 최적화된 화면을 보여주게 되는것을 말한다.
반응형 웹이라는게 생소해보일 수는 있으나 기술적으로는 오래전부터 시도되어왔던 기술이다.
레이아웃을 %단위나 em단위로 하거나, 스크립트를 사용해서 사이즈 체크해서 대응해서 제작이 되기도 했다.
다만 다양한 디바이스에 다양한 해상도까지 나오는 현실에서 미디어쿼리를 이용하면 좀 더 정확한 제어가 가능하기 때문이다.
외국에서는 좀 더 활발한 논의가 이루어져 있고 제작 방법론 또한 다양하게 다루고 있다.
대표적으로 국외 사이트는 보스턴 글로브이고, 국내 사이트로는 다음사전이 대표적인 반응형 웹사이트이다.
[보스턴 글로브]
[다음 사전]
프로젝트를 시작하기 전
현실적인 문제점에 대한 분석 및 논의
- 과연 내부역량으로 진행이 가능한것인가에 대한 논의
각 파트별 모바일에 대한 지식은 수행되고 있는가?
반응형 웹이 생산성이 있는가?
클라이언트(업체)에 어떤 이익이 있는가?
고객(사용자)입장에서는 어떤 이점이 있는가?
유지보수 측면에서의 장/단점
데스크탑이 먼저인가? 모바일이 먼저인가?
모든 브라우저에 대응해야하는가?(IE8이하 버전)
- 유동적인 레이아웃을 위해 스크립트를 사용해야하나?(성능이슈)
- 동일한 디자인을 표현해야 하다보니 태그의 중첩을 피할 수 없게되서 용량이 늘어나게 된다.(용량문제)
접근방식에 대한 제안
멀티 스크린을 위한 제작 방식 제안
클라이언트에 요청이나 제안을 하기 위한 요청시 여러가지 안을 제시하기 전에 몇가지 유념해두어야할 사항이 있다.
첫번째는 경험이 축적된 숙력된 인력, 숙력된 인력이 없다면 TFT를 구성해서 실험용 사이트를 구축한뒤 시작을 해본다.
두번째는, 프로젝트 구축비용 대비 얼마나 효과적이고 이익이 날것인가?
멀티 스크린(PC, Mobile(Smart Pad, Smart Phone)을 대응해서 구축하고자 할때 역량에 따른 3가지 제작방식을 제안한다.
가장 접근하기 쉬운 방식으로 순서
공통 사항
ie8이하 버전에서는 media qurie가 지원하지 않기 때문에 Conditional Comments를 활용하거나, mediaqueries.js를 이용
<!--[if lt IE 9]><link rel="stylesheet" href="desktop.css" type="text/css" media="screen, print"><![endif]-->
1. PC Web, Mobile Web
무작정 반응형 웹을 따라하기보다는 모바일 웹에 대한 제작 경험을 쌓는것이 중요
모바일 사이트는 따로 제작
반응형웹을 구현하기전에 필수 코스
2. PC Web/Smart Pad, Smart Phone
User-Agent나 스크린 해상도를 체크하여 pc.css와 mobile.css를 불러오게 된다.
구조는 동일하되 pc.css와 mobile.css는 분리(콘텐츠 특성에 따라 분기처리도 필요)
반응형이 아닌 레이아웃으로 너비가 고정된 경우 smart pad와 같은 경우 viewport를 사용했을 경우 너비가 smart pad보다 클 경우 스크롤이 생기기 때문에 분기처리하여 viewport를 사용하지 않는다.
테스크탑에서 모바일 환경으로 전환되었을때의 UI기획 또한 선행되어야한다.
완전분리
- 장점 : 범위 구별이 명확
- 단점 : CSS3를 지원하는 브라우저들을 최대한 활용하지 못함
- desktop.css
- mobile.css
부분분리(CSS3 구현가능한 브라우저)
CSS3를 지원하는 브라우저를 적극 활용
- 장점 : 스마트패드에서도 최적화한다는 측면과 완전분리보다는 운영시 용이하다.
-
단점 : CSS3 따로 분리해야하기 때문에 구현하는 작업측면에서는 설계가 잘 되어 있어야 하고, 유지운영시에 약간에 번거로움이 있다.
-
common.css
-
ie8이하.css(Conditional comments)
-
css3.css
// CSS3를 지원하지 않는 IE를 위해 Conditional comments를 사용하여 span태그를 position:absolute로 각 모서리에 위치시킨다.
.roundtype01 {border-radius: 5px; position: relative;}
.roundtype01 .tl, .roundtype01 .tr, .roundtype01 .bl, .roundtype01 .br {background: url('../../images/common/bg_roundtype_01.gif') no-repeat 0 0; width: 5px; height: 5px; overflow: hidden; font-size: 0; position: absolute;}
.roundtype01 .tl {background-position: 0 0; top: 0; left: 0;}
.roundtype01 .tr {background-position: 100% 0; top: 0; right: 0; }
.roundtype01 .bl {background-position: 0 100%; left: 0; bottom: 0;}
.roundtype01 .br {background-position: 100% 100%; right: 0; bottom: 0; }
<div class="roundtype01">
contents area
<!--[if lt IE 9]><span class="tl"></span><span class="tr"></span><span class="bl"></span><span class="br"></span><![endif]-->
</div>
3. PC Web, Smart Pad, Smart Phone(Smart TV)
반응형 웹, 각기 다른 해상도에 대응
아직은 3스크린에 대응하지만 내년이후에는 활발해질 Smart TV 시장 역시 주목해야할 것이다.
RWD 프로젝트에 핵심은 Mobile First
-
콘텐츠 프로토타입
-
화면설계서 템플릿(사이트을 분석 패턴화)
-
UI Design Pattern(유형은 최소한으로 유지, 초기 작업부터 UI Design작업이 선행되어야함)
-
퍼블리싱 가이드
템플릿의 경우 될 수 있으면 개인판단에 따른 구조화를 해쳐서는 안될것이다.
-
콘텐츠 구조 선형화
-
화면설계서에서 제목 영역의 확실한 구분
해상도나 기술적인 문제에 있어서 적지않은 이슈들을 만나게 되는데 이에 대한 해결책을 제시하고자 한다.
이미지의 퀄리티를 어디까지 유지할것이냐는 품질을 우선인가 페이지 로딩속도가 우선인가에 대한 선행 결정이 되어야 할것이다.
이미지 또한 데이터 용량과 관계있기 때문에 테이터 무제한 요금제를 사용하지 않는 고객을 위해서는 페이지 로딩속도를 우선시해야할 필요가 있다.
이미지 분기(Desktop용/Mobile용)
퍼블리싱 작업시에는 스크립트로 처리하고 개발작업시에는 서버단에서 처리한다.
<img src="hdpi_bzbcap05number.gif" alt="이미지" /><!-- desktop/pad 용 -->
<img src="mdpi_bzbcap05number.gif" alt="이미지" /><!-- mobile 용 -->
-
새창(모바일기기에서의 새창개수의 제한)
-
레이어팝업
현재 웹폰트로 상업적인 사용이 가능한것은 나눔고딕이며 가장 널리 사용되는것은 NHN에서 배포한 나눔고딕체이다.
주의사항 : 한글폰트는 파일 용량이 큰 단점이 있고, 또 하나는 웹폰트를 사용할때 라이센스를 꼭 확인해야한다.
| – |
IE |
Firefox |
Safari |
Chrome |
Opera |
| eot |
4 |
No |
No |
No |
No |
| woff |
No |
3.5 |
3.1 |
2.1 |
10 |
| ttf |
No |
3.5 |
3.1 |
2.1 |
No |
| svg |
No |
No |
3.1 |
0.3 |
9.0 |
@font-face {
font-family: 'NanumGothicWeb';
src: url('NanumGothicWeb.eot');
src: local('NanumGothic'),
local('NanumGothic'),
url('NanumGothic.ttf') format('truetype'),
url('NanumGothic.svg#font') format('svg');
}
body {
font-family: 'Comfortaa Regular', 'NanumGothic', '맑은 고딕';
}
웹폰트의 파일용량때문에 문제라면 차선책으로 나눔고딕을 자동설치하거나, Windows Vista나 Office 2007이상 사용자에게 자동설치되는 맑은 고딕 설치 사용자를 위해서 다음과 같이 설정할 수 있다.
body {
font-family: 'NanumGothic', '맑은 고딕';
}
이미지폰트는 모바일기기에서는 여러가지 이슈로 인해 제공하지 않는것이 원칙이나 디자인상의 이슈로 해야한다면 서버단에서 alt속성값을 가져와서 이미지를 대체하여 화면에 보여주는 방식이 될것이다.
alt값을 가져오는 방식은 개발팀과 협의후 진행
<img src="/images/title/h1.gif" alt="U+ 0505" class="jq_alttext_replace" />
데스크탑에서 사용하던 메뉴구현 방식은 좁은 해상도에 스마트폰에서는 사용하기 어렵기 때문에 다양한 대안에 방식이 구현되고 있다. 이에 다양한 패턴을 소개하고 구축중에 있는 사이트에 적합한 방식을 채택하길 바란다.
반응형 네비게이션 패턴 참고

-
많이 구현되는 방식
-
탭메뉴 형태의 메뉴도 이용가능
-

-
앱형태에서 많이 볼 수 있는 방식이다.
-
좀 더 복잡한 형태의 메뉴도 가능
-
상단영역의 불필요한 공간을 차지하지 않는다.
-
-
다양한 코덱지원
-
스트리밍(W3C에서도 논의되는 사항)
-
DRM
-
코덱을 직접변환
-
동영상 변환 솔루션
-
유투브를 활용
모바일의 경우 기기의 특성상 저장소가 없는 경우가 있기 때문에 다운로드나 업로드를 구현하지 않는다.
다만 PDF의 경우 대부분의 기기가 뷰어를 제공하기 때문에 제공 가능여부를 판단해야한다.(다운로드에 개념은 아니다.)
안드로이드는 pdf viewer 가 갤럭시 나 국내 제조사는 기본내장하나 htc, 모토롤라 등에서는 제외 되는 경우가 있으므로 다운로드 후 viewer 로 보는것 자체는 다운받은 사람이 알아서 처리해야 한다.
iphone mime type application/pdf
android mime type application/download
뷰어링크가 필요한 경우 아래와 같이 처리가능하다.
PDF Viewer가 없는 경우
<a href="market://search?q=pdf+viewer">Market</a>
에서 PDF Viewer를 다운 받은 후 설치하세요
Data Table
3단이상 복잡해지는 표의 경우 작은 스크린에서 보여주기 위해서는 어렵기 때문에 여러가지 안을 찾고자 한다.
스마트폰에서는 보통 줌을 조절하지 못하게 하는 제작하기 때문에 단순하게 재가공한다.
외국에서는 테이블에 대한 많은 시도가 이루어지고 있다 이에 대한 다양한 예제를 접해보도록 하겠다.
예제

-
필요한 셀만 노출 : 작은 해상도에서는 꼭 보여주어야하는 데이터셀만 노출시키고, 상단에 드롭다운메뉴에서 선택에 따라 숨김처리된 셀들을 보여지게 할 수 있다.
-
캔버스로 변환 : 간단히 수치를 비교하는 테이터라면 캔버스 기반에 그래픽으로 표현하는것도 가능하다.
-
썸네일 링크 : 작은 해상도에서는 썸네일처리가 되고, 썸네일부분을 클릭했을 경우 해당 테이블만 있는 페이지로 이동해서 확대줌이 가능하도록 한다.
-
멀티미디어
html5에서는 별도에 코덱을 설치할 필요없이 브라우저에 지원만으로도 재생이 가능하다.
다만 별도의 코덱에 대한 표준이 없기 때문에 현재 비디오의 경우 지원되는 포맷으로 mp4, ogg, webm가 있다.
비디오
오디오
문제점
대안
-
코덱을 직접 변환
-
동영상 변환 솔루션
-
유투브를 활용
콘텐츠
html작업시에는 css만으로 코드 분기작업하게 되면 좀 더 유용하다고 보기 때문에 이런 방식을 추천한다.
<!-- 웹 및 패드용 -->
<div class="desktop_area_box">
</div>
<!-- //웹 및 패드용 -->
<!-- 스마트폰용 -->
<div class="mobile_area_box">
</div>
<!-- //스마트폰용 -->
Etc
특수문자
-
㈜와 같은 한글형식의 특수문자는 한글을 지원하지 않는 OS에서는 표현이 되지 않기 때문에
HTML Entity를 이용한다.
-
iOS(5.0) – 버전확인 필요
-
Android() – 버전확인 필요
인코딩/캐릭터셋
프레임셋/아이프레임
문단
-
단락에 개행을 하게되면 화면해상도에 따라서 불필요하게 여백이 생기게 된다.
-
안드로이드 기반의 사용자의 경우 사용자 선호도에 따라 폰트 변경이 가능하기 때문이다.
-
폰트 특성에 따라 letter-spacing이 달라진다.
업무협의
분기 대상 선정
해상도 기준 선정
-
600px 이하
-
1024px 이하
-
1025px 이상
브라우저 지원
-
IE8이하, IE9이상
-
Chrome
-
Safari
-
Firefox
-
Opera
테스트 기기 선정
-
선정 기준 1
-
선정 기준 2
-
OS(iOS, Android
OS, WindowPhone)
-
-
iOS(3.2, 4.0, 5.0)
-
Android
OS(2.2, 2.3, 4.0)
-
해상도/화면크기
스크립트
Tip
모바일OS별 버그 리포트
Android
2.2버전이하에서의 png24 뭉게짐 현상
레이어팝업
-
테스트기기
-
레이어 밑에 폼요소가 클릭되는 문제
-
select(×)
-
input(×)
-
input[radio] (○)
-
input[checkbox] (○)
-
해결방법
실전예제
실전예제는 두가지 방안에 대한 예제화면을 다루게된다.
PC Web/Smart Pad, Smart Phone
퍼블리싱 가이드
<html>
<head>
<title>회사명 - 페이지명</title>
<script type="text/javascript">
// 접속 스마트폰 정보
var userAgent = navigator.userAgent.toLowerCase();
// 모바일 홈페이지 바로가기 링크 생성
if(userAgent.match('iphone')) {
document.write('<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" />')
} else if(userAgent.match('ipod')) {
document.write('<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" />')
} else if(userAgent.match('android')) {
document.write('<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" />')
}
</script>
<meta name="format-detection" content="telephone=no">
<link rel="shortcut icon" href="/images/common/icon/favicon.ico" type="image/x-icon">
<link rel="apple-touch-icon" href="/images/common/icon/touch_icon.png" />
<link rel="stylesheet" href="/css/desktop.css" type="text/css" media="only screen and (min-width: 601px), print">
<link rel="stylesheet" href="/css/desktop/메뉴별.css" type="text/css" media="only screen and (min-width: 601px), print">
<link rel="stylesheet" href="/css/mobile.css" type="text/css" media="only screen and (max-width: 600px)">
<link rel="stylesheet" href="/css/mobile/메뉴별.css" type="text/css" media="only screen and (max-width: 600px)">
<script type="text/javascript" src="/js/jquery.min.js" charset="euc-kr"></script>
<script type="text/javascript" src="/js/ui.js" charset="euc-kr"></script>
<script type="text/javascript" src="/js/ui_메뉴별.js" charset="euc-kr"></script>
<script type="text/javascript" src="/js/ui_mobile.js" charset="euc-kr"></script>
<!--[if lt IE 9]>
<link rel="stylesheet" href="/css/desktop.css" type="text/css" media="screen, print">
<link rel="stylesheet" href="/css/desktop/메뉴별.css" type="text/css" media="screen, print">
<![endif]-->
</head>
<body>
</body>
</html>
개발 가이드
<html>
<head>
<title>회사명 - 페이지명</title>
<meta name="format-detection" content="telephone=no">
<link rel="shortcut icon" href="/images/common/icon/favicon.ico" type="image/x-icon">
<link rel="apple-touch-icon" href="/images/common/icon/touch_icon.png" />
<link rel="stylesheet" href="/css/desktop.css" type="text/css" media="screen , print">
<link rel="stylesheet" href="/css/desktop/메뉴별.css" type="text/css" media="screen , print">
<script type="text/javascript" src="/js/jquery.min.js" charset="euc-kr"></script>
<script type="text/javascript" src="/js/ui.js" charset="euc-kr"></script>
<script type="text/javascript" src="/js/ui_메뉴별.js" charset="euc-kr"></script>
</head>
<body>
</body>
</html>
<html>
<head>
<title>회사명 - 페이지명</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" />
<meta name="format-detection" content="telephone=no">
<link rel="apple-touch-icon" href="/images/common/icon/touch_icon.png" />
<link rel="stylesheet" href="/css/mobile.css" type="text/css" media="screen">
<link rel="stylesheet" href="/css/mobile/메뉴별.css" type="text/css" media="screen">
<script type="text/javascript" src="/js/jquery.min.js" charset="euc-kr"></script>
<script type="text/javascript" src="/js/ui_mobile.js" charset="euc-kr"></script>
</head>
<body>
</body>
</html>
<html>
<head>
<title>회사명 - 페이지명</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" />
<meta name="format-detection" content="telephone=no">
<link rel="shortcut icon" href="/images/common/icon/favicon.ico" type="image/x-icon">
<link rel="apple-touch-icon" href="/images/common/icon/touch_icon.png" />
<link rel="stylesheet" href="/css/narrow.css" type="text/css" media="only screen and (max-width: 480px), print">
<link rel="stylesheet" href="/css/normal.css" type="text/css" media="only screen and (min-width: 481px) and (max-width: 1200px), print">
<link rel="stylesheet" href="/css/wide.css" type="text/css" media="only screen and (min-width:1201px), print">
<script type="text/javascript" src="/js/jquery.min.js" charset="euc-kr"></script>
<script type="text/javascript" src="/js/ui.js" charset="euc-kr"></script>
<script type="text/javascript" src="/js/ui_메뉴별.js" charset="euc-kr"></script>
<!--[if lt IE 9]>
<link rel="stylesheet" href="/css/desktop.css" type="text/css" media="screen, print">
<link rel="stylesheet" href="/css/desktop/메뉴별.css" type="text/css" media="screen, print">
<![endif]-->
</head>
<body>
</body>
</html>
반응형 웹 관련 용어 정의
기본 개념
반응형 웹 디자인
최초로 반응형 웹 디자인(responsive web design)을 사용한 사람은, A List Apart에 Responsive Web Design을 기고한 Ethan Marcotte로 알려져 있습니다.
1) 반응형 웹 디자인을 짧게 정의하면, 하나의 코드로 모든 기기에서 적절하게 보여주는 것 입니다.
보다 긴 정의는, CSS3의 media-query, 유동형 그리드 (fluid grids), 반응형 또는 유연한 이미지 (responsive or flexible images), 반응형 레이아웃 등의 기술을 이용하여, 사용자가 여러 종류의 기기와 브라우져를 사용하여 접근하여도, 최소한의 크기조정/회전/스크롤을 통해서 쉽게 콘텐츠를 접근할 수 있도록 제공하는 것을 뜻합니다.
1) 모바일 퍼스트
웹 디자인을 할때, 모바일을 먼저 생각해서 디자인을 한다는 개념으로, Luke Wroblewski에 의해서 주장되었습니다.
대표적으로 media query를 사용할때, media query가 적용되지 않는 경우를 모바일 브라우져로 가정하는 것이 해당됩니다. 2)
가끔 점진적 향상 (progressive enhancement) 접근 방법과 같이 사용되기도 합니다.
Graceful degradation
우아한 퇴보?의 다른 용어는, 결함없는 작동 (fault-tolerance)이며, 웹 디자인에서는, 최신 기술/표준을 따르지 못하는 브라우져에서도 크게 문제없이 처리되는 것을 뜻합니다.
유동형 그리드
E.Marcotte에 의해서 최초로 제안된 유동형 그리드 (fluid grids)는, px 대신 em 또는 %를 사용하여, 스크린 크기에 상관없이 원래 의도한 형태의 그리드를 유지하는 것입니다.
반응형 또는 유동형 이미지
유동형 이미지 (fluid images)는 E.Marcotte가 A List Apart와 그의 블로그에서 제안한 (max-)width=100% 사용과, 이를 처리하지 못하는 IE7- 를 위한 javascript 코드로 지칭합니다.
반응형 (responsive) 또는 적응형 (adaptive) 이미지는, 스크린 크기나 기기 종류에 따라서 이미지의 크기 (width 와 실제 화일 크기)를 선택적으로 적용하여, (특히 모바일에서) 적절한 이미지 다운로딩과 표현을 하도록 유도하는 기술입니다.
특히 서버쪽에서 처리하는 기법이 같이 사용되어, 흔히 RESS (Responsive Web + Server Side Components) 접근 방법이 적용됩니다.
반응형 또는 가변형 레이아웃
반응형 레이아웃 이라는 단어는 실제로는 통용되지 않지만, 다른 반응형 * 용어들과 같은 맥락에서 보자면, 여러 스크린 크기/기기 들에 반응하는 레이아웃을 지칭합니다.
Luke Wroblewski가 제안한 다중기기 레이아웃 패턴글에서 보여준, 기기별로 변화하는 레이아웃을 일컫기도 합니다.
반응형 메뉴 또는 네비게이션
반응형 레이아웃과 더불어, 데스트탑 메뉴/네비게이션을 모바일에서 어떻게 표현할지 접근하는 기법입니다.
Brad Frost의 반응형 네비 패턴 참조
관련 기술
CSS3 media-query
CSS3에서 도입된 @media를 이용하여, 보여지는 스크린 (해상도)의 최소/최대 크기등의 조건별로, 원하는 스타일을 적용할 수 있습니다.
RESS
Responsive Web + Server-Side Components의 줄임말로, (media-query와 javascript을 이용한 클라이언트 만에서의) 반응형 웹 디자인의 한계와 불편함을 극복하기 위하여, 서버쪽에서도 (user-agent 정보를 이용하여) 적절하게 처리된 내용을 제공하는 기법입니다. LukeW
특히 반응형 이미지 등 모바일 환경에서 통신횟수/양을 최소화하기 위한 선별적 이미지 화일 제공 기법이 이에 속합니다.
user-agent 문자열
브라우져 등의 통신 소프트웨어가 서버에 넘겨주는 일종의 인식코드로, 특정 브라우져별로 정해진 user-agent 문자열이 정해져 있습니다.
하지만, 해당 문자열은 전적으로 보내는 쪽에서 결정하므로, 그 정확도나 신빙성이 떨어지는 것으로 알려져 있습니다.
그럼에도 불구하고, 서버쪽에서 기기/브라우져 를 판단할 수 있는 유일한 근거이기에, http://detector.dmolsen.com/, http://wurfl.sourceforge.net/ 등 여러 유/무료 디비/api 등이 존재합니다.
참고문헌
사이트
도서
원래는 이 자료를 준비하면서 좀 더 다양한 예제와 함께 준비하려고 했기 때문에 분량이 이보다는 더 많으나 언제 완성될지도 몰라서 미완성이지만 차후에 완성이 된다면 블로그보다는 PDF책자 형태로 배포가 되지 않을까 하는 생각이다.