SlideShare a Scribd company logo
1 of 114
Download to read offline
Beyond the CSS Architecture
Components
CSS
Front-end Engineer
Hiroki Tani
github.com/hiloki
twitter.com/hiloki
inkdesign.jp
CSS
Mark-up
CSS
Mark-up
Designer
➡
CSS
Mark-up
Designer
➡
Engineer
⬅
👎
CSS
Easy
.text {
color: red;
}
Hard
too
#main .article { ... }
#main .article .title { ... }
#main .breaking .title { ... }
#header #logo img { ... }
#header li#logoTop { ... }
#header li#logoTop:after {
.article-header .datetime s
ul.member-list li.member a
.widget p,.widget ul { ... }
#sidebar .widget { ... }
#sidebar li a.register{}
body.landing #main sectio
#slider #slider-control > di
CSS Architecture
http://codepen.io/hiloki/full/dnGeB
<div class="speaker">
<div class="image">
<img src="tani.jpg">
</div>
<div class="inner">
<p class=“name”>…</p>
<div class="biography">
<p>...</p>
</div>
</div>
</div>
.speaker {
overflow: hidden; /* Clearfix */
padding: 20px;
background-color: #fff;
}
.speaker .image {
float: left;
margin-right: 15px;
}
.speaker .image > img {
border-radius: 60px;
}
.speaker .inner {
overflow: hidden;
}
…
<div class="book">
<div class="cover">
<img src="book.jpg">
</div>
<div class="inner">
<p class="title">...</p>
<p class="info">
...
</p>
<div class="intro">
<p>...</p>
</div>
<ul class="shop">
<li>...</li>
</ul>
</div>
</div>
.book {
overflow: hidden; /* Clearfix */
padding: 20px;
background-color: #9DBCB8;
color: #FFF;
}
.book .cover {
float: left;
margin-right: 20px;
}
.book .inner {
overflow: hidden;
}
.book .title {
...
}
...
<div class="event">
<a href="event.html">
<div class="thumbnail">
<img src="event.jpg">
</div>
<div class="inner">
<p class="event__name">...</p>
</div>
</a>
</div>
.event > a {
display: block;
}
.event .thumbnail {
float: left;
margin-right: 15px;
}
.event .inner {
overflow: hidden;
}
…
<div class="media speaker">
<div class="media__image image">
<img src="tani.jpg">
</div>
<div class="media__body inner">
<p class="name">…</p>
<div class="biography">
<p>...</p>
</div>
</div>
</div>
/* Media */
.media {
overflow: hidden; /* Clearfix */
}
.media__image {
float: left;
margin-right: 15px;
}
.media__body {
overflow: hidden;
}
.speaker {
overflow: hidden; /* Clearfix */
padding: 20px;
background-color: #fff;
}
.speaker .image {
float: left;
margin-right: 15px;
}
.speaker .image > img {
border-radius: 60px;
}
.speaker .inner {
overflow: hidden;
}
…
.speaker {
overflow: hidden; /* Clearfix */
padding: 20px;
background-color: #fff;
}
.speaker .image {
float: left;
margin-right: 15px;
}
.speaker .image > img {
border-radius: 60px;
}
.speaker .inner {
overflow: hidden;
}
…
.speaker {
overflow: hidden; /* Clearfix */
padding: 20px;
background-color: #fff;
}
.speaker .image {
float: left;
margin-right: 15px;
}
.speaker .image > img {
border-radius: 60px;
}
.speaker .inner {
overflow: hidden;
}
…
.book {
overflow: hidden; /* Clearfix */
padding: 20px;
background-color: #9DBCB8;
color: #FFF;
}
.book .cover {
float: left;
margin-right: 20px;
}
.book .inner {
overflow: hidden;
}
.book .title {
...
}
...
.event > a {
display: block;
}
.event .thumbnail {
float: left;
margin-right: 15px;
}
.event .inner {
overflow: hidden;
}
…
<div class=“media book">
<div class=“media__image book__cover”>
<img src="book.jpg">
</div>
<div class=“media__body”>
<p class="book__name">...</p>
<p class="book__info">
...
</p>
<div class="book__intro">
<p>...</p>
</div>
<ul class="book__shop">
<li>...</li>
</ul>
</div>
</div>
.book {
padding: 20px;
background-color: #9DBCB8;
color: #FFF;
}
.book__cover {
margin-right: 20px;
}
.book__title {
...
}
...
OOCSS
Nicole Sullivan
@stubbornella
OOCSS
SMACSS
BEM
MCSS
FLOCSS
CSS
Components
= encapsulation
Components
Not perfect
Components
<div class="book">
<div class="book__cover">
<p class=“book__name">
…
</p>
</div>
</div>
<div id="pickup">
<div class="book">
<div class="book__cover">
<p class="book__name">
	 	 CSS…</p>...
</div>
</div>
</div>
<div class="book">
<div class="book__cover">
<p class=“book__name">
…
</p>
</div>
</div>
#pickup .book__name {
color: #111;
font-size: 2em;	
}
!
.book__name {
margin-bottom: 10px;
line-height: 1.3;
font-weight: bold;
font-size: 1.2em;
}
☢
#pickup .book__name {
color: #111;
font-size: 2em;	
}
!
.book__name {
margin-bottom: 10px;
line-height: 1.3;
font-weight: bold;
font-size: 1.2em;
background-color: #333;
padding: 6px;
}
#pickup .book__name {
color: #111;
font-size: 2em;	
background-color: #FFF;
padding: 0;
}
!
.book__name {
margin-bottom: 10px;
line-height: 1.3;
font-weight: bold;
font-size: 1.2em;
background-color: #333;
padding: 6px;
}
<style scoped>
<div><!-- Scope -->
	 <style scoped>
	 .book__name {
	 background-color: #333;
	 padding: 6px;
	 }
	 </style>
	 <div class=“media book">
	 <div class=“media__body”>
	 <p class=“book__name”>
…
</p>
	 </div>
	 </div>
</div>
<style scoped>
⛼
<style scoped>
⛼
Components
Sharable
Maintainable
Easily-controlled
Components
Web
Web Components
Templates
Shadow DOM
HTML Imports
-
-
-
-
Custom Elements
Templates
<template
id="my-media-template">
<div class="media">
<div class="media__image">
<img>
</div>
<div class="media__body">
<content></content>
</div>
</div>
</template>
Custom
Elements
<google-map></google-map>
!
<x-calendar today></x-calendar>
!
<button is="like-button"></button>
!
<my-media src="tani.jpg"
width="120" height="120">
Custom
Elements
var element =
Object.create(
HTMLElement.prototype
);
document.registerElement(
'my-alert', {
prototype: element
}
);
Shadow
DOM
// カスタム要素のインスタンスが生成された時に実行する
element.createdCallback = function() {
var template =
document.querySelector('#my-media-
template');
!
// templateのDocumentFragmentからcontentを取得する
var content = template.content;
!
// Shadow Rootにcontentを追加する(ShadowDOMの形成)
var shadowRoot =
this.createShadowRoot();
shadowRoot.appendChild(
document.importNode(content, true)
);
};
Shadow
DOM
// カスタム要素のインスタンスが生成された時に実行する
element.createdCallback = function() {
var template =
document.querySelector('#my-media-
template');
!
// templateのDocumentFragmentからcontentを取得する
var content = template.content;
!
// Shadow Rootにcontentを追加する(ShadowDOMの形成)
var shadowRoot =
this.createShadowRoot();
shadowRoot.appendChild(
document.importNode(content, true)
);
};
= encapsulation
HTML
Imports
<head>
<link
rel="import"
href=“components/my-media.html">
</head>
Web Components
-
-
-
-
Templates
Shadow DOM
HTML Imports
Custom Elements
http://codepen.io/hiloki/full/obFui
<my-media src=“sensui.jpg"
width=“120"
height=“120"
class="speaker">
<p class=“speaker__name">
泉水 翔吾
</p>
<div class="speaker__bio">
<p>…</p>
</div>
</my-media>
<my-media src="sensui.jpg"
width="120"
height="120"
class="speaker">
<p class=“speaker__name">
泉水 翔吾
</p>
<div class="speaker__bio">
<p>…</p>
</div>
</my-media>
<my-media src=“book.jpg"
width=“100"
height=“100"
class="book">
<p class=“book__name">
フロントエンド…
</p>
<div class=“book__info”>
<p>…</p>
</div>
…
</my-media>
<div class="media speaker">
<divclass=“media__image
speaker__image”>
<img src="tani.jpg" width="120">
</div>
<div class="media__body">
<p class=“speaker__name">
谷 拓樹
</p>
...
</div>
</div>
<my-media src=“sugimoto.jpg"
width=“120"
class="speaker">
<p class=“speaker__name">
杉本 吉章
</p>
...
</my-media>
<my-media src="sugimoto.jpg"
width="120" class="speaker">
<div class="media">
<div class=“media__image">
<img src="tani.jpg" width="120">
</div>
<div class="media__body">
<p class="speaker__name">杉本
吉章</p>
...
</div>
</div>
</my-media>
<div class="media speaker">
<div class="media__image
speaker__image">
<img src="tani.jpg" width="120">
</div>
<div class="media__body">
<p class="speaker__name">谷 拓樹
</p>
...
</div>
</div>
/* <head>
<style>…</style>
</head> */
.media {
display: block;
overflow: hidden; /* Clearfix */
color: indianred;
}
❓
/* <head>
<style>…</style>
</head> */
.media {
display: block;
overflow: hidden; /* Clearfix */
color: indianred;
}
/* <head>
<style>…</style>
</head> */
.media {
display: block;
overflow: hidden; /* Clearfix */
color: indianred;
}
/* <template>
<style>…</style>
</template> */
.media {
display: block;
overflow: hidden; /* Clearfix */
color: skyblue;
}
❓
/* <template>
<style>…</style>
</template> */
.media {
display: block;
overflow: hidden; /* Clearfix */
color: skyblue;
}
/* <template>
<style>…</style>
</template> */
.media {
display: block;
overflow: hidden; /* Clearfix */
color: skyblue;
}
::shadow
👻
/* <head>
<style>…</style>
</head> */
.speaker::shadow .media {
display: block;
overflow: hidden; /* Clearfix */
background-image: url(orion.jpg);
background-size: cover;
}
❓
/* <head>
<style>…</style>
</head> */
.speaker::shadow .media {
display: block;
overflow: hidden; /* Clearfix */
background-image: url(orion.jpg);
background-size: cover;
}
Shadow
DOM
= encapsulation
Custom
Elements
<my-media></my-media>
Shadow
DOM
= encapsulation
Custom
Elements
Shadow
DOM
= encapsulation
Custom
Elements
<my-media>
<style>
.media {
display: block;
overflow: hidden; /* Clearfix */
}
.media__image {
float: left;
margin-right: 10px;
}
.media__body {
overflow: hidden;
}
</style>
<div class="media">
<div class=“media__image"></div>
<div class="media__body"></div>
</div>
</my-media>
Shadow
DOM
= encapsulation
Custom
Elements
<my-media>
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
</my-media>
Shadow
DOM
= encapsulation
Custom
Elements
<my-media>
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
</my-media>
!
<style>
.media {
display: table;
}
.media__image {
display: table-cell;
vertical-align: top;
padding-right: 10px;
}
</style>
<div class="media">
<div class=“media__image"></div>
<div class="media__body"></div>
</div>
Shadow
DOM
= encapsulation
Custom
Elements
<my-media>
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
</my-media>
Shadow
DOM
= encapsulation
Custom
Elements
<my-media>
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
</my-media>
!
<style>
.media {
display: flex;
align-items: flex-start;
}
.media__image {
margin-right: 10px;
}
.media__body {
flex: 1;
}
</style>
<div class="media">
<div class=“media__image"></div>
<div class="media__body"></div>
</div>
!
Shadow
DOM
= encapsulation
Custom
Elements
<my-media></my-media>
HTML5 Rocks
http://www.html5rocks.com/
Polymer
http://www.polymer-project.org/
X-Tag
http://www.x-tags.org/
In future
Polymer designer
https://github.com/Polymer/designer
Designer
Builder
Component
Component
💎 Designer
Builder
Component
Component
Component Designer.
Be a
Thank you.
github.com/hiloki
twitter.com/hiloki
inkdesign.jp
💐
https://www.flickr.com/photos/premshree/3444104640/
-
-
-
-
https://www.flickr.com/photos/ltdemartinet/8331549172/
https://www.flickr.com/photos/horiavarlan/4839454263/
https://www.flickr.com/photos/drewmaughan/8209503226/
Photos:

More Related Content

What's hot

Patricia Ann Wigginton Medical Resume
Patricia Ann Wigginton Medical ResumePatricia Ann Wigginton Medical Resume
Patricia Ann Wigginton Medical Resume
Patricia Wigginton
 
jQuery & jQuery Mobile
jQuery & jQuery MobilejQuery & jQuery Mobile
jQuery & jQuery Mobile
Mohammad Raju
 
Un juego creado en php
Un juego creado en phpUn juego creado en php
Un juego creado en php
Erwin Lobo
 

What's hot (20)

Crea un tema compatibile con le ultime novità WordPress
Crea un tema compatibile con le ultime novità WordPressCrea un tema compatibile con le ultime novità WordPress
Crea un tema compatibile con le ultime novità WordPress
 
WordPressのテンプレートをカスタマイズするために必要なphpを初歩から解説
WordPressのテンプレートをカスタマイズするために必要なphpを初歩から解説WordPressのテンプレートをカスタマイズするために必要なphpを初歩から解説
WordPressのテンプレートをカスタマイズするために必要なphpを初歩から解説
 
Index
IndexIndex
Index
 
Code blogtangcan
Code blogtangcanCode blogtangcan
Code blogtangcan
 
Novedades de Front-end 2016 (CSS3, HTML5 y APIs Javascript)
Novedades de Front-end 2016 (CSS3, HTML5 y APIs Javascript)Novedades de Front-end 2016 (CSS3, HTML5 y APIs Javascript)
Novedades de Front-end 2016 (CSS3, HTML5 y APIs Javascript)
 
スマホウェブの本命 jQueryMobile
スマホウェブの本命 jQueryMobileスマホウェブの本命 jQueryMobile
スマホウェブの本命 jQueryMobile
 
Patricia Ann Wigginton Medical Resume
Patricia Ann Wigginton Medical ResumePatricia Ann Wigginton Medical Resume
Patricia Ann Wigginton Medical Resume
 
Jogos 3.0
Jogos 3.0Jogos 3.0
Jogos 3.0
 
Jogos: indo além do simples CSS 3.0
Jogos: indo além do simples CSS 3.0Jogos: indo além do simples CSS 3.0
Jogos: indo além do simples CSS 3.0
 
jQuery & jQuery Mobile
jQuery & jQuery MobilejQuery & jQuery Mobile
jQuery & jQuery Mobile
 
Un juego creado en php
Un juego creado en phpUn juego creado en php
Un juego creado en php
 
Programación Nativa de un CRUD
Programación Nativa de un CRUD Programación Nativa de un CRUD
Programación Nativa de un CRUD
 
thiết kế website bằng blogspot
thiết kế website bằng blogspotthiết kế website bằng blogspot
thiết kế website bằng blogspot
 
Presentación WP Versión Keynote
Presentación WP Versión KeynotePresentación WP Versión Keynote
Presentación WP Versión Keynote
 
box model
box modelbox model
box model
 
Allow remote conne
Allow remote conneAllow remote conne
Allow remote conne
 
CSS 101
CSS 101CSS 101
CSS 101
 
Template ku
Template kuTemplate ku
Template ku
 
QCON SP 2014: 10 dicas de desempenho para apps mobile hibridas
QCON SP 2014: 10 dicas de desempenho para apps mobile hibridasQCON SP 2014: 10 dicas de desempenho para apps mobile hibridas
QCON SP 2014: 10 dicas de desempenho para apps mobile hibridas
 
H2O Space. HTML Coding Rule.
H2O Space. HTML Coding Rule.H2O Space. HTML Coding Rule.
H2O Space. HTML Coding Rule.
 

More from 拓樹 谷 (6)

Beyond CSS Architecture
Beyond CSS ArchitectureBeyond CSS Architecture
Beyond CSS Architecture
 
モダンなCSS設計パターンを考える
モダンなCSS設計パターンを考えるモダンなCSS設計パターンを考える
モダンなCSS設計パターンを考える
 
モダンなCSS設計パターンを考える
モダンなCSS設計パターンを考えるモダンなCSS設計パターンを考える
モダンなCSS設計パターンを考える
 
Try Web Components
Try Web ComponentsTry Web Components
Try Web Components
 
High Performance Webdesign
High Performance WebdesignHigh Performance Webdesign
High Performance Webdesign
 
CSSプリプロセッサの取扱説明書
CSSプリプロセッサの取扱説明書CSSプリプロセッサの取扱説明書
CSSプリプロセッサの取扱説明書
 

CSS Components