SlideShare a Scribd company logo
1 of 73
Download to read offline
秋のJavaScript 祭in mixi
React で CSS カプセル化の可能性を考える
Yutaro Miyazaki (@vwxyutarooo)
ニート
フリーランス(Web制作)
会社員(フロントエンド)
React
Redux
Riot
Angular
CSS カプセル化
全てがグローバルスコープ
有効範囲を制限する
ScopedCSS
BEM・SMACSS・OOCSS
ネームスペースで解決してきた
フロントエンド意外お断り
そんなCSSもWebComponentsライクな
JSフレームワークの台頭により変化の兆しが
ShadowDOM(ShadowBoundary)
<div>
<style>
.title { color: #444; }
</style>
<h3 class="title">Item name</h3>
</div>
ScopedCSS
<div>
<style scoped>
.title { color: #444; }
</style>
<h3 class="title">Item name</h3>
</div>
encapsulation:ViewEncapsulation.Emulated
encapsulation:ViewEncapsulation.Native
Emulated
@Component({
selector: 'my-app',
encapsulation: ViewEncapsulation.Emulated,
styles: [`
.test { padding: 10px; }
`],
template: `
<div class="test">Test</div>
`
})
<body>
<my-app _nghost-cmy-1="">
<div _ngcontent-cmy-1="" class="test">Test</div>
</my-app>
</body>
.test[_ngcontent-cmy-1] {
padding: 10px;
}
Native
=ShadowDOM
<body>
<my-app>
▾ #shadow-root
<style>
.test { padding: 10px; }
</style>
<div class="test">
<div>Test</div>
</div>
</my-app>
</body>
<my-tag>
<h3>{ opts.title }</h3>
<style scoped>
:scope { display: block; border: 2px }
h3 { color: blue }
</style>
</my-tag>
↓
<style>
my-tag { display: block; border: 2px }
my-tag h3 { color: blue }
</style>
CustomElement風に擬似カプセル化
vue‑loader
<style scoped>
.example {
color: red;
}
</style>
<template>
<div class="example">hi</div>
</template>
↓
<style>
.example[_v-f3f3eg9] {
color: red;
}
</style>
<template>
<div class="example" _v-f3f3eg9>hi</div>
</template>
ReactでCSSカプセル化の可能性
前提認識
ネイティブなShadowDOMによるカプセル化は一旦忘れる
前提認識
全てのクラス・スタイルをカプセル化する必要はない
前提認識
グローバルのままがいい
Layout要素
Utility
カプセル化したい
Module要素
コンポーネントで完結するもの
可能性その1
CSSinJS
CSS in JS
const styles = {
root: {
color: color || avatar.color,
backgroundColor: backgroundColor || avatar.backgroundColor,
display: 'inline-flex',
alignItems: 'center',
justifyContent: 'center',
fontSize: size / 2,
borderRadius: '50%',
height: size,
width: size
}
};
return(
<div style={ styles.root }></div>
);
採用している React Component
MaterialUI
ReactToolbox
reactjs/react‑modal
ない
ない
ない
ない
ない
ない
ない
ない
ない
ない
キモい
嫌だ
ない
ごめん
言いすぎた
CSS in JS の問題
擬似クラス(:hover,:before,:after)
メディアクエリ
CSSアニメーション
シンタックス
CSS in JS 系リポジトリ
cssinjs/jss
cssinjs/react‑jss
FormidableLabs/radium
martinandert/react‑inline
smyte/jsxstyle
var Radium = require('radium');
var React = require('react');
var color = require('color');
@Radium
class Button extends React.Component {
render() {
return (
<button style={[ styles.base, styles[this.props.kind] ]}></button>
);
}
}
var styles = {
base: {
color: '#fff',
':hover': {
background: color('#0074d9').lighten(0.2).hexString()
}
},
...
};
アップサイド
シンタックス意外の問題は解決された
Styleの一部はPropで渡せる
考える必要なし
ダウンサイド
CSSじゃない→ 導入がハード
ロックインし過ぎ
カスケーディングしないだけ
(因みに) こうなった
@charset 'utf-8';
@import 'core/config';
.datepicker,
.timepicker {
font-size: 12px !important;
display: block !important;
overflow: hidden;
width: 100px !important;
height: auto !important;
border-width: 0 !important;
> div {
&:first-child {
line-height: inherit !important;
width: auto !important;
height: auto !important;
}
}
input {
line-height: 2 !important;
height: 36px !important;
padding: 0 10px !important;
text-align: center;
color: $colorFont !important;
border: 1px solid #ccc !important;
background-color: #fff !important;
}
可能性その2
CSSModule
特徴
CSSをCSSとして書ける
CSSクラスに一意のハッシュを自動で付与
/* volume-slide.scss */
.slider {
position: relative;
height: 100%;
&__track {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
width: 100%;
margin: auto 0;
background-color: rgba(255,255,255, .2);
}
&__handle {
position: absolute;
top: 0;
bottom: 0;
left: 0;
margin: auto;
cursor: pointer;
border-radius: 50px;
background-color: #fff;
&:before {
position: absolute;
top: 0;
bottom: 0;
// volume-slider.react.js
import styles from './volume-slider.scss';
render:
<slider className={ styles.slider }>
<div className={ styles.slider__track + ' ' + styles.black }></div>
<div className={ classnames(styles.slider__handle, styles.black) }></div
</slider>
出力:
<slider class="volume-slider__slider___2qmBE">
<div class="volume-slider__slider__track___1Okwk volume-slider__black___3-0A8"
<div class="volume-slider__slider__handle___X_x8Q volume-slider__black___3-0A8"
</slider>
ファイル名__クラス名__5桁のハッシュ
アップサイド
ファイル分割さえしていれば移行はスムーズ
SMACSSのModuleだけを置き換え
css‑moduleやめるときも特に何もしなくていい
ダウンサイド
WebpackとかBrowserifyの設定が必要
配布側では使えない
Webpack
{
test: /.css$/,
loaders: [
'style',
'css?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]
'postcss-loader',
]
}
Browserify
modularify
postcss‑modules
可能性その2.5
ReactCSSModule
React CSS Modules
CSSModulesだとnotenough
CSS Modules は
キャメルケースのクラス名に制限
styleオブジェクトの利用
グローバル,ローカルスコープのクラスの分別
未定義のCSSクラス参照時(エラー出ない)
React CSS Modules は
クラス名はスネークケースもいけるよ
classNameにstyleオブジェクト付けなくていいよ
グローバル,ローカルスコープのクラスが一目瞭然だよ
定義してないクラスにエラー吐くよ
// volume-slider.react.js
import CSSModules from 'react-css-modules';
import styles from './volume-slider.scss';
render:
<div styleName="slider">
<div styleName="slider__track"></div>
<div styleName="slider__handle">
</div>
</div>
export default CSSModules(VolumeSlider, styles);
出力:
<div class="volume-slider__slider___2qmBE">
<div class="volume-slider__slider__track___1Okwk volume-slider__black___3-0A8"
<div class="volume-slider__slider__handle___X_x8Q"></div>
</div>
グローバルなクラス=className
render:
<div className="global-css-class" styleName="slider">
<div styleName="slider__track"></div>
<div styleName="slider__handle">
</div>
</div>
ES7Decoratorがおすすめ
@CSSModules(styles, { allowMultiple: true })
export default class VolumeSlider extends React.Component {}
アップサイド
いいかも
ES7のDecorator使えば綺麗
ダウンサイド
依存関係が1個増える
可能性その3
CustomElement風
結論
Reactには無い
ただし
コンポーネントを配布する側では使いたい
import Select from 'react-select';
// Be sure to include styles at some point, probably during your bootstrapping
import 'react-select/dist/react-select.css';
react‑select・react‑spinner・react‑slider
Reactでやろうとする場合、loaderから
=現状だとscss側で対応
ダウンサイド
外部からの影響は受ける
グローバルがクリーンである必要
多少ユニークなクラス名が必要
HTMLUnknownElement...?
まとめ: React で CSS カプセル化は...
実用レベルであり
配布する時はCustomElement風
末端での利用ならばreact-css-module

More Related Content

What's hot

SVG MANIAX Ver.2 - Mars vanilla
SVG MANIAX Ver.2 -  Mars vanillaSVG MANIAX Ver.2 -  Mars vanilla
SVG MANIAX Ver.2 - Mars vanillaNaoki Matsuda
 
introduction to Marionette.js (jscafe14)
introduction to Marionette.js (jscafe14)introduction to Marionette.js (jscafe14)
introduction to Marionette.js (jscafe14)Ryuma Tsukano
 
スマホにおけるWebGL入門
スマホにおけるWebGL入門スマホにおけるWebGL入門
スマホにおけるWebGL入門Yohta Kanke
 
HTML5 と SVG で考える、これからの画像アクセシビリティ
HTML5 と SVG で考える、これからの画像アクセシビリティHTML5 と SVG で考える、これからの画像アクセシビリティ
HTML5 と SVG で考える、これからの画像アクセシビリティNaoki Matsuda
 
何が変わった JavaFX 2.0
何が変わった JavaFX 2.0何が変わった JavaFX 2.0
何が変わった JavaFX 2.0Yuichi Sakuraba
 
チュートリアルではじめるVue.js
チュートリアルではじめるVue.jsチュートリアルではじめるVue.js
チュートリアルではじめるVue.js小川 昌吾
 
大規模なJavaScript開発の話
大規模なJavaScript開発の話大規模なJavaScript開発の話
大規模なJavaScript開発の話terurou
 
Vue Router + Vuex
Vue Router + VuexVue Router + Vuex
Vue Router + VuexKei Yagi
 
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Akira Inoue
 
モテる JavaScript
モテる JavaScriptモテる JavaScript
モテる JavaScriptOsamu Monoe
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~normalian
 
実践Backbone.Marionette 現場の悩みと解決まで
実践Backbone.Marionette 現場の悩みと解決まで実践Backbone.Marionette 現場の悩みと解決まで
実践Backbone.Marionette 現場の悩みと解決までRyuma Tsukano
 
はじめてのVue.js
はじめてのVue.jsはじめてのVue.js
はじめてのVue.jsKei Yagi
 
node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るnode+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るKiyoshi SATOH
 
情報編集(Web) HTML5 実践1 Canvas + Javascriptで図形を描く
情報編集(Web) HTML5 実践1 Canvas + Javascriptで図形を描く情報編集(Web) HTML5 実践1 Canvas + Javascriptで図形を描く
情報編集(Web) HTML5 実践1 Canvas + Javascriptで図形を描くAtsushi Tadokoro
 
Vue.js 基礎 + Vue CLI の使い方
Vue.js 基礎 + Vue CLI の使い方Vue.js 基礎 + Vue CLI の使い方
Vue.js 基礎 + Vue CLI の使い方Kei Yagi
 
Start React with Browserify
Start React with BrowserifyStart React with Browserify
Start React with BrowserifyMuyuu Fujita
 
HTML5のCanvas入門 - Img画像を編集してみよう -
HTML5のCanvas入門 - Img画像を編集してみよう -HTML5のCanvas入門 - Img画像を編集してみよう -
HTML5のCanvas入門 - Img画像を編集してみよう -Toshio Ehara
 

What's hot (19)

SVG MANIAX Ver.2 - Mars vanilla
SVG MANIAX Ver.2 -  Mars vanillaSVG MANIAX Ver.2 -  Mars vanilla
SVG MANIAX Ver.2 - Mars vanilla
 
introduction to Marionette.js (jscafe14)
introduction to Marionette.js (jscafe14)introduction to Marionette.js (jscafe14)
introduction to Marionette.js (jscafe14)
 
スマホにおけるWebGL入門
スマホにおけるWebGL入門スマホにおけるWebGL入門
スマホにおけるWebGL入門
 
HTML5 と SVG で考える、これからの画像アクセシビリティ
HTML5 と SVG で考える、これからの画像アクセシビリティHTML5 と SVG で考える、これからの画像アクセシビリティ
HTML5 と SVG で考える、これからの画像アクセシビリティ
 
何が変わった JavaFX 2.0
何が変わった JavaFX 2.0何が変わった JavaFX 2.0
何が変わった JavaFX 2.0
 
チュートリアルではじめるVue.js
チュートリアルではじめるVue.jsチュートリアルではじめるVue.js
チュートリアルではじめるVue.js
 
大規模なJavaScript開発の話
大規模なJavaScript開発の話大規模なJavaScript開発の話
大規模なJavaScript開発の話
 
Vue Router + Vuex
Vue Router + VuexVue Router + Vuex
Vue Router + Vuex
 
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
 
モテる JavaScript
モテる JavaScriptモテる JavaScript
モテる JavaScript
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
 
実践Backbone.Marionette 現場の悩みと解決まで
実践Backbone.Marionette 現場の悩みと解決まで実践Backbone.Marionette 現場の悩みと解決まで
実践Backbone.Marionette 現場の悩みと解決まで
 
Vue.js入門
Vue.js入門Vue.js入門
Vue.js入門
 
はじめてのVue.js
はじめてのVue.jsはじめてのVue.js
はじめてのVue.js
 
node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るnode+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作る
 
情報編集(Web) HTML5 実践1 Canvas + Javascriptで図形を描く
情報編集(Web) HTML5 実践1 Canvas + Javascriptで図形を描く情報編集(Web) HTML5 実践1 Canvas + Javascriptで図形を描く
情報編集(Web) HTML5 実践1 Canvas + Javascriptで図形を描く
 
Vue.js 基礎 + Vue CLI の使い方
Vue.js 基礎 + Vue CLI の使い方Vue.js 基礎 + Vue CLI の使い方
Vue.js 基礎 + Vue CLI の使い方
 
Start React with Browserify
Start React with BrowserifyStart React with Browserify
Start React with Browserify
 
HTML5のCanvas入門 - Img画像を編集してみよう -
HTML5のCanvas入門 - Img画像を編集してみよう -HTML5のCanvas入門 - Img画像を編集してみよう -
HTML5のCanvas入門 - Img画像を編集してみよう -
 

Similar to React で CSS カプセル化の可能性を考える

なんでCSSすぐ死んでしまうん
なんでCSSすぐ死んでしまうんなんでCSSすぐ死んでしまうん
なんでCSSすぐ死んでしまうんHayato Mizuno
 
Backbone.jsとSASSでモジュールをつくった話
Backbone.jsとSASSでモジュールをつくった話Backbone.jsとSASSでモジュールをつくった話
Backbone.jsとSASSでモジュールをつくった話Yosuke Doke
 
JavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみよう
JavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみようJavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみよう
JavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみようHiroaki Wakamatsu
 
CSS Design and Programming
CSS Design and ProgrammingCSS Design and Programming
CSS Design and ProgrammingTaku AMANO
 
Firefox OSアプリ 「ModeView」
Firefox OSアプリ 「ModeView」Firefox OSアプリ 「ModeView」
Firefox OSアプリ 「ModeView」Hideki Akiba
 
ネストを覚えた人のためのSassの便利な使い方
ネストを覚えた人のためのSassの便利な使い方ネストを覚えた人のためのSassの便利な使い方
ネストを覚えた人のためのSassの便利な使い方Hiroki Shibata
 
compassで簡単! CSS3を手軽に利用する
compassで簡単!  CSS3を手軽に利用するcompassで簡単!  CSS3を手軽に利用する
compassで簡単! CSS3を手軽に利用するKazuya Hiruma
 
WordBenchTokyo-20111126
WordBenchTokyo-20111126WordBenchTokyo-20111126
WordBenchTokyo-20111126webourgeon
 
CSSだけでもけっこうイケルTwenty Tenのカスタマイズとそこから踏み出す第一歩
CSSだけでもけっこうイケルTwenty Tenのカスタマイズとそこから踏み出す第一歩CSSだけでもけっこうイケルTwenty Tenのカスタマイズとそこから踏み出す第一歩
CSSだけでもけっこうイケルTwenty Tenのカスタマイズとそこから踏み出す第一歩Chieko Aihara
 
Css preprocessorの始めかた
Css preprocessorの始めかたCss preprocessorの始めかた
Css preprocessorの始めかたHiroki Shibata
 
WebデザイナーのためのSass/Compass入門 先生:石本 光司
WebデザイナーのためのSass/Compass入門 先生:石本 光司WebデザイナーのためのSass/Compass入門 先生:石本 光司
WebデザイナーのためのSass/Compass入門 先生:石本 光司schoowebcampus
 
WebデザイナーのためのSass/Compass入門
WebデザイナーのためのSass/Compass入門WebデザイナーのためのSass/Compass入門
WebデザイナーのためのSass/Compass入門Koji Ishimoto
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略takezoe
 
jQuery Performance Tips – jQueryにおける高速化 -
jQuery Performance Tips – jQueryにおける高速化 -jQuery Performance Tips – jQueryにおける高速化 -
jQuery Performance Tips – jQueryにおける高速化 -Hayato Mizuno
 
マークアップ講座 02 CSS
マークアップ講座 02 CSSマークアップ講座 02 CSS
マークアップ講座 02 CSSeiji sekiya
 

Similar to React で CSS カプセル化の可能性を考える (20)

なんでCSSすぐ死んでしまうん
なんでCSSすぐ死んでしまうんなんでCSSすぐ死んでしまうん
なんでCSSすぐ死んでしまうん
 
Backbone.jsとSASSでモジュールをつくった話
Backbone.jsとSASSでモジュールをつくった話Backbone.jsとSASSでモジュールをつくった話
Backbone.jsとSASSでモジュールをつくった話
 
JavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみよう
JavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみようJavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみよう
JavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみよう
 
CSS Design and Programming
CSS Design and ProgrammingCSS Design and Programming
CSS Design and Programming
 
Firefox OSアプリ 「ModeView」
Firefox OSアプリ 「ModeView」Firefox OSアプリ 「ModeView」
Firefox OSアプリ 「ModeView」
 
ネストを覚えた人のためのSassの便利な使い方
ネストを覚えた人のためのSassの便利な使い方ネストを覚えた人のためのSassの便利な使い方
ネストを覚えた人のためのSassの便利な使い方
 
First sass
First sassFirst sass
First sass
 
compassで簡単! CSS3を手軽に利用する
compassで簡単!  CSS3を手軽に利用するcompassで簡単!  CSS3を手軽に利用する
compassで簡単! CSS3を手軽に利用する
 
WordBenchTokyo-20111126
WordBenchTokyo-20111126WordBenchTokyo-20111126
WordBenchTokyo-20111126
 
CSSだけでもけっこうイケルTwenty Tenのカスタマイズとそこから踏み出す第一歩
CSSだけでもけっこうイケルTwenty Tenのカスタマイズとそこから踏み出す第一歩CSSだけでもけっこうイケルTwenty Tenのカスタマイズとそこから踏み出す第一歩
CSSだけでもけっこうイケルTwenty Tenのカスタマイズとそこから踏み出す第一歩
 
Less - first step
Less - first stepLess - first step
Less - first step
 
Css preprocessorの始めかた
Css preprocessorの始めかたCss preprocessorの始めかた
Css preprocessorの始めかた
 
WebデザイナーのためのSass/Compass入門 先生:石本 光司
WebデザイナーのためのSass/Compass入門 先生:石本 光司WebデザイナーのためのSass/Compass入門 先生:石本 光司
WebデザイナーのためのSass/Compass入門 先生:石本 光司
 
WebデザイナーのためのSass/Compass入門
WebデザイナーのためのSass/Compass入門WebデザイナーのためのSass/Compass入門
WebデザイナーのためのSass/Compass入門
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略
 
CSS3 Design Recipe
CSS3 Design RecipeCSS3 Design Recipe
CSS3 Design Recipe
 
jQuery Performance Tips – jQueryにおける高速化 -
jQuery Performance Tips – jQueryにおける高速化 -jQuery Performance Tips – jQueryにおける高速化 -
jQuery Performance Tips – jQueryにおける高速化 -
 
What's Sketch.app
What's Sketch.appWhat's Sketch.app
What's Sketch.app
 
実践Sass 前編
実践Sass 前編実践Sass 前編
実践Sass 前編
 
マークアップ講座 02 CSS
マークアップ講座 02 CSSマークアップ講座 02 CSS
マークアップ講座 02 CSS
 

React で CSS カプセル化の可能性を考える