SlideShare a Scribd company logo
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
CSS Components
<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>
CSS Components
.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;
}
…
CSS Components
<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>
CSS Components
.book {
overflow: hidden; /* Clearfix */
padding: 20px;
background-color: #9DBCB8;
color: #FFF;
}
.book .cover {
float: left;
margin-right: 20px;
}
.book .inner {
overflow: hidden;
}
.book .title {
...
}
...
CSS Components
<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>
CSS Components
.event > a {
display: block;
}
.event .thumbnail {
float: left;
margin-right: 15px;
}
.event .inner {
overflow: hidden;
}
…
CSS Components
CSS Components
CSS Components
<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>
CSS Components
/* 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;
}
…
CSS Components
.book {
overflow: hidden; /* Clearfix */
padding: 20px;
background-color: #9DBCB8;
color: #FFF;
}
.book .cover {
float: left;
margin-right: 20px;
}
.book .inner {
overflow: hidden;
}
.book .title {
...
}
...
CSS Components
.event > a {
display: block;
}
.event .thumbnail {
float: left;
margin-right: 15px;
}
.event .inner {
overflow: hidden;
}
…
CSS Components
CSS Components
<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>
CSS Components
.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
CSS 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>
CSS Components
#pickup .book__name {
color: #111;
font-size: 2em;	
}
!
.book__name {
margin-bottom: 10px;
line-height: 1.3;
font-weight: bold;
font-size: 1.2em;
}
☢
CSS Components
#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;
}
CSS Components
#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>
CSS Components
<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
CSS Components
<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>
CSS Components
<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>
CSS Components
<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>
CSS Components
CSS Components
<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>
CSS Components
<my-media src=“sugimoto.jpg"
width=“120"
class="speaker">
<p class=“speaker__name">
杉本 吉章
</p>
...
</my-media>
CSS Components
CSS Components
<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>
CSS Components
<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 (20)

PDF
Crea un tema compatibile con le ultime novità WordPress
SkillsAndMore
 
PDF
WordPressのテンプレートをカスタマイズするために必要なphpを初歩から解説
Takashi Uemura
 
TXT
Index
grateful7
 
TXT
Code blogtangcan
Quyên Lê
 
PDF
Novedades de Front-end 2016 (CSS3, HTML5 y APIs Javascript)
Román Hernández
 
PDF
スマホウェブの本命 jQueryMobile
Manabu Uekusa
 
DOC
Patricia Ann Wigginton Medical Resume
Patricia Wigginton
 
PDF
Jogos 3.0
Fernanda Bernardo
 
PDF
Jogos: indo além do simples CSS 3.0
Fernanda Bernardo
 
PPT
jQuery & jQuery Mobile
Mohammad Raju
 
DOCX
Un juego creado en php
Erwin Lobo
 
PDF
Programación Nativa de un CRUD
FUNDET ECUADOR
 
TXT
thiết kế website bằng blogspot
Làm seo blogspot miễn phí
 
KEY
Presentación WP Versión Keynote
José Fonseca
 
PDF
box model
jay li
 
TXT
Allow remote conne
Siraj Ahmed
 
PDF
CSS 101
Sofish Lin
 
TXT
Template ku
tworonggo
 
PDF
QCON SP 2014: 10 dicas de desempenho para apps mobile hibridas
Loiane Groner
 
PDF
H2O Space. HTML Coding Rule.
H2O Space. Co., Ltd.
 
Crea un tema compatibile con le ultime novità WordPress
SkillsAndMore
 
WordPressのテンプレートをカスタマイズするために必要なphpを初歩から解説
Takashi Uemura
 
Index
grateful7
 
Code blogtangcan
Quyên Lê
 
Novedades de Front-end 2016 (CSS3, HTML5 y APIs Javascript)
Román Hernández
 
スマホウェブの本命 jQueryMobile
Manabu Uekusa
 
Patricia Ann Wigginton Medical Resume
Patricia Wigginton
 
Jogos: indo além do simples CSS 3.0
Fernanda Bernardo
 
jQuery & jQuery Mobile
Mohammad Raju
 
Un juego creado en php
Erwin Lobo
 
Programación Nativa de un CRUD
FUNDET ECUADOR
 
thiết kế website bằng blogspot
Làm seo blogspot miễn phí
 
Presentación WP Versión Keynote
José Fonseca
 
box model
jay li
 
Allow remote conne
Siraj Ahmed
 
CSS 101
Sofish Lin
 
Template ku
tworonggo
 
QCON SP 2014: 10 dicas de desempenho para apps mobile hibridas
Loiane Groner
 
H2O Space. HTML Coding Rule.
H2O Space. Co., Ltd.
 

More from 拓樹 谷 (6)

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

CSS Components