SlideShare a Scribd company logo
ًٝذشـٕד֮׶אבֽ׷׋׭ך$44鏣鎘 
8FCⵖ⡲罏ך׋׭ך$44鏣鎘ך侄猰剅$44ؔآ؟ٝ
http://www.slideshare.net/hiloki/thinking-about-css-architecture
靼䬪埠 Hiroki Tani 
Front-end Engineer 
! github.com/hiloki 
 twitter.com/hiloki 
inkdesign.jp
メンテナブルでありつづけるためのCSS設計
1994.10.10
http://codepen.io/hiloki/full/ahdEF
20 years of CSS 
鄲귅ծٖ؎،ؐزծإؙٖةծًر؍،ծ 
،صً٦ءّٝծؿ؍ٕةծFUD
20 years of CSS 
鄲귅ծٖ؎،ؐزծإؙٖةծًر؍،ծ 
،صً٦ءّٝծؿ؍ٕةծFUD
$44כ㠨׸װְׅ
㠨׸װְׅ ͑ 僒׃ְ
Easy 
.text { 
color: green; 
}
Easy 
.text { 
color: green; 
} 
! 
.lead .text { 
color: blue 
} 
div class=lead 
/div
too 
Fragile 
#main { ... } 
#main .article { ... } 
#main .article .title { #main .breaking .title { #header #logo img { ... #header li#logoTop { ... #header li#logoTop:after .article-header .datetime ul.member-list li.member .widget p,.widget ul { ... #sidebar .widget { ... } 
#sidebar li a.register{} 
body.landing #main section #slider-control  div { #bannerList li div#rotate
! ⏲ # 

㠨׸זְ㸣樴ז鏣鎘׾実׭׷ךדכזֻծ 
㠨׸׋הֹח⹃孡׾䭯׏ג⥜䗁דֹ׷鏣鎘׾ ˑ 
俕谏牂⛲
OOCSS 
Nicole Sullivan 
@stubbornella
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; 
} 
…
%
メンテナブルでありつづけるためのCSS設計
/* Media */ 
.media { 
overflow: hidden; /* Clearfix */ 
} 
.media__image { 
float: left; 
margin-right: 15px; 
} 
.media__body { 
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
div class=media book 
div class=media__image cover 
img src=book.jpg 
/div 
div class=media__body inner 
p class=title.../p 
p class=info 
... 
/p 
div class=intro 
p.../p 
/div 
ul class=shop 
li.../li 
/ul 
/div 
/div
div class=media event 
a href=event.html 
div class=media__image thumbnail 
img src=event.jpg 
/div 
div class=media__body inner 
p class=event__name 
… 
/p 
/div 
/a 
/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; 
} 
…
.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; 
} 
…
OOCSS
OOCSS 
SMACSS 
BEM 
SUIT CSS 
AMCSS 
MCSS 
FLOCSS
⥯ך 
$44鏣鎘ךه؎ٝز
1 إؙٖةכ崮ֻծ䠐㔳涸ח
2 ㄏせ鋉⵱׾䭯א
/* Media */ 
.media { 
overflow: hidden; /* Clearfix */ 
} 
.media__image { 
float: left; 
margin-right: 15px; 
} 
.media__body { 
overflow: hidden; 
}
/* Media */ 
.media { 
overflow: hidden; /* Clearfix */ 
} 
.media .image { 
float: left; 
margin-right: 15px; 
} 
.media .body { 
overflow: hidden; 
}
/* Media */ 
.media { 
overflow: hidden; /* Clearfix */ 
} 
.media  .image { 
float: left; 
margin-right: 15px; 
} 
.media  .body { 
overflow: hidden; 
}
/* Media */ 
.media { 
overflow: hidden; /* Clearfix */ 
} 
.media__image { 
float: left; 
margin-right: 15px; 
} 
.media__body { 
overflow: hidden; 
}
https://github.com/hiloki/flocss
/* Media */ 
.c-media { 
overflow: hidden; /* Clearfix */ 
} 
.c-media__image { 
float: left; 
margin-right: 15px; 
} 
.c-media__body { 
overflow: hidden; 
}
!-- 一般的でない略称は避ける -- 
div class=c-wdt p-rcmdTpcs__li 
よくわからない 
/div 
! 
div class=c-widget p-recommendTopics__list 
長い...が分かる 
/div
/* Emmet/Zen-codingのAliasを参考にする */ 
.u-mts { margin-top: 10px } /* margin-top small */ 
.u-vam { vertical-align: middle } 
.u-fl { float: left }
メンテナブルでありつづけるためのCSS設計
3 㔐粸׶鵤׃׋׵؝ٝه٦طٝزךⱄ鏣鎘
@
@
@



@
@


4 +4ךة٦؜حزחأة؎ٕ׾䭯׋ׇזְ
$('.profile .button') 
.on('click', function(e){ 
... 
});
div class=profile 
... 
button class=button 
Save! 
/button 
/div
div class=profile 
... 
button class=“profile__button” 
Save! 
/button 
/div
$('.js-save-profile') 
.on('click', function(e){ 
... 
});
/* スタイルを持たせてはいけない */ 
.js-save-profile { 
... 
}
div class=profile 
... 
button class=“button js-save-profile“ 
Save! 
/button 
/div
div class=profile 
... 
button class=“profile__button 
js-save-profile” 
Save! 
/button 
/div
button class=c-button js-tap” 
Tappable 
/button 
! 
!-- カスタムデータ属性を使う -- 
button class=c-button data-tap 
Tappable 
/button
5 TUZMF㾩䚍דך鎸鶢כ窫㼎׃זְ
div style=“margin-bottom: 242pxblah blah blah/div
メンテナブルでありつづけるためのCSS設計
6 ؝٦سךⱄⵃ欽ָׅץגדכזְ
メンテナブルでありつづけるためのCSS設計
h1 class=section heading 
The Heading 
/h1 
! 
div class=section 
The Box 
/div
.section { 
padding: 12px 16px; 
border-radius: 8px; 
background-color: #FFFFFF; 
box-shadow: 0 0 2px #000; 
} 
! 
.heading { 
margin-bottom: 20px; 
font-size: 18px; 
font-weight: bold; 
}
.section { 
padding: 12px 16px; 
border-radius: 8px; 
background-color: #FFFFFF; 
box-shadow: 0 0 2px #000; 
} 
! 
.heading { 
margin-bottom: 20px; 
padding: 12px 16px; 
border-radius: 8px; 
background-color: #FFFFFF; 
box-shadow: 0 0 2px #000; 
font-size: 18px; 
font-weight: bold; 
}
h1 class=heading 
The Heading 
/h1 
! 
div class=section 
The Box 
/div
.s-box { 
padding: 12px 16px; 
border-radius: 8px; 
background-color: #FFFFFF; 
box-shadow: 0 0 2px #000; 
}
h1 class=“s-box heading” 
The Heading 
/h1 
! 
div class=s-box section 
The Box 
/div
7 رؠ؎ش٦הך؝ىُص؛٦ءّٝ
メンテナブルでありつづけるためのCSS設計
メンテナブルでありつづけるためのCSS設計
メンテナブルでありつづけるためのCSS設計
$44فٔفٗإح؟כ鏣鎘ך㉏겗׾鍑寸ׅ׷
No. 

メンテナブルでありつづけるためのCSS設計
.btn { 
... 
} 
! 
.btn--primary { 
background-color: #F31; 
color: #FFF; 
} 
! 
.btn--large { 
font-size: 1.5em; 
}
a class=btn btn--primarySave/a 
! 
a class=btn btn--primary btn--largeRegister/a
%btn { 
display: inline-block; 
border-radius: 6px; 
vertical-align: middle; 
padding: .6em 1em; 
cursor: pointer; 
} 
! 
%btn--primary { 
background-color: #F31; 
color: #FFF; 
font-weight: 700; 
} 
! 
%btn--large { 
font-size: 1.5em; 
}
.save-button { 
@extend %btn; 
@extend %btn--primary; 
} 
! 
.register-button { 
@extend %btn; 
@extend %btn--primary; 
@extend %btn--large; 
}
.save-button, .register-button { 
display: inline-block; 
border-radius: 6px; 
vertical-align: middle; 
padding: .6em 1em; 
cursor: pointer; 
} 
! 
.save-button, .register-button { 
background-color: #F31; 
color: #FFF; 
font-weight: 700; 
} 
! 
.register-button { 
font-size: 1.5em; 
}
a class=save-buttonSave/a 
! 
a class=register-buttonRegister/a
Smart!
Smart! 
׃ַ׃䪔ְָꨇ׃ְ
.mod_listType1 { 
section { 
margin-bottom:1em; 
} 
h1 { 
margin:0 0 .5em .5em; 
font-size:fz(15); 
-webkit-text-shadow:0px 1px 0px rgba(255,255,255,0.75); 
text-shadow:0px 1px 0px rgba(255,255,255,0.75); 
} 
ul { 
background-color:#ffffff; 
border:#c3c3c3 1px solid; 
overflow:hidden; 
@include radius(12px); 
li { 
border-top:#C3C3C2 1px solid; 
margin-top:-1px; 
margin-bottom:1px; 
font-size:fz(16); 
:first-child { 
a.disable { 
@include radius-tr(12px); 
@include radius-tl(12px); 
}
/* listType */ 
.mod_listType1 section, .mod_listType3 section, .mod_listType4 section, .mod_listType5 
section, .mod_listType8 section, .mod_listType7 section { 
margin-bottom: 1em; 
} 
.mod_listType1 h1, .mod_listType3 h1, .mod_listType4 h1, .mod_listType5 h1, .mod_listType8 
h1, .mod_listType7 h1 { 
margin: 0 0 .5em .5em; 
font-size: 15px; 
-webkit-text-shadow: 0px 1px 0px rgba(255, 255, 255, 0.75); 
text-shadow: 0px 1px 0px rgba(255, 255, 255, 0.75); 
} 
.mod_listType1 ul, .mod_H[JQ䖓 
listType3 ul, .mod_listType4 ul, .mod_listType5 ul, .mod_listType8 
ul, .mod_listType7 ul { 
background-border: overflow: border-440kb 
color: #ffffff; 
#c3c3c3 1px solid; 
hidden; 
radius: 12px; 
} 
.mod_listType1 ul li, .mod_listType3 ul li, .mod_listType4 ul li, .mod_listType5 ul li, .mod_listType8 ul 
li, .mod_listType7 ul li { 
border-top: #C3C3C2 1px solid; 
margin-top: -1px; 
margin-bottom: 1px; 
font-size: 16px; 
} 
.mod_listType1 ul li:first-child a.disable, .mod_listType3 ul li:first-child a.disable, .mod_listType4 ul 
li:first-child a.disable, .mod_listType5 ul li:first-child a.disable, .mod_listType8 ul li:first-child 
a.disable, .mod_listType7 ul li:first-child a.disable { 
border-radius: 12px; 
border-radius: 12px; 
} 
.mod_listType1 ul li:last-child a.disable, .mod_listType3 ul li:last-child a.disable, .mod_listType4 ul 
li:last-child a.disable, .mod_listType5 ul li:last-child a.disable, .mod_listType8 ul li:last-child 
a.disable, .mod_listType7 ul li:last-child a.disable { 
border-radius: 12px; 
border-radius: 12px;
Do 
1BSUJBM!JNQPSU 
知⽃ז!NJYJO 
ⵖꣲׁ׸׋طأز 
㢌侧 
Don’t 
!FYUFOE 
!醱꧟זNJYJO 
ؕآُ،ٕזطأز
Do 
1BSUJBM!JNQPSU 
知⽃ז!NJYJO 
ⵖꣲׁ׸׋طأز 
㢌侧 
Don’t 
!FYUFOE 
!醱꧟זNJYJO 
ؕآُ،ٕזطأز
.c-button--primary { 
$primaryColor: #F31; 
background-color: $primaryColor; 
:hover { 
background-color: mix($primaryColor,#FFF,80%); 
} 
}
Do 
1BSUJBM!JNQPSU 
知⽃ז!NJYJO 
ⵖꣲׁ׸׋طأز 
㢌侧 
Don’t 
!FYUFOE 
!醱꧟זNJYJO 
ؕآُ،ٕזطأز
// pc.app.scss 
// 
// Foundation 
@import foundation/normalize; 
@import foundation/variables; 
@import foundation/mixin; 
@import “foundation/base”; 
! 
// Layout 
@import layout/app; 
! 
// Object 
@import object/components/button; 
@import object/components/avatar; 
@import object/components/media; 
@import object/project/header; 
@import object/project/profile; 
@import object/project/articles;
// object/project/_profile.scss 
// 
// =============== 
// # Profile 
// =============== 
! 
.p-profile {...} 
.p-profile__avatar {...} 
.p-profile__name {...} 
.p-profile__biography {...} 
...
pc.app.scss pc.lp.scss sp.app.scss sp.lp.scss
pc.app.scss pc.lp.scss sp.app.scss sp.lp.scss
メンテナブルでありつづけるためのCSS設計
/** 
* Concatenation 
**/ 
concat: { 
pc: { 
files: { 
'temp/pc.app.scss': [ 
'app/stylesheets/foundation/*.scss', 
'app/stylesheets/layout/_app.scss', 
'app/stylesheets/object/component/*.scss', 
'app/stylesheets/object/project/*.scss', 
'app/stylesheets/object/utility/*.scss' 
] 
} 
}, 
sp: { 
files: { 
'temp/sp.app.scss': [ 
'app/stylesheets/foundation/*.scss', 
'app/stylesheets/layout/_app.scss', 
'app/stylesheets/object/component/sp/*.scss', 
'app/stylesheets/object/project/sp/*.scss', 
'app/stylesheets/object/utility/sp/*.scss'
メンテナブルでありつづけるためのCSS設計
The first draft ˑ of anything is shit 
قىؚٝؐؑ؎
Thank you! 
! github.com/hiloki 
 twitter.com/hiloki 
inkdesign.jp

More Related Content

PDF
Thinking about CSS Architecture
拓樹 谷
 
PDF
Why Sass?
拓樹 谷
 
PDF
CSS Components
拓樹 谷
 
PDF
CSS設計の理想と現実
拓樹 谷
 
PDF
Middleman 一小時完成你的專案原形
Even Wu
 
PDF
Professional Web Development
Joseph Chiang
 
PDF
How to Win the Heart of CSS Boys
拓樹 谷
 
PDF
HTML, CSS i Javascript Web tehnologije - 2. predavanje - Startit.rs
Milovan Jovičić
 
Thinking about CSS Architecture
拓樹 谷
 
Why Sass?
拓樹 谷
 
CSS Components
拓樹 谷
 
CSS設計の理想と現実
拓樹 谷
 
Middleman 一小時完成你的專案原形
Even Wu
 
Professional Web Development
Joseph Chiang
 
How to Win the Heart of CSS Boys
拓樹 谷
 
HTML, CSS i Javascript Web tehnologije - 2. predavanje - Startit.rs
Milovan Jovičić
 

What's hot (20)

TXT
Johny see book update
Ahmad Syaifudin
 
PDF
HTML, CSS i Javascript Web tehnologije - 4. predavanje - Startit.rs
Milovan Jovičić
 
PDF
Jogos: indo além do simples CSS 3.0
Fernanda Bernardo
 
TXT
thiết kế website bằng blogspot
Làm seo blogspot miễn phí
 
TXT
Johny coba dulu
sipali
 
TXT
Index
grateful7
 
PDF
How to Turn Your Ugly Old CSS into a Clean Future-Ready Beauty
Robin Pokorny
 
PDF
Novedades de Front-end 2016 (CSS3, HTML5 y APIs Javascript)
Román Hernández
 
DOCX
Practica #4 equipo 4
caradetorta0
 
PDF
box model
jay li
 
RTF
Documento
Bio Business Group
 
PDF
CSS 101
Sofish Lin
 
PDF
CSS-методологии от О до Б
Nikolay Yasinskiy
 
PDF
Основы CSS препроцессоров и их использование в WordPress
Dmitry Mayorov
 
PDF
HTML5とは何か? HTML5はじめの一歩 - 多摩美メディア芸術基礎II-1
Atsushi Tadokoro
 
PPT
Joomla Day Austin Part 3
Kyle Ledbetter
 
DOCX
Portafolio 2do Parcial
Sergio Muñiz
 
TXT
Code blogtangcan
Quyên Lê
 
PDF
Basic HTML
Md Rubel Hossain
 
PPT
CSS Technieken Toegelicht
Tweepixels
 
Johny see book update
Ahmad Syaifudin
 
HTML, CSS i Javascript Web tehnologije - 4. predavanje - Startit.rs
Milovan Jovičić
 
Jogos: indo além do simples CSS 3.0
Fernanda Bernardo
 
thiết kế website bằng blogspot
Làm seo blogspot miễn phí
 
Johny coba dulu
sipali
 
Index
grateful7
 
How to Turn Your Ugly Old CSS into a Clean Future-Ready Beauty
Robin Pokorny
 
Novedades de Front-end 2016 (CSS3, HTML5 y APIs Javascript)
Román Hernández
 
Practica #4 equipo 4
caradetorta0
 
box model
jay li
 
CSS 101
Sofish Lin
 
CSS-методологии от О до Б
Nikolay Yasinskiy
 
Основы CSS препроцессоров и их использование в WordPress
Dmitry Mayorov
 
HTML5とは何か? HTML5はじめの一歩 - 多摩美メディア芸術基礎II-1
Atsushi Tadokoro
 
Joomla Day Austin Part 3
Kyle Ledbetter
 
Portafolio 2do Parcial
Sergio Muñiz
 
Code blogtangcan
Quyên Lê
 
Basic HTML
Md Rubel Hossain
 
CSS Technieken Toegelicht
Tweepixels
 
Ad

Viewers also liked (18)

PPTX
2016年版 フロントエンド開発フォーマット
Kenya Kodaira
 
PDF
ブラウザにやさしいHTML/CSS
Takeharu Igari
 
PDF
CSS の歩き方
Seiichiro Mishiba
 
PDF
ヒューマンリーダブルな CSS 記述法(異次元編):2016年5月13日 CodeGrid 四周年記念パーティー
Yoshiki Hayama
 
PDF
なんでCSSすぐ死んでしまうん
Hayato Mizuno
 
PDF
悩まないコーディングをしよう! OOCSS,SMACSSを用いた、読みやすくてメンテナブルなCSS設計(Sass対応)
Horiguchi Seito
 
PDF
大規模サイトにおける本当は怖いCSSの話
井上 誠
 
PDF
Web design
kazuko kaneuchi
 
PDF
ノンデザイナーのためのWebデザイン講座
光利 吉田
 
PDF
プログラマがWebデザインについて考えてみた
Eigoro Yamamura
 
PDF
プログラマがデザインをがんばってみた
だいすけ ふるかわ
 
PDF
Webデザインのトーン&マナーを導き出す手法
Katsumi Tazuke
 
PDF
WordCamp Kansai 2015 デザイン初心者向けワークショップ〜 ブログデザインを実際に作ってみよう〜
Ayaka Sumida
 
PDF
デザインのためのデザイン
Masayuki Uetani
 
PDF
ノンデザイナーのための「デザインの判断」はとりあえずコレだけおさえよう
Sasaki Kouhei
 
PDF
Webデザインのセオリーを学ぼう
Toshiaki Sasaki
 
KEY
ノンデザイナーのための配色理論
tsukasa obara
 
PPT
色彩センスのいらない配色講座
Mariko Yamaguchi
 
2016年版 フロントエンド開発フォーマット
Kenya Kodaira
 
ブラウザにやさしいHTML/CSS
Takeharu Igari
 
CSS の歩き方
Seiichiro Mishiba
 
ヒューマンリーダブルな CSS 記述法(異次元編):2016年5月13日 CodeGrid 四周年記念パーティー
Yoshiki Hayama
 
なんでCSSすぐ死んでしまうん
Hayato Mizuno
 
悩まないコーディングをしよう! OOCSS,SMACSSを用いた、読みやすくてメンテナブルなCSS設計(Sass対応)
Horiguchi Seito
 
大規模サイトにおける本当は怖いCSSの話
井上 誠
 
Web design
kazuko kaneuchi
 
ノンデザイナーのためのWebデザイン講座
光利 吉田
 
プログラマがWebデザインについて考えてみた
Eigoro Yamamura
 
プログラマがデザインをがんばってみた
だいすけ ふるかわ
 
Webデザインのトーン&マナーを導き出す手法
Katsumi Tazuke
 
WordCamp Kansai 2015 デザイン初心者向けワークショップ〜 ブログデザインを実際に作ってみよう〜
Ayaka Sumida
 
デザインのためのデザイン
Masayuki Uetani
 
ノンデザイナーのための「デザインの判断」はとりあえずコレだけおさえよう
Sasaki Kouhei
 
Webデザインのセオリーを学ぼう
Toshiaki Sasaki
 
ノンデザイナーのための配色理論
tsukasa obara
 
色彩センスのいらない配色講座
Mariko Yamaguchi
 
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プリプロセッサの取扱説明書
拓樹 谷
 

メンテナブルでありつづけるためのCSS設計