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

PDF
How to Win the Heart of CSS Boys
PDF
CSS設計の理想と現実
PDF
メンテナブルでありつづけるためのCSS設計
PDF
Why Sass?
PDF
Thinking about CSS Architecture
PDF
Professional Web Development
PDF
Middleman 一小時完成你的專案原形
TXT
Johny see book update
How to Win the Heart of CSS Boys
CSS設計の理想と現実
メンテナブルでありつづけるためのCSS設計
Why Sass?
Thinking about CSS Architecture
Professional Web Development
Middleman 一小時完成你的專案原形
Johny see book update

What's hot (20)

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

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