Movatterモバイル変換


[0]ホーム

URL:


KK
Uploaded byKenjiro Kubota
720 views

2017: A CSS Design Odyssey

Introduction of CSS design that became popular by 2017

Embed presentation

Download to read offline
2017: A CSS Design OdysseyKenjiroKubota
社内勉強会のため自己紹介なし
今日伝えたいことあらゆるCSS設計の思想を知ることで、今後の自分たちのCSS設計にフィードバックしていきたい。してほしい。良いCSS設計はメンテナンスしやすい。楽していこう
A Long Past
html<a id="btn-main">メイン</a><a id="btn-sub">サブ</a>css#btn-main {width: 100px;height: 40px;background-color: red;}#btn-sub {width: 100px;height: 40px;background-color: blue;}
問題点使いまわせないID要素似たようなプロパティ値HTMLとCSSが密結合
HTMLの構造とCSSは分離していきたい
OOCSSObject Oriented CSS
OOCSS2009 -米Yahoo!のNicole Sullivanが提唱オブジェクト指向の考え方を参考にした設計方法Twitter Bootstrapが採用している設計
CSS is too fragileNicole Sullivan
プロパティ より セレクタ.selector { ... }
コンテナ(入れ物)とコンテンツ(中身)を分離ストラクチャー(構造)とスキン(装飾)の分離
html<a class="btn btn-red">メイン</a><a class="btn btn-blue">サブ</a>css.btn {width: 100px;height: 40px;}.btn-red {background-color: red;}.btn-blue {background-color: blue;}
OOCSSで重要なこと重複を避ける、冗長性を避ける同じようなプロパティの要素はまとめる要素依存、場所依存を避けるHTML要素を変更しても崩れない(にくい)
Past ━
OOCSS
HTMLの変更は簡単そうだ。だがCSSはどうだろう
BEMBlock Element Modi er
BEM2012~13 -Yandexのフロントエンジニアが提唱長期間メンテナンスできる設計で尚且つファーストバージョンの開発を素早く行えるチームのスケーラビリティコードの再利用性が高い
Block - 要素のルートElement - Blockの子要素。単体では存在しないModi er - 元となるBlock,Elementから変化した状態を表す要素
MindBEMding
MindBEMdingBEMをCSSのクラス名に適用するための規則Elementはアンダースコア2つ、Modi erはハイフン2つで区切って繋げることでBEMの各要素を表現する※この区切りをBEMではセパレーターと呼ぶ.Block__Element--Modi er
html<ul class="main-tab"><li class="main-tab__button"><a href="">Tab1</a></li><li class="main-tab__button"><a href="">Tab2</a></li><li class="main-tab__button main-tab__button--active"><a href="">Tab3</a></li><li class="main-tab__button"><a href="">Tab4</a></li></ul>
css.main-tab {...}.main-tab__button {...}.main-tab__button--active {...}
scss.main-tab {...&__button {...&--active {...}}}Block単位でファイル分割するのが通例(main-tab.scss)
MindBEMdingの書き方に拒絶反応を示す人もいるかもしれないけどルールが明確で命名に迷いにくい
Rule.widget_list / .widget__list
BEM
MCSSMultilayer CSS
MCSS2012~3 -OOCSS, BEMを基とした構成システム海外のSNSサイト会社のチームから作られた
レイヤーで分割
Layer0. Foundation1. Base2. Project3. Cosmetic
0: Foundationリセットとちょっとした変更を加えるだけのメインレイアウトのベースを記述した、全ページに適用されるスタイルを含める。すべてのリセットのようなファンデーションスタイルは、分割ファイルと共通CSSファイルの先頭とのどちらの場合でも、スタート直後に配置される。※ 当時はCSSプリプロセッサは考慮されいないので分割でCSSファイルを作成し、レイヤー順にリンクさせるように説明されている。
1: Base再利用可能で抽象的な構造フォームボタンナビゲーションブロックその他MCSS導入時にまず最初に再利用可能な標準スタイルのセットを作成すること。
2: Project分離されたページを構成するプロジェクトモジュールを含む登録フォームログインブロックショッピングカートその他可能な限りユニークなCSSクラスの仕様が推奨される。
3: Cosmeticわずかに影響するスタイル。リンクカラーシンプルなOOCSSグローバルな修飾子
Layer(再掲)0. Foundation (reset, normalize)1. Base (OOCSS)2. Project (BEM)3. Cosmetic (OOCSS)OOCSSとBEMの要素を取り入れ、階層の概念を持っている
SMACSSScalable and Modular Architecture for CSS
SMACSS2013-CSSのルールを5種類にカテゴライズし、それぞれの考え方や記述ルールが決められている電子書籍で無料で提供コード量を減らすメンテナンス性を高めるユーザー体験の一貫性の向上CSSプリプロセッサ前提っぽい?
CSSのカテゴライズBase - 要素そのもののデフォルトスタイルLayout - ページをエリアごとに分割Module - 再利用可能なパーツState - レイアウトやモジュールの特定の状態を示すTheme - サイトのルック&フィールを定義
Base Ruleサイト全体で要素そのもののデフォルトスタイルを定義要素そのものの定義という性質のため、IDやクラスは使わない。CSSリセットもベースに含む要素セレクタ( body , a )属性セレクタ( input[type=text] )擬似クラスセレクタ( a:hover )※要素セレクタに対しては具体的なスタイル指定をしない。(上書きが発生しないように)
Layout Ruleページのエリア分けを行う。.l- , .layout- プレフィックスを付ける。IDはCSSの詳細度を高めてしまうのでなるべく避ける(SMACSSでは禁止はしていない)※詳細度は後ほど説明します
子孫セレクタを使って分岐.l-main {width: 70%;}.l-fixed .l-main {width: 600px;}.l-fixed が付いている場合はpx指定、そうでなければ%指定
Module Rule再利用可能なパーツロゴナビゲーションタブレイアウトパーツの中に入れて、どこに置いても再利用できるように独立させておく。
モジュールの命名規則親モジュールの名前をプレフィックスでつける<div class="item"><p class="item-text"></p></div>IDや要素セレクタは避けて、クラスで統一するモジュール全部にクラスを付ける必要はない。li , a ... クラスとつけなくても良い(モジュール内で何度も登場する要素にはクラスをつける)
State Rule特定の状態に依ってスタイルを上書きする状態の切り替えはJavascriptが行う結果がtrueの場合は .is-表示/非表示.is-hidden.is-error.is-active
Theme Ruleすべての主要なルールに対して影響を与える。main.css.mod {border: 1px solid;}theme.css.mod {border-color: blue;}
規模によっては上書きではなくテーマ特有のクラスを設定するほうが良いかもしれない。そういう場合は .theme- プレフィックスを使う。.theme-border {border-color: purple;}.theme-background {background: linear-gradient( ... );}
MCSSより、より実践的な印象
閑話休題
CSSの詳細度https://www.w3.org/TR/selectors/#speci city
詳細度の概念詳細度は、どのプロパティ値が最もある要素に関係があり、適用されるかをブラウザが決定する手段です。詳細度は異なる順のセレクタで構成されるマッチング規則にのみ基づきます。どのように評価されるか詳細度はそれぞれのセレクタ型の数の連結で計算されます。それは、一致するマッチング表現を適用する重みではありません。詳細度が等しい場合は、 CSS で発見される最も後の宣言が要素に適用されます。(MDN)
speci cityは直訳だと特異性なんだけど…個人的には詳細度というより優先度と置き換えて覚えるとわかりやすいかもしれません。
詳細度の序列小全称セレクタ (*)タイプセレクタ (要素名)クラスセレクタ属性セレクタ ([type="text"], [href="#"])擬似クラス (:after, :nth-child)ID セレクタインラインスタイル大
!important の例外詳細度とは無関係に上書きを行う:not の例外否定擬似クラスの :not は詳細度の計算では擬似クラスとは見なされません。しかし、否定擬似クラスの中に置かれたセレクタは、通常のセレクタのように計算されます。
Questionhtml<p id="hoge"><span id="fuga" class="piyo1 piyo2 piyo3">ここは何色?</span></p>css#hoge #fuga {color: red;}#hoge .piyo1.piyo2.piyo3 {color: blue;}
正解は 赤
詳細度はCSSの複雑度を上げてしまうわかりやすく同レベルの詳細度に留めておくことで後勝ちの法則を保つid や !important は使わない
FLOCSSFoundation Layout Object CSS
FLOCSS2014 -サイバーエージェントの谷拓樹氏が提唱「CSS設計の教科書」の著者OOCSS, SMACSS, BEM, SuitCSSのコンセプトを取り入れ、MCSSのレイヤー構成にも影響を受けているいいとこ取りCSSプリプロセッサ前提
基本原則FLOCSSは3つのレイヤーとObjectレイヤーの子レイヤーで構成されるFoundationLayoutObjectComponentProjectUtility
FoundationReset.cssやNormalize.cssなどを用いたブラウザのデフォルトスタイルの初期化や、プロジェクトにおける基本的なスタイルを定義します。ページの下地としての全体の背景や、基本的なタイポグラフィなどが該当します。
Layoutページを構成するヘッダーやメインのコンテンツエリア、サイドバーやフッターといったプロジェクト共通のコンテナーブロックのスタイルを定義します。基本的には、ページ単位で唯一の存在である要素となるため、Layoutレイヤーの要素ではIDセレクタを採用することも可能です。ただしIDセレクタは高い詳細度を持つため、それを懸念する場合には、 l-* プレフィックスをつけた命名を採用するか、あるいは[id="header"] のような属性セレクタを用いることを推奨します。
ObjectOOCSSのコンセプトを元に、プロジェクトにおける繰り返されるビジュアルパターンをすべてObjectと定義します。FLOCSSでのObjectは、さらに次の3つのレイヤーに分けられます。
Component再利用できるパターンとして、小さな単位のモジュールを定義します。出来る限り、最低限の機能を持ったものとして定義されるべきであり、それ自体が固有の幅や色などの特色を持つことは避けるのが望ましいです。Projectプロジェクト固有のパターンであり、いくつかのComponentと、それに該当しない要素によって構成されるものを定義します。UtilityComponentとProjectレイヤーのObjectのモディファイアで解決することが難しい・適切では無い、わずかなスタイルの調整のための便利クラスなどを定義します。
命名規則MindBEMdingを採用。状態を表すものはSMACSSのStateパターンを用いて .is- プレフィックスを使う。ObjectのプレフィックスComponent - .c-*Project - .p-*Utility - .u-*
ディレクトリ構成├── foundation├── layout└── object├── component├── project└── utility
今までのCSS設計の良いところ実践的なことが詰まっている印象
RSCSSReasonable System for CSS
RSCSS2015 -合理的にCSSを組み立てるためのアイデア集5つの分類ComponentsElementsVariantsLayoutsHelpers
Components検索フォームのようなひとかたまりを一つのコンポーネントとして考える
命名規則Componentはダッシュで区切られた少なくとも2つの単語からなるLikeボタン .like-button検索フォーム .search-formニュースカード .article-card
ElementsComponentを構成する内部要素
命名規則それぞれのComponentは通常、複数のElementを持つ。Elementの名前は1単語にする.search-form {> .field { /* ... */ }> .action { /* ... */ }}
Elementのセレクター可能な限り子セレクタ > を使う。Componentのネスト防止になるし、子孫セレクタよりパフォーマンスが良い。複数の単語が使いたい2つ以上の単語からなる名前をつけたい場合は、ダッシュやアンダースコアを使わないで連結するタグセレクタは避けるちゃんとクラス名を付ける
VariantsComponentもElementもそれぞれvariantを持つことができる
命名規則variantのためのクラス名にはダッシュをプレフィックスとして付ける.like-buttoon {&.-wide { /* ... */ }&.-short { /* ... */ }&.-disabled { /* ... */ }}
ElementのvariantElementもまたvariantを持つ頃ができる.shopping-card {> .title { /* ... */ }> .title.-small { /* ... */ }}
Layouts
ポジションに関するプロパティは避けるComponentは異なるコンテキストで再利用するべきなので以下のようなプロパティを書くのは避けるPositioning (position, top, left, right, bottom)Floats ( oat, clear)Margins (margin)Dimensions (width, height) *
親要素でポジションを定義する.article-list {& {@include clearfix;}> .article-card {width: 33.3%;float: left;}}.article-card {& { /* ... */ }> .image { /* ... */ }> .title { /* ... */ }> .category { /* ... */ }}
Helpers._unmargin { margin: 0 !important; }._center { text-align: center !important; }._pull-left { float: left !important; }._pull-right { float: right !important; }汎用クラスはアンダースコアで始まる名前で別ファイルに置かれ、値を上書きする。通常、 !important でタグ付けされる。
命名規則アンダースコアをクラス名のプレフィックスとして付ける。<div class='order-graphs -slim _unmargin'></div>Heplerの整理helpers というひとつのファイルに収める。複数ファイルに分割することもできるが、たくさんの helper を最小限に維持するのが好ましい。
CSS Structureファイル単体でひとつのComponentUse glob matching@import 'components/*';過剰なネストを避ける/* ✓ Better: 2 levels */.image-frame {> .description { /* ... */ }> .description > .icon { /* ... */ }}
Atomic Designのアイデアも取り入れられている印象
ESCCEnduring CSS
ECSS2015 -bet365.com フロントエンジニアEnduring = 長続きする、永続的な、不屈の、我慢強い、心房強いOOCSSとは真逆のアプローチ
DRYではなくDecoupling
ECSSが目指すものCSSシンタックスにあるブレース {} の外側をどのように扱うか。プロパティをDRYにするのではなくキーセレクタをDRYにするべき。(OOCSSもセレクタに着目し他考え方だが、あくまでもブレース内をDRYにするための思想)キーセレクタをDRYにするコンテキストが違うコンポーネントは既存のコンポーネントと似ていても別物として扱う。抽象化したモジュールは変更に対する影響範囲が大きく扱いずらい。
モジュールnamespace - クラス名の衝突を防ぐための接頭辞Module - 個別の機能領域の最も大きな区分Component - Moduleに含まれる機能性を持つ部品ChildNode - Componentに含まれる独立した部品variant - Module内の部品の別の状態
命名規則ECSSとBEMModule,Component === BlockChildNode === Elementvariant === Modi reECSSとAtomicDesignModule === OrganismsComponent === Molecules
モジュールは以下のようなシンタックスで表現されますnamespace-ModuleName_ChildNode-variantnamespace-ComponentName_ChildNode-variantnamespace はModule名になることもあります。modulename-ComponentName_ChildNode-variantnamespaceとvariantはダッシュ、それ以外はアンダースコアで繋ぐ。
名前空間(namespace)クラス名の重複を避けるためECSSでは必ず名前空間を付けるトップページ TopPage .tp-カテゴリートップ CategoryTop .ct-ショッピングカート ShoppingCart .sc-
サイトに共通する構造的なモジュールStructureから取った .st- の名前空間を付けると良いサイトに共通する汎用的なモジュールSideWideから取った .sw- の名前空間を付けると良いLayout名前空間レイアウトを管理するモジュールの場合は .layout- 名前空間がオススメ
ディレクトリ構成(略)└── css├── font/├── base/│ ├── variable/│ ├── function/│ ├── mixin/│ ├── _normalize.scss│ ├── _base.scss│ └── _Icon.scss├── SiteWide/├── Structure/├── namespace/│ ├── layout/│ ├── news/│ ├── product/│ ├── results/│ ├── search/│ └── sitemap/└── site.scss
Moduleの状態変化状態変化はWAI-ARIA(ウェイ・アリア)を使うことが推奨されるaria-selected="true"aria-disabled="true"aria-hidden="true"aria-expanded="true"aria-busy="true"などなど。標準化された支援技術によってアクセシブルになることが期待できる。WAI-ARIAを使わない場合はvariantを使うことが勧められてます.co-Button-selected
ECSSの十戒1 すべてのキーセレクタは"Single Source of truth"であること2 入れ子にしない3 IDセレクタは使わない4 ベンダープレフィックスは書かない5 サイズや色、z-indexに変数を使う6 モバイルファーストで書く(max-widthを避ける)7 mixinを控えめにする(extendを避ける)8 すべてのマジックナンバーとブラウザハックに対してコメントを書く9 インラインイメージを使わない10 複雑なCSSを書かない
長い長い旅でしたねで、結局どの設計を使えばいいの・・?
どの設計を使うかはサイトの規模や、成長性次第コンパクトなサイトでSMACSS, FLOCSSなどは過剰かもしれない。将来的にサイトデザインが大きな変わりそうであれば捨てやすいECSSが良いかもしれない。でもデザインの統一性は必要ならOOCSSのエッセンスが必要なことも?大切なのはこのような設計方法を知ることでその良い部分を取り入れること自分たちのルールを混ぜるもよし。READMEにXXCSS設計を基にデザインされていると明記して、後からジョインされるメンバーも導入しやすい環境など。
thanks;)

Recommended

PDF
SVG MANIAX Ver.2 - Mars vanilla
PPTX
SMACSS入門
PDF
SVG MANIAX - CSS Nite After dark7
PDF
Ruka 20191212
PDF
jQuery Mobileの基礎
PDF
マークアップ講座 02 CSS
PPTX
Web Component概要
PDF
JavaScript basic, jQuery animation
PDF
悩まないコーディングをしよう! OOCSS,SMACSSを用いた、読みやすくてメンテナブルなCSS設計(Sass対応)
PDF
なんでCSSすぐ死んでしまうん
PDF
CSSフレームワークを使った 簡単なレスポンシブデザインの作成
PDF
CSS3 Design Recipe
PDF
CSSだけでもけっこうイケルTwenty Tenのカスタマイズとそこから踏み出す第一歩
PPT
CSS勉強会
KEY
コーディングが上達するコツ
PDF
リファクタリングHTML/CSS ~レガシー世界を超えて~ #scripty03
PPTX
CSS設計
PPTX
HTMLのアウトラインを意識しよう
PDF
今必要なCSSアーキテクチャ
PDF
今更ながらCSS3を試してみた
PDF
WordBenchTokyo-20111126
PPTX
Oocssとかついでにsmacssとbemの話も
PDF
CSS の歩き方
PDF
まだ間に合う「CSS設計」ことはじめ。CSSの闇に飲み込まれないための考え方。
PDF
CSSの光と闇
PDF
ネストを覚えた人のためのSassの便利な使い方
PDF
大阪Node学園八時限目 「コーディングのためのless - 基礎編 -」
PDF
Html5勉強会スライド
PDF
Laravel aspectで関心の分離
PDF
Responsableを使ったadr実装

More Related Content

PDF
SVG MANIAX Ver.2 - Mars vanilla
PPTX
SMACSS入門
PDF
SVG MANIAX - CSS Nite After dark7
PDF
Ruka 20191212
PDF
jQuery Mobileの基礎
PDF
マークアップ講座 02 CSS
PPTX
Web Component概要
PDF
JavaScript basic, jQuery animation
SVG MANIAX Ver.2 - Mars vanilla
SMACSS入門
SVG MANIAX - CSS Nite After dark7
Ruka 20191212
jQuery Mobileの基礎
マークアップ講座 02 CSS
Web Component概要
JavaScript basic, jQuery animation

Similar to 2017: A CSS Design Odyssey

PDF
悩まないコーディングをしよう! OOCSS,SMACSSを用いた、読みやすくてメンテナブルなCSS設計(Sass対応)
PDF
なんでCSSすぐ死んでしまうん
PDF
CSSフレームワークを使った 簡単なレスポンシブデザインの作成
PDF
CSS3 Design Recipe
PDF
CSSだけでもけっこうイケルTwenty Tenのカスタマイズとそこから踏み出す第一歩
PPT
CSS勉強会
KEY
コーディングが上達するコツ
PDF
リファクタリングHTML/CSS ~レガシー世界を超えて~ #scripty03
PPTX
CSS設計
PPTX
HTMLのアウトラインを意識しよう
PDF
今必要なCSSアーキテクチャ
PDF
今更ながらCSS3を試してみた
PDF
WordBenchTokyo-20111126
PPTX
Oocssとかついでにsmacssとbemの話も
PDF
CSS の歩き方
PDF
まだ間に合う「CSS設計」ことはじめ。CSSの闇に飲み込まれないための考え方。
PDF
CSSの光と闇
PDF
ネストを覚えた人のためのSassの便利な使い方
PDF
大阪Node学園八時限目 「コーディングのためのless - 基礎編 -」
PDF
Html5勉強会スライド
悩まないコーディングをしよう! OOCSS,SMACSSを用いた、読みやすくてメンテナブルなCSS設計(Sass対応)
なんでCSSすぐ死んでしまうん
CSSフレームワークを使った 簡単なレスポンシブデザインの作成
CSS3 Design Recipe
CSSだけでもけっこうイケルTwenty Tenのカスタマイズとそこから踏み出す第一歩
CSS勉強会
コーディングが上達するコツ
リファクタリングHTML/CSS ~レガシー世界を超えて~ #scripty03
CSS設計
HTMLのアウトラインを意識しよう
今必要なCSSアーキテクチャ
今更ながらCSS3を試してみた
WordBenchTokyo-20111126
Oocssとかついでにsmacssとbemの話も
CSS の歩き方
まだ間に合う「CSS設計」ことはじめ。CSSの闇に飲み込まれないための考え方。
CSSの光と闇
ネストを覚えた人のためのSassの便利な使い方
大阪Node学園八時限目 「コーディングのためのless - 基礎編 -」
Html5勉強会スライド

More from Kenjiro Kubota

PDF
Laravel aspectで関心の分離
PDF
Responsableを使ったadr実装
PDF
土日でLineみたいなチャット作ってきた!
PDF
Laravelでfacadeを使わない開発
PDF
FirebaseとNuxtでLPを作って見た
PDF
中・大規模でLaravelを導入するTips
PDF
Akkaとは。アクターモデル とは。
PDF
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
PDF
アイスタイル特設サイトにおけるVue.js導入事例(再演)
PDF
カメラを利用したアプリを作って約1000人で遊んだ話
PDF
gRPC入門
PDF
いまどき(これから)のPHP開発
PDF
Viewを活用して複雑化と戦う
PDF
LaravelでAPI定義を管理する
PDF
introducing vue-wait-component
PDF
HHVM/Hackを本番投入した話
PDF
アイスタイル特設サイトにおけるVue.jsの導入事例
PDF
フロントエンドエンジニアが知るべきFirebaseの世界
PDF
Introducing hhvm hack-async
PDF
HackのAsyncCurlで死んだ話
Laravel aspectで関心の分離
Responsableを使ったadr実装
土日でLineみたいなチャット作ってきた!
Laravelでfacadeを使わない開発
FirebaseとNuxtでLPを作って見た
中・大規模でLaravelを導入するTips
Akkaとは。アクターモデル とは。
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
アイスタイル特設サイトにおけるVue.js導入事例(再演)
カメラを利用したアプリを作って約1000人で遊んだ話
gRPC入門
いまどき(これから)のPHP開発
Viewを活用して複雑化と戦う
LaravelでAPI定義を管理する
introducing vue-wait-component
HHVM/Hackを本番投入した話
アイスタイル特設サイトにおけるVue.jsの導入事例
フロントエンドエンジニアが知るべきFirebaseの世界
Introducing hhvm hack-async
HackのAsyncCurlで死んだ話

2017: A CSS Design Odyssey


[8]ページ先頭

©2009-2025 Movatter.jp