CSS
概要
各ユニットはデフォルトでは1つのCSSファイルを持ちます。各ユニットのCSSファイルは、ロードしてユニットに適用される必要があります。BitsmistJSではCSSの適用に標準技術のConstructable Stylesheetsを採用しており、設定に記述することで、共通のCSSと各ユニット専用のCSSといった複数の構造化されたCSSをユニットに適用することができます。また、複数のCSSを切り替えて使ったり、逆にCSSを全く使用しないユニットを作ることもできます。これらの機能はStylePerkによって処理されます。
Constructable StylesheetsはJavascript標準の技術です。詳細は以下をご覧ください。
BitsmistJSでは、通常の<style>タグを使用したスタイルのロードと適用もできますが、Constructable Stylesheetsを使って、よりコンポーネント化することが可能です。Shadow DOMの使用時には、必須の機能です。
ユニットは初期化中に“basic.transform”スペルを使い、beforeTransform・doTransform・afterTransformイベントをトリガーします。StylePerkはbeforeTransformで共通CSSをロード・適用するイベントハンドラをインストールし、doTransformでユニット専用CSSをロード・適用するイベントハンドラをインストールします。
設定
設定でどのCSSをロード・適用するのかを指定することができます。その場合、自動的にConstructable Stylesheetsが使用されます。設定には、どうやってCSSをロードするか、どのCSSを適用するか等を記述します。CSSの設定には大きく分けると、複数のユニットから使用される共通CSSの設定と、ユニット固有のCSSの設定があります。
共通CSS
複数のユニットから使用される共通CSSに関する設定は、グローバル設定の“system.styles”セクションに記述します。StylePerkは自身の初期化時(各ユニットがロードされる前)に、共通CSSのロードを開始します。
BITSMIST.v1.Unit.use("setting.merge", { "system": { "style": { "options": { "apply": ["reset", "common", "site"], }, "styles": { "reset": { "type": "URL", "URL": "/css/reset.css", }, "common": { "type": "URL", "URL": "/css/common.css", } } } } }
また共通CSSのロード完了後に、“apply”オプションで指定された共通CSSを、documentに対して適用します。
ユニット固有CSS
StylePerkの設定は“style”セクションに記述します。StylePerkに対する設定や、適用する共通CSSは“style.options”セクションに、各CSSに関する設定は“style.styles”セクション配下にCSS名をキーに記述します。キー名は後述のCSSの切り替え時に指定する名前となります。デフォルトのCSSに関する情報は“default”セクションに記述します。なお“default”セクションが存在しない場合は、デフォルトのファイルをロードします。
_getSettings() { return { "style": { "options": { "styleRef": True, "apply": [ "common", "wrapper" ] }, "styles": { "default": { "type": "URL", "rootNode": "/units/default.html" }, "style2": { "apply": ["common2"], "type": "CSS", "rootNode": "div {'background-color':'black'}" } } } } }
“style.options.apply”に記述された共通CSSは、どのCSSを使用しても適用されます。“styles.<styleName>.apply”に記述された共通CSSは、そのCSSに切り替えた時のみ適用されます。
StylePerkの設定の詳細については以下をご覧ください。
Constractable Stylesheetsを使用しない
Shadow DOMを使わない場合、Construtable Stylesheetsを使わずに、従来の方法でスタイルを適用することもできます。Constructable Stylesheetsを使用したくない場合は、各ユニットの設定でデフォルトCSSを使わない設定にしておき、<style>タグなどで、スタイルをロードします。
グローバル設定に記述することで、全ユニットがCSSを使わないようにすることができます。
BITSMIST.v1.Unit.use("setting.merge", { "style": { "options": { "styleRef": false, }, } }
各ユニットがグローバル設定に連結されていることを利用しています。
ロード
StylePerkはbeforeTransformとdoTransformイベントでCSSをロードし、適用します。
CSSのロード元としては、ファイル・固定のCSSの2種類からロードすることができます。何も設定を記述しない場合、デフォルトのパスとファイル名を使ってCSSファイルをロードします。
ファイルからロード
デフォルトのファイル
“system.style.options.path”と“style.options.path”を繋げたものが、デフォルトのパスとして使用されます。もし設定が存在しない場合はそれぞれ、“system.unit.options.path”と“unit.options.path”が代わりに使用されます。
また、タグ名に拡張子“css”をつけたファイル名を、デフォルトのファイル名として使用します。
ファイル名やパスを指定する
もし、ロードするパスやファイル名を変更したい場合は、設定に記述します。
_getSettings() { return { "style": { "options": { "path": "my-stylepath", "fileName": "my-stylefile", }, } } }
URLを使用したい場合は、skinRefオプションを使用します。
_getSettings() { return { "style": { "options": { "styleRef": "https://example.com/my-stylepath/my-stylefile.html", }, } } }
または“styles.default”セクションに記述します。
_getSettings() { return { "style": { "styles": { "default": { "type": "URL", "URL": "https://example.com/my-stylepath/my-stylefile.css", }, } } } }
CSSが不要な場合
もし、ユニットがCSSファイルを全く持たない場合、設定にそう記述する必要があります。
_getSettings() { return { "style": { "options": { "styleRef": false, }, } } }
そうでないと、ユニットがデフォルトのCSSファイルをロードしようとして404エラーが発生し、初期化が中断してしまいます。
固定のCSSからロード
設定にCSSを記述することで、そのCSSをユニットに対し使用します。Webpackなどを使用すれば、CSSは外部ファイルに記述しておきながら、一つのファイルにまとめることも可能です。
_getSettings() { return { "style": { "styles": { "default": { "type": "CSS", "CSS": "div {'background-color':'black'}" }, } } } }
適用
ロードされた共通CSSはbeforeTransform、ユニット専用CSSはdoTransformイベントで適用されます。HTMLも同じdoTransformイベントで適用されますが、StylePerkの方が優先度が高いためCSSが先に適用されます。さらに、まだTemplateクローン状態であるノードに対して適用するため、FOUCが派生しません。
切り替え
HTMLと同じく、“basic.transform”スペルを使用することで、複数のCSSを状況に応じて切り替えることができます。その際、初期化と同じようにCSSのロードと適用が行われます。スペルの引数には切り替え先のCSS名を指定します。
this.cast("basic.transform", {"styleName": "style2"});
初期化時のデフォルトCSSのロードと適用にも、“basic.transform”スペルが使用されています。
CSSを切り替えて使用する場合、あらかじめ設定の“style.styles”セクションに、切り替え先のCSSの設定を記述しておく必要があります。
_getSettings() { return { "style": { "styles": { "style2": { "type": "CSS", "HTML": "div {'background-color':'pink'}" }, } } } }