SlideShare a Scribd company logo
1 of 81
Download to read offline
알아봅시다,
+Changwook.Doh 
cwdoh.com
Agenda
Chrome Enchanted: 
“2014년 주목할만한 HTML5 규격 4종” 
§ Web Components 
§ Web Animations 
§ Web RTC 
§ Service Worker
Web Components
어떤 문제들을 해결할 수 있을까?
@polyme 
r 
#itshackademic
Tab UI를 만드는 5가지 방법
G-Mail 팀도 힘들어 하는 것? 
TAG SOUP!!!
http://drbl.in/esYL 
Tab UI 정도는 
좀 쉽게!
무엇이 필요할까?
“자주 사용되거나 구조적 분리가 필요한 요소를 
다른 요소들과 충돌하지 않는 
재활용 가능한 방법이 필요해요.”
“특히 분리되어 있는 HTML, CSS, JS를 
하나로 묶어 쉽게 불러들일 수 있으면...”
Web 
Components 
더 적은 코드. 덜 혼란스럽게. 
<paper-tabs> 
<paper-tab>KNOWLEDGE</paper-tab> 
<paper-tab>HISTORY</paper-tab> 
<paper-tab>FOOD</paper-tab> 
</paper-tabs>
Web Component?
Custom Element 
● 새로운 엘리먼트의 정의. 기존 엘리먼트의 확장 
HTML Imports 
● HTML, CSS, JS를 로딩하고 싶다면? 
Shadow DOM 
● 캡슐화된 DOM, CSS의 스코프 분리 
Template 
● 드디어 등장한 네이티브로 지원되는 템플릿 
Web Component를 지탱하는 4가지 규격!
Custom Elements 
define new HTML/DOM elements
<paper-tabs selected=“1”> 
<paper-tab>Tab 1</paper-tab> 
<paper-tab>Tab 2</paper-tab> 
<paper-tab>Tab 3</paper-tab> 
</paper-tabs> 
Custom Elements 
새 HTML 엘리먼트의 정의 
선언적, 가독성 
직관적인 HTML 
확장 방법의 일반화 → 재사용성 
@polyme 
r 
#itshackademic
Custom Elements 
새 HTML 엘리먼트의 정의 
var tabs = document.querySelector('paper-tabs'); 
tabs.addEventListener('core-activate', function() { 
console.log(this.selected); 
}); 
@polyme 
r 
#itshackademic 
선언적, 가독성 
직관적인 HTML 
확장 방법의 일반화 → 재사용성
Custom Elements 
새로운 엘리먼트의 등록과 기존 엘리먼트로부터의 확장 
// 새로운 엘리먼트의 등록var XFoo = document.registerElement('x-foo'); 
document.body.appendChild(new XFoo()); 
// 기존 엘리먼트로부터의 확장var MegaButton = document.registerElement('mega-button', { 
prototype: Object.create( HTMLButtonElement.prototype ) 
});
Custom Elements 
일반적인 사용 흐름 
var XFooProto = Object.create(HTMLElement.prototype);// x-foo에 foo() 메서드 추가XFooProto.foo = 
function() { alert('foo() called'); }; 
// read-only 속성의 "bar" 속성 정의Object.defineProperty(XFooProto, "bar", {value: 5}); 
// Element 등록var XFoo = document.registerElement('x-foo', {prototype: XFooProto}); 
// DOM 생성var xfoo = document.createElement('x-foo'); 
document.body.appendChild(xfoo);
Custom Elements 
Callbacks 
var proto = Object.create(HTMLElement.prototype); 
proto.createdCallback = function() {...}; 
proto.attachedCallback = function() {…}; 
proto.detachedCallback = function() {…}; 
proto.attributeChangedCallback = function(attrName, oldValue, newValue) {…};var XFoo = 
document.registerElement('x-foo', {prototype: proto});
Shadow DOM 
DOM/CSS scoping
<video src=“foo.webm” controls></video> 
@polyme 
r 
#itshackademic
실제로 Shadow DOM 
<video src=“foo.webm” controls></video> 
@polyme 
r 
#itshackademic
<video src=“foo.webm” controls></video>
Shadow DOM 
Shadow Host & Shadow Root
Shadow DOM 101 
● 지정된 DOM을 정의한 DOM 트리로 렌더링 
o Shadow Host vs. Shadow Root 
o DOM Visualizer 
<div><h3>Light DOM</h3></div><script>var root = 
document.querySelector('div').createShadowRoot(); 
root.innerHTML = '<style>h3{ color: red; }</style>' + 
'<h3>Shadow DOM</h3>';</script> 
Shadow DOM
<style> 
:host { 
opacity: 0.4; 
transition: opacity 420ms ease-in-out; 
} 
:host(:hover) { 
opacity: 1; 
} 
:host(:active) { 
position: relative; 
top: 3px; 
left: 3px; 
}</style> 
Shadow DOM 
Style
Shadow DOM 201 
:host-context(.different) { 
color: red; 
} 
:host(x-foo:host) { 
/* Applies if the host is a <x-foo> element.*/ 
} 
:host(x-bar:host) { 
/* Applies if the host is a <x-bar> element. */ 
} 
:host(div) { { 
/* Applies if the host element or an ancestor is a <div>. */ 
} 
Shadow DOM 
Host 스타일 
<body class="different"> 
<x-foo></x-foo></body>
Shadow DOM 201 
<style> 
#host::shadow span { 
color: red; 
}</style><div id="host"> 
<span>Light DOM</span></div><script> 
var host = document.querySelector('div'); 
var root = host.createShadowRoot(); 
root.innerHTML = "<span>Shadow DOM</span>" + 
"<content></content>";</script> 
Shadow DOM 
외부에서 Shadow DOM 내부의 스타일링 
하기
Shadow DOM 201 
Shadow DOM 
::shadow pseudo element 
// No fun. 
document.querySelector('x-tabs').shadowRoot 
.querySelector('x-panel').shadowRoot 
.querySelector('#foo');// Fun. 
document.querySelector('x-tabs:shadow x-panel::shadow #foo');
Shadow DOM 201 
Shadow DOM 
/deep/ combinator 
x-tabs /deep/ x-panel { 
... 
} 
video /deep/ input[type="range"] { 
background: hotpink; 
}
Templates 
native client-side templating
var 
compiled 
= 
_.template("hello: 
<%= 
name 
%>"); 
compiled({name: 
'moe'}); 
=> 
"hello: 
moe" 
<script type="text/template"> 
// ... 
</script> 
Templating 
HTML Templates 이전 
Text Templating 
Script Overloading 
Offline DOM 
<div id="mytemplate" hidden> 
<img src="logo.png"> 
<div class="comment"></div></div>
<template> 
<div class=“comment”> 
<img src=“image.png”> 
</div> 
<script>...</script> 
</template> 
HTML Templates 
네이티브로 구현된 클라이언트 기반의 템플릿 
DOM 구조를 위해 DOM 사용 → no 
XSS 
파싱되나, 렌더링되지 않음 
복제/사용 전까지 콘텐츠는 비활성 
doc fragment → 페이지와 분리됨 
1. 렌더링되지 않음 
2. 스크립트는 실행되지 않음 
3. 리소스(이미지, 오디오 등)는 로딩되지 않음 
4. 문서 내에서 통상적인 DOM으로 액세스 불가
HTML Templates 
지원 여부 검사 
function supportsTemplate() { 
return 'content' in document.createElement('template'); 
}if (supportsTemplate()) { 
// Good to go! 
} else { 
// Use old templating techniques or libraries. 
}
HTML Templates 
템플릿의 사용 
<button onclick="useIt()">Use me</button><div id="container"></div> 
<script> 
function useIt() { 
var content = document.querySelector('template').content; 
content.querySelector('span').textContent = parseInt(span.textContent) + 1; 
document.querySelector('#container').appendChild( document.importNode(content, true)); 
}</script><template> 
<div>Template used: <span>0</span></div> 
<script>alert('Thanks!')</script></template>
HTML Imports 
loading web components
<script> 
var xhr = new XMLHttpRequest(); 
xhr.open('GET', '...', true); 
xhr.responseType = 'document'; 
xhr.onload = function(e) {}; 
xhr.send(); 
</script> 
Importing 
HTML Imports 이전 
<iframe> 
Ajax 
Script HACK! 
<script type="text/html" src="..."></script>
HTML Imports 
무엇이던 불러오세요. 
<head> 
<link rel="import" href="/path/to/imports/stuff.html"></head>
HTML Imports 
지원 여부 검사 
function supportsImports() { 
return 'import' in document.createElement('link'); 
}if (supportsImports()) { 
// 지원하므로 그대로 진행합니다. 
} else { 
// 파일을 로딩하기 위한 다른 라이브러리나 require 시스템들을 사용하세요. 
}
HTML Imports 
이벤트 핸들링 
<script async> 
function handleLoad(e) { 
console.log('Loaded import: ' + e.target.href); 
} 
function handleError(e) { 
console.log('Error loading import: ' + e.target.href); 
}</script><link rel="import" href="file.html" 
onload="handleLoad(event)" onerror="handleError(event)">
HTML Imports 
스크립트를 통한 Import 
var link = document.createElement('link'); 
link.rel = 'import'; 
link.href = 'file.html' 
link.onload = function(e) {...}; 
link.onerror = function(e) {...}; 
document.head.appendChild(link);
HTML Imports 
link.import 
var content = document.querySelector('link[rel="import"]').import; 
link.import == null 
● 브라우저가 HTML Imports를 지원하지 않을 경우 
● <link>가 rel="import"를 가지지 않을 경우 
● <link>가 DOM에 추가되지 않은 경우 
● <link>가 DOM으로부터 제거된 경우 
● ‘CORS를 만족하는’ 리소스가 아닐 경우
HTML Imports 
콘텐츠의 삽입 
<head> 
<link rel="import" href="warnings.html"></head><body> 
... 
<script> 
var link = document.querySelector('link[rel="import"]'); 
var content = link.import; 
// Grab DOM from warning.html's document. 
var el = content.querySelector('.warning'); 
document.body.appendChild(el.cloneNode(true)); 
</script></body>
Custom Elements 
컴포넌트가 인터페이스를 가진 DOM Element 형태로 사용될 수 있도록... 
Templates 
컴포넌트의 골격이 사용하기 전까지 비활성화된 상태로 관리되도록... 
Shadow DOM 
컴포넌트의 스타일, DOM의 표현을 캡슐화하여 처리할 수 있도록... 
HTML Imports 
위의 요소들을 포함한 리소스(Markup, JS, CSS)를 로딩할 수 있도록... 
웹 컴포넌트의 구성과 배포에 적합한 4가지 규격
Browser support 
Summer 2014
Further readings... 
Chrome Enchanted: 2014년 주목할만한 HTML5 규격 4종 
웹 컴포넌트: 차세대 프론트엔드 웹 개발로 가는 관문 
Introduction to Web Components 
Shadow DOM 101: 기초 
Shadow DOM 201: CSS와 스타일링 
Shadow DOM 301: 고급 개념과 DOM API 
HTML Imports: 웹을 위한 #include 
Custom Element: HTML에 새로운 엘리먼트를 정의하기 
HTML의 새로운 템플릿 태그
Web Animations
CSS Animation 
● CSS 기반의 키프레임 애니메이션 
CSS Transition 
● CSS3 규격의 일부로써, 지정된 CSS 속성 변경에 대한 전환 속도 제 
어 
SVG Animation 
● SVG 기반의 애니메이션 
requestAnimationFrame() 
● 다음 Repaint 시점 이전 프레임 갱신이 가능하도록 콜백 제공 
이미 존재하는 4가지 애니메이션 규격
“이것으로 충분한가?”
CSS Animation/Transition 
Issues 
동기화 
시퀀싱(Sequencing) 
Playback - Seek, Pause, Reverse 
Animation Blending 
Debugging
SVG Animation 
Issues 
강력함 
SVG에만 해당
JavaScript Animation 
Issues 
requestAnimationFrame()으로 렌더링 성능 저하 회피 
보편성과 활용성 높음 
Main UI 스레드 사용 
CSS 스타일 조정(특히 inline style)으로 인한 Layouting, 
Recalculating, ... 
SVG 같은 직접 접근 불가능한 객체 존재
Web Animations?
Web Animations 1.0 
HTML5에 추가된 새 애니메이션 규격 
규격의 대상 
● 추상화된 애니메이션 모델 
● JavaScript API 
CSS 및 SVG 문법 및 기능 매핑은 포함하지 않음
Web Animations 1.0 
HTML5에 추가된 새 애니메이션 규격 
CSS 및 SVG 애니메이션을 위한 기반 모델 제공 
선언적인 형태, 하지만 JS API로 제공되는 애니메이션 기능!!! 
하드웨어 가속 친화적! 
Timeline, Sequence 등 애니메이션 동기화 API 
동적인 애니메이션 조작성
Web Animations 
규격의 범위
Web Animations 
표준화 및 브라우저 지원 등 주요 현황 
Editor’s Draft - http://w3c.github.io/web-animations/ 
선언적인 형태, 하지만 JS API로 제공되는 애니메이션 기능!!! 
Chrome - CSS Anim. 엔진 변경 V36 element.animate(), V38 Playback Control 
Firefox 및 Safari - 개발 중, Internet Explorer - 논의 중 
web-animations.js Polyfill, Web Animations Demos
규격
Usage 
자바스크립트 기바의 애니메이션 
<div class="pulse" style="width:150px;">Hello world!</div><script> 
var elem = document.querySelector('.pulse'); 
var player = document.timeline.play(new Animation(elem, [ 
{opacity: "0.5", transform: "scale(0.5)"}, 
{opacity: "1.0", transform: "scale(1)"} 
], 
{ 
direction: "alternate", duration: 500, iterations: Infinity 
}));</script>
Overview 
웹 애니메이션의 모델 
Timing Model 
● 애니메이션 타이밍의 흐름(속도, 위치 등)을 제어 
Animation Model 
● Timing Model에서 전달된 값을 기반으로 애니메이션 속성들에 대한 실제 값 적용
Timing Model 
Timing Nodes
Timing Model 
Inherited Time & Local Time
Timing Group 
애니메이션들에 대한 동기화 모델
Sequence 
Parallel group 
Timing Group 
Mixin
Animation Model 
Iteration & Duration 
CSS Animation과의 차이점 
● Iteration Duration = Active Duration / Iteration Count
Animation Model 
애니메이션의 시작 위치(1st Iteration)
Web Animations API
애니메이션 생성 
new Animation( target, props, time ) 
div class="pulse" style="width:150px;">Hello world!</div><script> 
var elem = document.querySelector('.pulse'); 
var player = document.timeline.play(new Animation(elem, [ 
{opacity: "0.5", transform: "scale(0.5)"}, 
{opacity: "1.0", transform: "scale(1)"} 
], 
{ 
direction: "alternate", duration: 0.5, iterations: Infinity 
}));</script>
모션 패스(Motion Path) 
new MotionPathEffect( path_list ) 
<svg xmlns="http://www.w3.org/2000/svg" version="1.1"> 
<defs> 
<path id=path d="M 100,100 a 75,75 0 1,0 150,0 a 75,75 0 1,0 -150,0"/> 
</defs></svg><script> 
var path = document.querySelector('#path'); 
var animFunc = new MotionPathEffect( path.pathSegList); 
var animation = new Animation(targetElement, animFunc, 2);</script>
타이밍 그룹(Timing Group) 
Sequencial/Parallel Group 생성 
// Creating Parallel Groupvar parGroup = new ParGroup([new Animation(...), new 
Animation(...)]);// Creating Sequencial Groupvar seqGroup = new SeqGroup([new 
Animation(...), new Animation(...)]);// Creating Nested Groupsvar parGroup = new 
ParGroup([ 
new SeqGroup([ 
new Animation(...), 
new Animation(...), 
]), 
new Animation(...)]);
Player 
각 애니메이션에 대한 컨트롤러 
// starting animation & getting playervar player = 
document.timeline.play(myAnimation);// prop. example 2x speed up! 
player.playbackRate = 2;// animation control 
player.cancel(); 
player.finish(); 
player.play(); 
player.pause(); 
player.reverse();
Custom Effect 
타이밍 콜백에 의한 사용자화 
function ( 
time, // Time Fraction 
interation, // Iteration Index 
target, // Target Element 
prevTime // Previous Time Fraction){ 
/* do stuff */}
Browser support 
Oct. 2014
Further readings... 
W3C Web Animations Specification 
Web Animations.js 
Polymer - Web Animations 
Web Animations Demo 
Web Animations - element.animate() is now in Chrome 36
ROCK You!

More Related Content

What's hot

프론트엔드 개발자를 위한 크롬 렌더링 성능 인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능 인자 이해하기프론트엔드 개발자를 위한 크롬 렌더링 성능 인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능 인자 이해하기Chang W. Doh
 
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기Chang W. Doh
 
우리가 몰랐던 크롬 개발자 도구
우리가 몰랐던 크롬 개발자 도구우리가 몰랐던 크롬 개발자 도구
우리가 몰랐던 크롬 개발자 도구Jae Sung Park
 
웹 Front-End 실무 이야기
웹 Front-End 실무 이야기웹 Front-End 실무 이야기
웹 Front-End 실무 이야기JinKwon Lee
 
나의 jQuery 실력 향상기
나의 jQuery 실력 향상기나의 jQuery 실력 향상기
나의 jQuery 실력 향상기정석 양
 
응답하라 반응형웹 - 4. angular
응답하라 반응형웹 - 4. angular응답하라 반응형웹 - 4. angular
응답하라 반응형웹 - 4. angularredribbon1307
 
컴포넌트 관점에서 개발하기
컴포넌트 관점에서 개발하기컴포넌트 관점에서 개발하기
컴포넌트 관점에서 개발하기우영 주
 
캠프앱 개발 사례를 통해 본 하이브리드앱 어디까지 | Devon 2012
캠프앱 개발 사례를 통해 본 하이브리드앱 어디까지 | Devon 2012캠프앱 개발 사례를 통해 본 하이브리드앱 어디까지 | Devon 2012
캠프앱 개발 사례를 통해 본 하이브리드앱 어디까지 | Devon 2012Daum DNA
 
React를 이용하여 멀티플랫폼에서 개발하기
React를 이용하여 멀티플랫폼에서 개발하기React를 이용하여 멀티플랫폼에서 개발하기
React를 이용하여 멀티플랫폼에서 개발하기WebFrameworks
 
AWS 구축 경험 공유
AWS 구축 경험 공유AWS 구축 경험 공유
AWS 구축 경험 공유민태 김
 
오늘 당장 시작하는 HTML5
오늘 당장 시작하는 HTML5오늘 당장 시작하는 HTML5
오늘 당장 시작하는 HTML5Taegon Kim
 
Front end dev 2016 & beyond
Front end dev 2016 & beyondFront end dev 2016 & beyond
Front end dev 2016 & beyondJae Sung Park
 
AngularJS In Production
AngularJS In ProductionAngularJS In Production
AngularJS In ProductionMooYeol Lee
 
웹 브라우저는 어떻게 동작하나? (2)
웹 브라우저는 어떻게 동작하나? (2)웹 브라우저는 어떻게 동작하나? (2)
웹 브라우저는 어떻게 동작하나? (2)Joone Hur
 
Universal Rendering
Universal RenderingUniversal Rendering
Universal RenderingTaegon Kim
 
[JCO 컨퍼런스] 웹사이트 Front-End 성능 최적화
[JCO 컨퍼런스] 웹사이트 Front-End 성능 최적화[JCO 컨퍼런스] 웹사이트 Front-End 성능 최적화
[JCO 컨퍼런스] 웹사이트 Front-End 성능 최적화흥래 김
 
자바스크립트의 또다른 발전, Backbone.js
자바스크립트의 또다른 발전, Backbone.js자바스크립트의 또다른 발전, Backbone.js
자바스크립트의 또다른 발전, Backbone.jsJinKwon Lee
 
Single-page Application
Single-page ApplicationSingle-page Application
Single-page ApplicationSangmin Yoon
 
JavaSript Template Engine
JavaSript Template EngineJavaSript Template Engine
JavaSript Template EngineOhgyun Ahn
 
JavaScript Memory Profiling
JavaScript Memory ProfilingJavaScript Memory Profiling
JavaScript Memory ProfilingOhgyun Ahn
 

What's hot (20)

프론트엔드 개발자를 위한 크롬 렌더링 성능 인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능 인자 이해하기프론트엔드 개발자를 위한 크롬 렌더링 성능 인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능 인자 이해하기
 
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
 
우리가 몰랐던 크롬 개발자 도구
우리가 몰랐던 크롬 개발자 도구우리가 몰랐던 크롬 개발자 도구
우리가 몰랐던 크롬 개발자 도구
 
웹 Front-End 실무 이야기
웹 Front-End 실무 이야기웹 Front-End 실무 이야기
웹 Front-End 실무 이야기
 
나의 jQuery 실력 향상기
나의 jQuery 실력 향상기나의 jQuery 실력 향상기
나의 jQuery 실력 향상기
 
응답하라 반응형웹 - 4. angular
응답하라 반응형웹 - 4. angular응답하라 반응형웹 - 4. angular
응답하라 반응형웹 - 4. angular
 
컴포넌트 관점에서 개발하기
컴포넌트 관점에서 개발하기컴포넌트 관점에서 개발하기
컴포넌트 관점에서 개발하기
 
캠프앱 개발 사례를 통해 본 하이브리드앱 어디까지 | Devon 2012
캠프앱 개발 사례를 통해 본 하이브리드앱 어디까지 | Devon 2012캠프앱 개발 사례를 통해 본 하이브리드앱 어디까지 | Devon 2012
캠프앱 개발 사례를 통해 본 하이브리드앱 어디까지 | Devon 2012
 
React를 이용하여 멀티플랫폼에서 개발하기
React를 이용하여 멀티플랫폼에서 개발하기React를 이용하여 멀티플랫폼에서 개발하기
React를 이용하여 멀티플랫폼에서 개발하기
 
AWS 구축 경험 공유
AWS 구축 경험 공유AWS 구축 경험 공유
AWS 구축 경험 공유
 
오늘 당장 시작하는 HTML5
오늘 당장 시작하는 HTML5오늘 당장 시작하는 HTML5
오늘 당장 시작하는 HTML5
 
Front end dev 2016 & beyond
Front end dev 2016 & beyondFront end dev 2016 & beyond
Front end dev 2016 & beyond
 
AngularJS In Production
AngularJS In ProductionAngularJS In Production
AngularJS In Production
 
웹 브라우저는 어떻게 동작하나? (2)
웹 브라우저는 어떻게 동작하나? (2)웹 브라우저는 어떻게 동작하나? (2)
웹 브라우저는 어떻게 동작하나? (2)
 
Universal Rendering
Universal RenderingUniversal Rendering
Universal Rendering
 
[JCO 컨퍼런스] 웹사이트 Front-End 성능 최적화
[JCO 컨퍼런스] 웹사이트 Front-End 성능 최적화[JCO 컨퍼런스] 웹사이트 Front-End 성능 최적화
[JCO 컨퍼런스] 웹사이트 Front-End 성능 최적화
 
자바스크립트의 또다른 발전, Backbone.js
자바스크립트의 또다른 발전, Backbone.js자바스크립트의 또다른 발전, Backbone.js
자바스크립트의 또다른 발전, Backbone.js
 
Single-page Application
Single-page ApplicationSingle-page Application
Single-page Application
 
JavaSript Template Engine
JavaSript Template EngineJavaSript Template Engine
JavaSript Template Engine
 
JavaScript Memory Profiling
JavaScript Memory ProfilingJavaScript Memory Profiling
JavaScript Memory Profiling
 

Viewers also liked

목적에 맞게 Angular, React, Vue
목적에 맞게 Angular, React, Vue목적에 맞게 Angular, React, Vue
목적에 맞게 Angular, React, VueGunhee Lee
 
프론트엔드 개발자의 자바스크립트
프론트엔드 개발자의 자바스크립트 프론트엔드 개발자의 자바스크립트
프론트엔드 개발자의 자바스크립트 jeong seok yang
 
비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기jeong seok yang
 
퍼블리셔, 디자인을 퍼블리싱하다
퍼블리셔, 디자인을 퍼블리싱하다퍼블리셔, 디자인을 퍼블리싱하다
퍼블리셔, 디자인을 퍼블리싱하다jeong seok yang
 
퍼블리셔, 디자인을 퍼블리싱하다
퍼블리셔, 디자인을 퍼블리싱하다퍼블리셔, 디자인을 퍼블리싱하다
퍼블리셔, 디자인을 퍼블리싱하다jeong seok yang
 
퍼블리셔, 프론트엔드개발을 시작하다
퍼블리셔, 프론트엔드개발을 시작하다퍼블리셔, 프론트엔드개발을 시작하다
퍼블리셔, 프론트엔드개발을 시작하다정석 양
 
하코사세미나_캔버스 파이그래프 만들기
하코사세미나_캔버스 파이그래프 만들기하코사세미나_캔버스 파이그래프 만들기
하코사세미나_캔버스 파이그래프 만들기정석 양
 
JavaScript 2014 프론트엔드 기술 리뷰
JavaScript 2014 프론트엔드 기술 리뷰JavaScript 2014 프론트엔드 기술 리뷰
JavaScript 2014 프론트엔드 기술 리뷰Kenu, GwangNam Heo
 
[토크아이티] 프런트엔드 개발 시작하기 저자 특강
[토크아이티] 프런트엔드 개발 시작하기 저자 특강 [토크아이티] 프런트엔드 개발 시작하기 저자 특강
[토크아이티] 프런트엔드 개발 시작하기 저자 특강 우영 주
 

Viewers also liked (10)

목적에 맞게 Angular, React, Vue
목적에 맞게 Angular, React, Vue목적에 맞게 Angular, React, Vue
목적에 맞게 Angular, React, Vue
 
프론트엔드 개발자의 자바스크립트
프론트엔드 개발자의 자바스크립트 프론트엔드 개발자의 자바스크립트
프론트엔드 개발자의 자바스크립트
 
비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기
 
퍼블리셔, 디자인을 퍼블리싱하다
퍼블리셔, 디자인을 퍼블리싱하다퍼블리셔, 디자인을 퍼블리싱하다
퍼블리셔, 디자인을 퍼블리싱하다
 
퍼블리셔, 디자인을 퍼블리싱하다
퍼블리셔, 디자인을 퍼블리싱하다퍼블리셔, 디자인을 퍼블리싱하다
퍼블리셔, 디자인을 퍼블리싱하다
 
퍼블리셔, 프론트엔드개발을 시작하다
퍼블리셔, 프론트엔드개발을 시작하다퍼블리셔, 프론트엔드개발을 시작하다
퍼블리셔, 프론트엔드개발을 시작하다
 
Jquery핵심노토
Jquery핵심노토Jquery핵심노토
Jquery핵심노토
 
하코사세미나_캔버스 파이그래프 만들기
하코사세미나_캔버스 파이그래프 만들기하코사세미나_캔버스 파이그래프 만들기
하코사세미나_캔버스 파이그래프 만들기
 
JavaScript 2014 프론트엔드 기술 리뷰
JavaScript 2014 프론트엔드 기술 리뷰JavaScript 2014 프론트엔드 기술 리뷰
JavaScript 2014 프론트엔드 기술 리뷰
 
[토크아이티] 프런트엔드 개발 시작하기 저자 특강
[토크아이티] 프런트엔드 개발 시작하기 저자 특강 [토크아이티] 프런트엔드 개발 시작하기 저자 특강
[토크아이티] 프런트엔드 개발 시작하기 저자 특강
 

Similar to 알아봅시다, Polymer: Web Components & Web Animations

Web Components - Part.I, @KIG 30th
Web Components - Part.I, @KIG 30thWeb Components - Part.I, @KIG 30th
Web Components - Part.I, @KIG 30thChang W. Doh
 
Html5 앱과 웹사이트를 보다 빠르게 하는 50가지
Html5 앱과 웹사이트를 보다 빠르게 하는 50가지Html5 앱과 웹사이트를 보다 빠르게 하는 50가지
Html5 앱과 웹사이트를 보다 빠르게 하는 50가지yongwoo Jeon
 
Java script 강의자료_ed13
Java script 강의자료_ed13Java script 강의자료_ed13
Java script 강의자료_ed13hungrok
 
First Step In Ajax Korean
First Step In Ajax KoreanFirst Step In Ajax Korean
First Step In Ajax KoreanTerry Cho
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용중선 곽
 
JQuery를 이용하여 웹 위젯 작성하기_(주)시스포유아이앤씨
JQuery를 이용하여 웹 위젯 작성하기_(주)시스포유아이앤씨JQuery를 이용하여 웹 위젯 작성하기_(주)시스포유아이앤씨
JQuery를 이용하여 웹 위젯 작성하기_(주)시스포유아이앤씨sys4u
 
Express framework tutorial
Express framework tutorialExpress framework tutorial
Express framework tutorial우림 류
 
20131217 html5
20131217 html520131217 html5
20131217 html5DK Lee
 
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]WSConf.
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 Yong Joon Moon
 
Web Components 101 polymer & brick
Web Components 101 polymer & brickWeb Components 101 polymer & brick
Web Components 101 polymer & brickyongwoo Jeon
 
Angularjs, ionic, cordova 기반 syrup store app 개발 사례 공유
Angularjs, ionic, cordova 기반 syrup store app 개발 사례 공유Angularjs, ionic, cordova 기반 syrup store app 개발 사례 공유
Angularjs, ionic, cordova 기반 syrup store app 개발 사례 공유Sang Seok Lim
 
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modificationSecrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modificationHyuncheol Jeon
 
Html5 소개 가이드
Html5 소개 가이드Html5 소개 가이드
Html5 소개 가이드Jong-hyun Park
 

Similar to 알아봅시다, Polymer: Web Components & Web Animations (20)

Web Components - Part.I, @KIG 30th
Web Components - Part.I, @KIG 30thWeb Components - Part.I, @KIG 30th
Web Components - Part.I, @KIG 30th
 
Hacosa jquery 1th
Hacosa jquery 1thHacosa jquery 1th
Hacosa jquery 1th
 
Html5 앱과 웹사이트를 보다 빠르게 하는 50가지
Html5 앱과 웹사이트를 보다 빠르게 하는 50가지Html5 앱과 웹사이트를 보다 빠르게 하는 50가지
Html5 앱과 웹사이트를 보다 빠르게 하는 50가지
 
Java script 강의자료_ed13
Java script 강의자료_ed13Java script 강의자료_ed13
Java script 강의자료_ed13
 
3-2. selector api
3-2. selector api3-2. selector api
3-2. selector api
 
First Step In Ajax Korean
First Step In Ajax KoreanFirst Step In Ajax Korean
First Step In Ajax Korean
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
 
Html5
Html5 Html5
Html5
 
JQuery를 이용하여 웹 위젯 작성하기_(주)시스포유아이앤씨
JQuery를 이용하여 웹 위젯 작성하기_(주)시스포유아이앤씨JQuery를 이용하여 웹 위젯 작성하기_(주)시스포유아이앤씨
JQuery를 이용하여 웹 위젯 작성하기_(주)시스포유아이앤씨
 
Express framework tutorial
Express framework tutorialExpress framework tutorial
Express framework tutorial
 
20131217 html5
20131217 html520131217 html5
20131217 html5
 
4-3. jquery
4-3. jquery4-3. jquery
4-3. jquery
 
웹표준 교육
웹표준 교육웹표준 교육
웹표준 교육
 
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기
 
Web Components 101 polymer & brick
Web Components 101 polymer & brickWeb Components 101 polymer & brick
Web Components 101 polymer & brick
 
Angularjs, ionic, cordova 기반 syrup store app 개발 사례 공유
Angularjs, ionic, cordova 기반 syrup store app 개발 사례 공유Angularjs, ionic, cordova 기반 syrup store app 개발 사례 공유
Angularjs, ionic, cordova 기반 syrup store app 개발 사례 공유
 
What's new in IE11
What's new in IE11What's new in IE11
What's new in IE11
 
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modificationSecrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
 
Html5 소개 가이드
Html5 소개 가이드Html5 소개 가이드
Html5 소개 가이드
 

More from Chang W. Doh

Exploring what're new in Web for the Natively app
Exploring what're new in Web for the Natively appExploring what're new in Web for the Natively app
Exploring what're new in Web for the Natively appChang W. Doh
 
Kotlin의 코루틴은 어떻게 동작하는가
Kotlin의 코루틴은 어떻게 동작하는가Kotlin의 코루틴은 어떻게 동작하는가
Kotlin의 코루틴은 어떻게 동작하는가Chang W. Doh
 
Hey Kotlin, How it works?
Hey Kotlin, How it works?Hey Kotlin, How it works?
Hey Kotlin, How it works?Chang W. Doh
 
Kotlin, 어떻게 동작하나요
Kotlin, 어떻게 동작하나요Kotlin, 어떻게 동작하나요
Kotlin, 어떻게 동작하나요Chang W. Doh
 
introduction to Web Assembly
introduction to Web Assembly introduction to Web Assembly
introduction to Web Assembly Chang W. Doh
 
PWA Roadshow Seoul - Keynote
PWA Roadshow Seoul - KeynotePWA Roadshow Seoul - Keynote
PWA Roadshow Seoul - KeynoteChang W. Doh
 
PWA Roadshow Seoul - HTTPS
PWA Roadshow Seoul - HTTPSPWA Roadshow Seoul - HTTPS
PWA Roadshow Seoul - HTTPSChang W. Doh
 
CSS 다시 파서 어디에 쓰나
CSS 다시 파서 어디에 쓰나CSS 다시 파서 어디에 쓰나
CSS 다시 파서 어디에 쓰나Chang W. Doh
 
Natively Web App & Service Worker
Natively Web App & Service WorkerNatively Web App & Service Worker
Natively Web App & Service WorkerChang W. Doh
 
초보 개발자를 위한 웹 프론트엔드 개발 101
초보 개발자를 위한 웹 프론트엔드 개발 101초보 개발자를 위한 웹 프론트엔드 개발 101
초보 개발자를 위한 웹 프론트엔드 개발 101Chang W. Doh
 
Service Worker 201 (한국어)
Service Worker 201 (한국어)Service Worker 201 (한국어)
Service Worker 201 (한국어)Chang W. Doh
 
Service Worker 201 (en)
Service Worker 201 (en)Service Worker 201 (en)
Service Worker 201 (en)Chang W. Doh
 
Service Worker 101 (en)
Service Worker 101 (en)Service Worker 101 (en)
Service Worker 101 (en)Chang W. Doh
 
Service Worker 101 (한국어)
Service Worker 101 (한국어)Service Worker 101 (한국어)
Service Worker 101 (한국어)Chang W. Doh
 
What is next for the web
What is next for the webWhat is next for the web
What is next for the webChang W. Doh
 
Instant and offline apps with Service Worker
Instant and offline apps with Service WorkerInstant and offline apps with Service Worker
Instant and offline apps with Service WorkerChang W. Doh
 
Chrome enchanted 2015
Chrome enchanted 2015Chrome enchanted 2015
Chrome enchanted 2015Chang W. Doh
 
SOSCON 2014: 문서 기반의 오픈소스 기여하기
SOSCON 2014: 문서 기반의 오픈소스 기여하기SOSCON 2014: 문서 기반의 오픈소스 기여하기
SOSCON 2014: 문서 기반의 오픈소스 기여하기Chang W. Doh
 
Chromium: NaCl and Pepper API
Chromium: NaCl and Pepper APIChromium: NaCl and Pepper API
Chromium: NaCl and Pepper APIChang W. Doh
 
Cache in Chromium: Disk Cache
Cache in Chromium: Disk CacheCache in Chromium: Disk Cache
Cache in Chromium: Disk CacheChang W. Doh
 

More from Chang W. Doh (20)

Exploring what're new in Web for the Natively app
Exploring what're new in Web for the Natively appExploring what're new in Web for the Natively app
Exploring what're new in Web for the Natively app
 
Kotlin의 코루틴은 어떻게 동작하는가
Kotlin의 코루틴은 어떻게 동작하는가Kotlin의 코루틴은 어떻게 동작하는가
Kotlin의 코루틴은 어떻게 동작하는가
 
Hey Kotlin, How it works?
Hey Kotlin, How it works?Hey Kotlin, How it works?
Hey Kotlin, How it works?
 
Kotlin, 어떻게 동작하나요
Kotlin, 어떻게 동작하나요Kotlin, 어떻게 동작하나요
Kotlin, 어떻게 동작하나요
 
introduction to Web Assembly
introduction to Web Assembly introduction to Web Assembly
introduction to Web Assembly
 
PWA Roadshow Seoul - Keynote
PWA Roadshow Seoul - KeynotePWA Roadshow Seoul - Keynote
PWA Roadshow Seoul - Keynote
 
PWA Roadshow Seoul - HTTPS
PWA Roadshow Seoul - HTTPSPWA Roadshow Seoul - HTTPS
PWA Roadshow Seoul - HTTPS
 
CSS 다시 파서 어디에 쓰나
CSS 다시 파서 어디에 쓰나CSS 다시 파서 어디에 쓰나
CSS 다시 파서 어디에 쓰나
 
Natively Web App & Service Worker
Natively Web App & Service WorkerNatively Web App & Service Worker
Natively Web App & Service Worker
 
초보 개발자를 위한 웹 프론트엔드 개발 101
초보 개발자를 위한 웹 프론트엔드 개발 101초보 개발자를 위한 웹 프론트엔드 개발 101
초보 개발자를 위한 웹 프론트엔드 개발 101
 
Service Worker 201 (한국어)
Service Worker 201 (한국어)Service Worker 201 (한국어)
Service Worker 201 (한국어)
 
Service Worker 201 (en)
Service Worker 201 (en)Service Worker 201 (en)
Service Worker 201 (en)
 
Service Worker 101 (en)
Service Worker 101 (en)Service Worker 101 (en)
Service Worker 101 (en)
 
Service Worker 101 (한국어)
Service Worker 101 (한국어)Service Worker 101 (한국어)
Service Worker 101 (한국어)
 
What is next for the web
What is next for the webWhat is next for the web
What is next for the web
 
Instant and offline apps with Service Worker
Instant and offline apps with Service WorkerInstant and offline apps with Service Worker
Instant and offline apps with Service Worker
 
Chrome enchanted 2015
Chrome enchanted 2015Chrome enchanted 2015
Chrome enchanted 2015
 
SOSCON 2014: 문서 기반의 오픈소스 기여하기
SOSCON 2014: 문서 기반의 오픈소스 기여하기SOSCON 2014: 문서 기반의 오픈소스 기여하기
SOSCON 2014: 문서 기반의 오픈소스 기여하기
 
Chromium: NaCl and Pepper API
Chromium: NaCl and Pepper APIChromium: NaCl and Pepper API
Chromium: NaCl and Pepper API
 
Cache in Chromium: Disk Cache
Cache in Chromium: Disk CacheCache in Chromium: Disk Cache
Cache in Chromium: Disk Cache
 

알아봅시다, Polymer: Web Components & Web Animations

  • 4. Chrome Enchanted: “2014년 주목할만한 HTML5 규격 4종” § Web Components § Web Animations § Web RTC § Service Worker
  • 8. Tab UI를 만드는 5가지 방법
  • 9. G-Mail 팀도 힘들어 하는 것? TAG SOUP!!!
  • 10. http://drbl.in/esYL Tab UI 정도는 좀 쉽게!
  • 12. “자주 사용되거나 구조적 분리가 필요한 요소를 다른 요소들과 충돌하지 않는 재활용 가능한 방법이 필요해요.”
  • 13. “특히 분리되어 있는 HTML, CSS, JS를 하나로 묶어 쉽게 불러들일 수 있으면...”
  • 14. Web Components 더 적은 코드. 덜 혼란스럽게. <paper-tabs> <paper-tab>KNOWLEDGE</paper-tab> <paper-tab>HISTORY</paper-tab> <paper-tab>FOOD</paper-tab> </paper-tabs>
  • 16. Custom Element ● 새로운 엘리먼트의 정의. 기존 엘리먼트의 확장 HTML Imports ● HTML, CSS, JS를 로딩하고 싶다면? Shadow DOM ● 캡슐화된 DOM, CSS의 스코프 분리 Template ● 드디어 등장한 네이티브로 지원되는 템플릿 Web Component를 지탱하는 4가지 규격!
  • 17. Custom Elements define new HTML/DOM elements
  • 18.
  • 19. <paper-tabs selected=“1”> <paper-tab>Tab 1</paper-tab> <paper-tab>Tab 2</paper-tab> <paper-tab>Tab 3</paper-tab> </paper-tabs> Custom Elements 새 HTML 엘리먼트의 정의 선언적, 가독성 직관적인 HTML 확장 방법의 일반화 → 재사용성 @polyme r #itshackademic
  • 20. Custom Elements 새 HTML 엘리먼트의 정의 var tabs = document.querySelector('paper-tabs'); tabs.addEventListener('core-activate', function() { console.log(this.selected); }); @polyme r #itshackademic 선언적, 가독성 직관적인 HTML 확장 방법의 일반화 → 재사용성
  • 21. Custom Elements 새로운 엘리먼트의 등록과 기존 엘리먼트로부터의 확장 // 새로운 엘리먼트의 등록var XFoo = document.registerElement('x-foo'); document.body.appendChild(new XFoo()); // 기존 엘리먼트로부터의 확장var MegaButton = document.registerElement('mega-button', { prototype: Object.create( HTMLButtonElement.prototype ) });
  • 22. Custom Elements 일반적인 사용 흐름 var XFooProto = Object.create(HTMLElement.prototype);// x-foo에 foo() 메서드 추가XFooProto.foo = function() { alert('foo() called'); }; // read-only 속성의 "bar" 속성 정의Object.defineProperty(XFooProto, "bar", {value: 5}); // Element 등록var XFoo = document.registerElement('x-foo', {prototype: XFooProto}); // DOM 생성var xfoo = document.createElement('x-foo'); document.body.appendChild(xfoo);
  • 23. Custom Elements Callbacks var proto = Object.create(HTMLElement.prototype); proto.createdCallback = function() {...}; proto.attachedCallback = function() {…}; proto.detachedCallback = function() {…}; proto.attributeChangedCallback = function(attrName, oldValue, newValue) {…};var XFoo = document.registerElement('x-foo', {prototype: proto});
  • 26. 실제로 Shadow DOM <video src=“foo.webm” controls></video> @polyme r #itshackademic
  • 28. Shadow DOM Shadow Host & Shadow Root
  • 29. Shadow DOM 101 ● 지정된 DOM을 정의한 DOM 트리로 렌더링 o Shadow Host vs. Shadow Root o DOM Visualizer <div><h3>Light DOM</h3></div><script>var root = document.querySelector('div').createShadowRoot(); root.innerHTML = '<style>h3{ color: red; }</style>' + '<h3>Shadow DOM</h3>';</script> Shadow DOM
  • 30. <style> :host { opacity: 0.4; transition: opacity 420ms ease-in-out; } :host(:hover) { opacity: 1; } :host(:active) { position: relative; top: 3px; left: 3px; }</style> Shadow DOM Style
  • 31. Shadow DOM 201 :host-context(.different) { color: red; } :host(x-foo:host) { /* Applies if the host is a <x-foo> element.*/ } :host(x-bar:host) { /* Applies if the host is a <x-bar> element. */ } :host(div) { { /* Applies if the host element or an ancestor is a <div>. */ } Shadow DOM Host 스타일 <body class="different"> <x-foo></x-foo></body>
  • 32. Shadow DOM 201 <style> #host::shadow span { color: red; }</style><div id="host"> <span>Light DOM</span></div><script> var host = document.querySelector('div'); var root = host.createShadowRoot(); root.innerHTML = "<span>Shadow DOM</span>" + "<content></content>";</script> Shadow DOM 외부에서 Shadow DOM 내부의 스타일링 하기
  • 33. Shadow DOM 201 Shadow DOM ::shadow pseudo element // No fun. document.querySelector('x-tabs').shadowRoot .querySelector('x-panel').shadowRoot .querySelector('#foo');// Fun. document.querySelector('x-tabs:shadow x-panel::shadow #foo');
  • 34. Shadow DOM 201 Shadow DOM /deep/ combinator x-tabs /deep/ x-panel { ... } video /deep/ input[type="range"] { background: hotpink; }
  • 36. var compiled = _.template("hello: <%= name %>"); compiled({name: 'moe'}); => "hello: moe" <script type="text/template"> // ... </script> Templating HTML Templates 이전 Text Templating Script Overloading Offline DOM <div id="mytemplate" hidden> <img src="logo.png"> <div class="comment"></div></div>
  • 37. <template> <div class=“comment”> <img src=“image.png”> </div> <script>...</script> </template> HTML Templates 네이티브로 구현된 클라이언트 기반의 템플릿 DOM 구조를 위해 DOM 사용 → no XSS 파싱되나, 렌더링되지 않음 복제/사용 전까지 콘텐츠는 비활성 doc fragment → 페이지와 분리됨 1. 렌더링되지 않음 2. 스크립트는 실행되지 않음 3. 리소스(이미지, 오디오 등)는 로딩되지 않음 4. 문서 내에서 통상적인 DOM으로 액세스 불가
  • 38. HTML Templates 지원 여부 검사 function supportsTemplate() { return 'content' in document.createElement('template'); }if (supportsTemplate()) { // Good to go! } else { // Use old templating techniques or libraries. }
  • 39. HTML Templates 템플릿의 사용 <button onclick="useIt()">Use me</button><div id="container"></div> <script> function useIt() { var content = document.querySelector('template').content; content.querySelector('span').textContent = parseInt(span.textContent) + 1; document.querySelector('#container').appendChild( document.importNode(content, true)); }</script><template> <div>Template used: <span>0</span></div> <script>alert('Thanks!')</script></template>
  • 40. HTML Imports loading web components
  • 41. <script> var xhr = new XMLHttpRequest(); xhr.open('GET', '...', true); xhr.responseType = 'document'; xhr.onload = function(e) {}; xhr.send(); </script> Importing HTML Imports 이전 <iframe> Ajax Script HACK! <script type="text/html" src="..."></script>
  • 42. HTML Imports 무엇이던 불러오세요. <head> <link rel="import" href="/path/to/imports/stuff.html"></head>
  • 43.
  • 44.
  • 45. HTML Imports 지원 여부 검사 function supportsImports() { return 'import' in document.createElement('link'); }if (supportsImports()) { // 지원하므로 그대로 진행합니다. } else { // 파일을 로딩하기 위한 다른 라이브러리나 require 시스템들을 사용하세요. }
  • 46. HTML Imports 이벤트 핸들링 <script async> function handleLoad(e) { console.log('Loaded import: ' + e.target.href); } function handleError(e) { console.log('Error loading import: ' + e.target.href); }</script><link rel="import" href="file.html" onload="handleLoad(event)" onerror="handleError(event)">
  • 47. HTML Imports 스크립트를 통한 Import var link = document.createElement('link'); link.rel = 'import'; link.href = 'file.html' link.onload = function(e) {...}; link.onerror = function(e) {...}; document.head.appendChild(link);
  • 48. HTML Imports link.import var content = document.querySelector('link[rel="import"]').import; link.import == null ● 브라우저가 HTML Imports를 지원하지 않을 경우 ● <link>가 rel="import"를 가지지 않을 경우 ● <link>가 DOM에 추가되지 않은 경우 ● <link>가 DOM으로부터 제거된 경우 ● ‘CORS를 만족하는’ 리소스가 아닐 경우
  • 49. HTML Imports 콘텐츠의 삽입 <head> <link rel="import" href="warnings.html"></head><body> ... <script> var link = document.querySelector('link[rel="import"]'); var content = link.import; // Grab DOM from warning.html's document. var el = content.querySelector('.warning'); document.body.appendChild(el.cloneNode(true)); </script></body>
  • 50. Custom Elements 컴포넌트가 인터페이스를 가진 DOM Element 형태로 사용될 수 있도록... Templates 컴포넌트의 골격이 사용하기 전까지 비활성화된 상태로 관리되도록... Shadow DOM 컴포넌트의 스타일, DOM의 표현을 캡슐화하여 처리할 수 있도록... HTML Imports 위의 요소들을 포함한 리소스(Markup, JS, CSS)를 로딩할 수 있도록... 웹 컴포넌트의 구성과 배포에 적합한 4가지 규격
  • 52. Further readings... Chrome Enchanted: 2014년 주목할만한 HTML5 규격 4종 웹 컴포넌트: 차세대 프론트엔드 웹 개발로 가는 관문 Introduction to Web Components Shadow DOM 101: 기초 Shadow DOM 201: CSS와 스타일링 Shadow DOM 301: 고급 개념과 DOM API HTML Imports: 웹을 위한 #include Custom Element: HTML에 새로운 엘리먼트를 정의하기 HTML의 새로운 템플릿 태그
  • 54. CSS Animation ● CSS 기반의 키프레임 애니메이션 CSS Transition ● CSS3 규격의 일부로써, 지정된 CSS 속성 변경에 대한 전환 속도 제 어 SVG Animation ● SVG 기반의 애니메이션 requestAnimationFrame() ● 다음 Repaint 시점 이전 프레임 갱신이 가능하도록 콜백 제공 이미 존재하는 4가지 애니메이션 규격
  • 56. CSS Animation/Transition Issues 동기화 시퀀싱(Sequencing) Playback - Seek, Pause, Reverse Animation Blending Debugging
  • 57. SVG Animation Issues 강력함 SVG에만 해당
  • 58. JavaScript Animation Issues requestAnimationFrame()으로 렌더링 성능 저하 회피 보편성과 활용성 높음 Main UI 스레드 사용 CSS 스타일 조정(특히 inline style)으로 인한 Layouting, Recalculating, ... SVG 같은 직접 접근 불가능한 객체 존재
  • 60. Web Animations 1.0 HTML5에 추가된 새 애니메이션 규격 규격의 대상 ● 추상화된 애니메이션 모델 ● JavaScript API CSS 및 SVG 문법 및 기능 매핑은 포함하지 않음
  • 61. Web Animations 1.0 HTML5에 추가된 새 애니메이션 규격 CSS 및 SVG 애니메이션을 위한 기반 모델 제공 선언적인 형태, 하지만 JS API로 제공되는 애니메이션 기능!!! 하드웨어 가속 친화적! Timeline, Sequence 등 애니메이션 동기화 API 동적인 애니메이션 조작성
  • 63. Web Animations 표준화 및 브라우저 지원 등 주요 현황 Editor’s Draft - http://w3c.github.io/web-animations/ 선언적인 형태, 하지만 JS API로 제공되는 애니메이션 기능!!! Chrome - CSS Anim. 엔진 변경 V36 element.animate(), V38 Playback Control Firefox 및 Safari - 개발 중, Internet Explorer - 논의 중 web-animations.js Polyfill, Web Animations Demos
  • 65. Usage 자바스크립트 기바의 애니메이션 <div class="pulse" style="width:150px;">Hello world!</div><script> var elem = document.querySelector('.pulse'); var player = document.timeline.play(new Animation(elem, [ {opacity: "0.5", transform: "scale(0.5)"}, {opacity: "1.0", transform: "scale(1)"} ], { direction: "alternate", duration: 500, iterations: Infinity }));</script>
  • 66. Overview 웹 애니메이션의 모델 Timing Model ● 애니메이션 타이밍의 흐름(속도, 위치 등)을 제어 Animation Model ● Timing Model에서 전달된 값을 기반으로 애니메이션 속성들에 대한 실제 값 적용
  • 68. Timing Model Inherited Time & Local Time
  • 69. Timing Group 애니메이션들에 대한 동기화 모델
  • 70. Sequence Parallel group Timing Group Mixin
  • 71. Animation Model Iteration & Duration CSS Animation과의 차이점 ● Iteration Duration = Active Duration / Iteration Count
  • 72. Animation Model 애니메이션의 시작 위치(1st Iteration)
  • 74. 애니메이션 생성 new Animation( target, props, time ) div class="pulse" style="width:150px;">Hello world!</div><script> var elem = document.querySelector('.pulse'); var player = document.timeline.play(new Animation(elem, [ {opacity: "0.5", transform: "scale(0.5)"}, {opacity: "1.0", transform: "scale(1)"} ], { direction: "alternate", duration: 0.5, iterations: Infinity }));</script>
  • 75. 모션 패스(Motion Path) new MotionPathEffect( path_list ) <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> <defs> <path id=path d="M 100,100 a 75,75 0 1,0 150,0 a 75,75 0 1,0 -150,0"/> </defs></svg><script> var path = document.querySelector('#path'); var animFunc = new MotionPathEffect( path.pathSegList); var animation = new Animation(targetElement, animFunc, 2);</script>
  • 76. 타이밍 그룹(Timing Group) Sequencial/Parallel Group 생성 // Creating Parallel Groupvar parGroup = new ParGroup([new Animation(...), new Animation(...)]);// Creating Sequencial Groupvar seqGroup = new SeqGroup([new Animation(...), new Animation(...)]);// Creating Nested Groupsvar parGroup = new ParGroup([ new SeqGroup([ new Animation(...), new Animation(...), ]), new Animation(...)]);
  • 77. Player 각 애니메이션에 대한 컨트롤러 // starting animation & getting playervar player = document.timeline.play(myAnimation);// prop. example 2x speed up! player.playbackRate = 2;// animation control player.cancel(); player.finish(); player.play(); player.pause(); player.reverse();
  • 78. Custom Effect 타이밍 콜백에 의한 사용자화 function ( time, // Time Fraction interation, // Iteration Index target, // Target Element prevTime // Previous Time Fraction){ /* do stuff */}
  • 80. Further readings... W3C Web Animations Specification Web Animations.js Polymer - Web Animations Web Animations Demo Web Animations - element.animate() is now in Chrome 36