Native Scriptアプリケーションのビュー(要素)の外観や表現は、Webアプリケーションで行うのと同様の方法で変更可能です。 カスケードスタイルシート(CSS)を使用するか、JavaScriptの要素のスタイルオブジェクトを変更します。 CSS言語はサブセットのみがサポートされています。
DOM Style Objectと同様に、各Viewインスタンスは、ビューの保持する全てのスタイルプロパティを公開します。 ビューが表示されると、そのスタイルプロパティはすべて、基になるネイティブウィジェットに適用されます。
CSSスタイルは、3つの異なるレベルで設定できます。
異なるレベルで宣言されたCSSがある場合—すべてが適用されます。インラインCSSの優先度が最も高く、アプリケーションCSSの優先度が最も低くなります。
プラットフォーム固有のCSSを適用することもできます。
アプリケーションが起動すると、NativeScriptはapp.cssファイルが存在するかどうかを確認します。 含まれている場合、含まれるCSSスタイルはすべてのアプリケーションページでロードおよび使用されます。このファイルは、複数のページで使用されるスタイルを保存するのに便利な場所です。
アプリケーション全体のCSSがロードされるファイルの名前を変更できます。通常、以下に示すようにapp.jsまたはapp.tsファイルで、 アプリケーションを開始する前に変更を行う必要があります。
var application = require("tns-core-modules/application");
application.setCssFileName("style.css");
application.start({ moduleName: "main-page" });
import { setCssFileName, start as applicationStart } from "tns-core-modules/application";
setCssFileName("style.css");
applicationStart({ moduleName: "main-page" });
以下に示すようにgetCssFileName()メソッドを使用して、アプリケーション全体のCSSファイルの名前を確認することもできます。
var application = require("tns-core-modules/application");
var fileName = application.getCssFileName();
console.log(`fileName ${fileName}`);
import { getCssFileName, start as applicationStart } from "tns-core-modules/application";
let fileName = getCssFileName();
console.log(`fileName ${fileName}`);
applicationStart({ moduleName: "main-page" });
ページのXML宣言ファイルが読み込まれると、NativeScriptは同じ名前のCSSファイル(存在する場合)を探し、見つかったCSSスタイルを読み取り、自動的に読み込んでページに適用します。 たとえば、mypage.xmlという名前のページは、mypage.css内のすべてのCSSを自動的に読み込みます。 CSSファイルは、自動的に適用されるXMLファイルと同じフォルダーに存在する必要があります。
ページにカスタムコンポーネントをインポートすると、それらのコンポーネントのCSSもページに適用されます。 カスタムコンポーネントのCSSをスコープして、コンポーネントスタイルがページに「漏れない」ようにするのが最適な方法です。
<!-- myCustomComponent.xml -->
<StackLayout class="mywidget">
<Label text="Custom component layout" class="label" />
</StackLayout>
/* myCustomComponent.css */
/* GOOD: This will ONLY apply to the custom component */
.mywidget .label {
color: blue;
}
/* BAD: This will apply to the custom component AND potentially to the page where the component is used */
.label {
color: blue;
}
カスタムコンポーネントのスタイルがどのように適用されるかの例については、このプロジェクトをNativeScript Playgroundで試してください。
ページのcssプロパティを使用して、ファイルで指定されたCSSスタイルをオーバーライドすることもできます。
ページにデフォルトのCSSを設定したら、次の2つの方法を使用して追加できます。
このスニペットは、現在のスタイルセットに新しいスタイルを追加します。これは、小さなCSSチャンクを要素に追加する必要がある場合(テスト目的など)に非常に便利です。
page.addCss("button {background-color: blue}");
page.addCss("button {background-color: blue}");
このスニペットは、現在のセットに新しいCSSスタイルを追加します。ただし、このメソッドはファイルからそれらを読み取ります。ファイル内のスタイルを整理し、複数のページでスタイルを再利用するのに便利です。
.css
ファイル拡張子を含める必要があります。
HTMLと同様に、CSSはXMLマークアップのUIビューに対してインラインで定義できます。
<Button text="inline style" style="background-color: green;" />
NativeScriptの規則により、個別のスタイルシートまたはインライン宣言を介して、プラットフォーム固有のCSSを簡単に適用できます。 特定のプラットフォームおよび画面サイズでファイルをターゲットとするためのファイル名規則の概要については、このドキュメントを参照してください。
iOSまたはAndroidでスタイルをターゲットにするには、主に4つの方法があります。
styles.ios.css、styles.android.css
)<ios> ... </ios>、<android> ... </android>
)<Label ios:style="..." android:style="..."
).ios .mystyle { ... }、.android .mystyle { ... }
)*プラグインが必要NativeScriptでプラットフォームに依存しない、プラットフォーム固有のスタイルを管理するための最も一般的で維持可能なパターンは、複数のスタイルシートとCSSインポートを使用することです。 このPlaygroundデモを参照して、このパターンの実際の動作を確認してください。
このパターンでは、ページにはcommon、iOS、Androidの3つの異なるスタイルシートがあります。たとえば、myPage.xmlページの場合、3つのスタイルシートがあります。
myPage-common.css
myPage.ios.css
myPage.android.css
myPage.ios.cssとmyPage.android.cssの両方で、myPage-common.cssから共通の共有スタイルをインポートします。
/* Import shared style rules */
@import './myPage-common.css';
/* Add iOS/Android specific rules (if any) */
.mystyle { ... }
ビルド時に、NativeScriptは自動的に共通スタイルをインポートし、ターゲットビルドプラットフォームに応じて正しいiOSまたはAndroidスタイルシートを選択します。
NativeScriptは、CSSセレクター構文のサブセットをサポートします。サポートされているセレクターの使用方法は次のとおりです。
CSS要素セレクターと同様に、NativeScriptのタイプセレクターは、指定されたタイプのすべてのビューを選択します。タイプセレクタは大文字と小文字を区別しないため、 buttonとButtonの両方を使用できます。
button { background-color: gray }
クラスセレクターは、指定されたクラスを持つすべてのビューを選択します。 クラスはclassName、ビューのプロパティを使用して設定されます。 注釈:JS / TS で要素にクラスを追加するためにclassNameに指定するクラスルールは、 app.cssなどの、対象要素よりも上位のコンポーネントツリー上にあるCSSファイルに存在する必要があります。
.title { font-size: 32 }
var label = new labelModule.Label();
label.className = "title"
let label = new labelModule.Label();
label.className = "title"
<Label className="title" />
IDセレクターは、指定されたIDを持つすべてのビューを選択します。idは、ビューのidプロパティを使用して設定されます。
#login-button { background-color: blue }
var btn = new buttonModule.Button();
btn.id = "login-button"
var btn = new buttonModule.Button();
btn.id = "login-button"
<Button id="login-button" />
CSSセレクターには複数の単純なセレクターを含めることができ、セレクター間に関連性を示すシンボルを含めることができます。
StackLayout Button { background-color: blue; }
<StackLayout>
<WrapLayout>
<Button id="login-button" testAttr='flower' />
</WrapLayout>
</StackLayout>
StackLayout > Button { background-color: blue; }
background-colorルールは適用されません。 セレクターを適用するには、WrapLayout要素を削除して、ButtonがStackLayoutの直接の子になるようにする必要があります。
<StackLayout class="layout-class">
<Label text="Direct sibling test by id"/>
<Button class="test-child" text="First Button"/>
<Button class="test-child-2" text="Second Button"/>
</StackLayout>
.layout-class .test-child + .test-child-2 {
background-color: green;
}
<StackLayout class="layout-class">
<Label text="Direct sibling test by id"/>
<Button id="test-child" text="First Button"/>
<Button id="test-child-2" text="Second Button"/>
</StackLayout>
.layout-class #test-child + #test-child-2 {
background-color: green;
}
<StackLayout class="direct-sibling--type">
<Label text="Direct sibling by type"/>
<Button text="Test Button"/>
<Label text="Test Label"/>
<Button text="Test Button"/>
<Label text="Test Label"/>
<Button text="Test Button"/>
<Label text="Test Label"/>
</StackLayout>
StackLayout Button + Label{
background-color:green;
color:white;
}
このセレクターは、testAttr属性に何らかの値を持つすべてのボタンを選択します。
また、いくつかのより高度なシナリオがサポートされています。
button [testAttr='flower'] {...}
- testAttrプロパティがflowerという値に正確に設定されているすべてのボタンにCSSを適用します。button [testAttr~='flower'] {...}
- スペースで区切られた単語のリストを含むtestAttrプロパティを持つすべてのボタンを選択します。そのリストの1つは「flower」です。button [testAttr|='flower'] {...}
- 「flower」で始まるtestAttrプロパティ値を持つすべてのボタンを選択します。
値は、btn['testAttr'] = 'flower'のように単独であるか、
もしくはbtn['testAttr'] = 'flower-house'のようにハイフン(-)が続く、単語全体でなければなりません。button [testAttr^='flower'] {...}
- 「flower」で始まるtestAttrプロパティ値を持つすべてのボタンを選択します。値は単語全体である必要はありません。button [testAttr$='flower'] {...}
- 「flower」で終わるtestAttrプロパティ値を持つすべてのボタンを選択します。値は単語全体である必要はありません。button [testAttr*='flo'] {...}
-「flo」を含むtestAttrプロパティ値を持つすべてのボタンを選択します。値は単語全体である必要はありません。属性セレクターは単独で使用することも、すべてのタイプのCSSセレクターと組み合わせることもできます。
#login-button[testAttr='flower'] { background-color: blue; }
[testAttr] {color: white;}
<Button id="login-button" testAttr='flower' />
<Label testAttr="some value" />
擬似セレクターまたは擬似クラスを使用して、要素の特別な状態を定義します。現在、NativeScriptは:highlighted擬似セレクターのみをサポートしています。
柔軟なスタイル設定とテーマ設定を可能にするために、NativeScriptは特定の状態のアプリケーションのルートビューにCSSクラスを追加します。
デフォルトのCSSクラスは次のとおりです。
.ns-root
- アプリケーションのルートビューに割り当てられたクラス.ns-modal
- モーダルルートビューに割り当てられたクラス各アプリケーションおよびモーダルルートビューのCSSクラスは次のとおりです。
.ns-android, .ns-ios
- アプリケーションプラットフォームを指定するクラス.ns-phone, .ns-tablet
- デバイスタイプを指定するクラス.ns-portrait, .ns-landscape, .ns-unknown
- アプリケーションの方向を指定するクラス.ns-light, .ns-dark
- システムの外観を指定するクラス。ダークモードのサポートの詳細については、このドキュメントを参照してください。
このプロパティのリストは、CSSで、または各ビューのスタイルプロパティを介して設定できます。
CSSプロパティ | JAVASCRIPTプロパティ | 説明 |
---|---|---|
color | color | 一致したビューの前景に単色の値を設定します。 |
background | background | 一致したビューの背景に単色の値または線形グラデーションを設定します。 |
background-color | backgroundColor | 一致したビューの背景に単色の値を設定します。 |
placeholder-color | placeholderColor | プレースホルダー(ヒント)のフォントの色を一致したビューに設定します。 |
background-image | backgroundImage | 一致したビューの背景画像に画像URLを設定します。 |
background-repeat | backgroundRepeat | 背景画像を繰り返すかどうか/繰り返す方法を設定します。指定可能な値:repeat、repeat-x、repeat-y、no-repeat |
background-position | backgroundPosition | 背景画像の開始位置を設定します。絶対値、パーセント値、アライメント値で位置を設定できます。詳細はこちら。 |
background-size | backgroundSize | 背景画像のサイズを設定します。指定可能な値:「length length」、「percent% percent%」、「cover」、「contain」。 |
border-color | borderColor | 一致するビューの境界色を設定します。 |
border-top-color | borderTopColor | 一致するビューの上部の境界線の色を設定します。 |
border-right-color | borderRightColor | 一致したビューの右境界線の色を設定します。 |
border-bottom-color | borderBottomColor | 一致したビューの下部の境界線の色を設定します。 |
border-left-color | borderLeftColor | 一致したビューの左境界線の色を設定します。 |
border-width | borderWidth | 一致したビューの境界線の幅を設定します。 |
border-top-width | borderTopWidth | 一致するビューの上部の境界線の幅を設定します。 |
border-right-width | borderRightWidth | 一致したビューの右境界線の幅を設定します。 |
border-bottom-width | borderBottomWidth | 一致したビューの下部の境界線の幅を設定します。 |
border-left-width | borderLeftWidth | 一致したビューの左境界線の幅を設定します。 |
border-radius | borderRadius | 一致したビューの境界半径を設定します。 |
font | font | 一致したビューのフォントプロパティ(font-family、font-size、font-style、font-weightを含む)を設定します。 |
font-family | fontFamily | 一致したビューのフォントファミリを設定します。 |
font-size | fontSize | 一致したビューのフォントサイズを設定します(デバイスに依存しないユニットのみをサポートします)。 |
font-style | fontStyle | 一致したビューのフォントスタイルを設定します。指定可能な値:italic、normal。 |
font-weight | fontWeight | 一致したビューのフォントの太さを設定します。 指定可能な値:bold、normal、100、200、 300、400、500、600、 700、800、900、 このとき、400はnormal、700はboldです(注:一部のフォントは使用可能なすべてのバリエーションをサポートしていません)。 |
text-align | textAlignment | 一致したビューのテキストの配置を設定します。指定可能な値:left、center、right。 |
text-decoration | textDecoration | テキストの書式を設定します。指定可能な値:none、line-through、underline。 |
text-transform | textTransform | テキスト変換を設定します。指定可能な値:none、capitalize、uppercase、lowercase。 |
letter-spacing | letterSpacing | テキストの文字間隔を設定します。(Android APIレベル21以降。) |
line-height | lineHeight | テキスト行の高さを設定します |
z-index | zIndex | z-indexを設定します。(Android APIレベル21以降。) |
clip-path | clip-path | クリップパスを設定します。サポートされている形状は、円、楕円、長方形、多角形です。 clippyを使用して独自の形状を定義できます。 |
vertical-align | verticalAlignment | 親内の現在のビューの垂直方向の配置を設定します。指定可能な値:top、center、bottom、stretch。 |
horizontal-align | horizontalAlignment | 親内の現在のビューの水平方向の配置を設定します。指定可能な値:left、center、right、stretch。 |
margin | margin | 親内のビューのマージンを設定します。 |
margin-top | marginTop | 親内のビューの上余白を設定します。 |
margin-right | marginRight | 親内のビューの右マージンを設定します。 |
margin-bottom | marginBottom | 親内のビューの下マージンを設定します。 |
margin-left | marginLeft | 親内のビューの左マージンを設定します。 |
width | width | ビューの幅を設定します。 |
height | height | ビューの高さを設定します。 |
min-width | minWidth | 最小ビュー幅を設定します。 |
min-height | minHeight | 最小のビューの高さを設定します。 |
padding | padding | レイアウトコンテナの境界とその子の間の距離を設定します。 |
padding-top | paddingTop | レイアウトコンテナの上部パディングを設定します。 |
padding-right | paddingRight | レイアウトコンテナの右パディングを設定します。 |
padding-bottom | paddingBottom | レイアウトコンテナの下の余白を設定します。 |
padding-left | paddingLeft | レイアウトコンテナの左余白を設定します。 |
visibility | visibility | ビューの可視性を設定します。指定可能な値:visible、collapse(またはcollapsed)。 |
opacity | opacity | ビューの不透明度を設定します。値の範囲は 0~1 です。 |
モバイル開発のコンテキストでは、モバイル固有のプロパティがいくつかあります(AndroidやiOSなどのプラットフォーム固有のプロパティもあります)。 NativeScriptでは、これらの機能を備えたプロパティは、コード(インライン、JavaScriptおよびTypeScript)の両方からアクセスできますが、CSSプロパティとしても公開されます。 API参照とは別に、以下のリストは、NativeScriptで一般的でないCSSプロパティのほとんどを提供しています。
CSSプロパティ | JAVASCRIPTプロパティ | プラットフォーム | 適合性 | 説明 |
---|---|---|---|---|
tab-text-color | tabTextColor | 両方 | TabView | タブのタイトルのテキストの色を設定します。 |
selected-tab-text-color | selectedTabTextColor | 両方 | TabView | タブが選択された際の、テキストの色を設定します。 |
tab-background-color | tabBackgroundColor | 両方 | TabView | タブの背景色を設定します。 |
tab-text-font-size | tabTextFontSize | 両方 | TabView | タブ内のコンテンツのフォントサイズを変更せずに、タブタイトルのフォントサイズを設定します。 |
text-transform | textTransform | 両方 | TabViewItem | TabViewItem ごとに個別にテキスト変換を設定します。値のオプション:capitalize 、lowercase 、none 、uppercase 。 |
android-selected-tab-highlight-color | androidSelectedTabHighlightColor | Android | TabView | Androidのタブの下線の色を設定します。 |
android-elevation | androidElevation | Android | View | Androidのビューの標高を設定します。 |
android-dynamic-elevation-offset | androidDynamicElevationOffset | Android | View | Androidのビューの、アクションが実行されたとき(例えばtap 、touch )の標高を設定します。 |
off-background-color | offBackgroundColor | 両方 | Switch | スイッチがオフのときのスイッチの背景色を設定します。 |
highlight-color | highlightColor | 両方 | TabStrip | 選択したTabStripItem の下線の色を取得または設定します。 |
現在、TabStripItem 内の Label および Image コンポーネントには、backgroundColor、color、 fontFamily、fontSize、fontStyle、 fontWeight、textTransform のスタイリングプロパティのみを設定できます。 これらのプロパティの使用法の詳細については、サポートされているCSSプロパティセクションを参照してください。
注釈:iOSでは、TabStripItemを個別にスタイル設定することはできません。
{N} 5.4以降、androidElevationというAndroid固有の新しいプロパティが導入されました。 ビューの標高は Zproperty で表され、影の視覚的外観を決定します。 標高の値が大きいほど、ビューにソフトな影が設定され、低い標高を使用すると小さい影が設定されます。
例:
.tvElevation{
android-elevation:5;
}
<StackLayout class="home-panel">
<TextView class="tvElevation" editable="false" textWrap="true" text="TextView" />
<Label androidElevation="5" class="sampleLabel" textWrap="true" text="Label" />
<Button androidElevation="7" class="sampleButton" text="Button" />
</StackLayout>
.btn-no-elevation {
android-elevation: 0;
}
このプロパティの詳細については、シャドウとクリップビューの作成の記事をご覧ください。
{N} 5.4で導入されたもう1つのプロパティはandroidDynamicElevationOffsetです。 このプロパティを使用すると、アクションの実行時に表示される標高を設定できます。 これらのアクションは、例えば、tap、touchなどです。
例:
.sampleButton2{
background-color: lightcyan;
android-elevation:7;
android-dynamic-elevation-offset:7;
}
<StackLayout class="home-panel">
<Button androidElevation="7" androidDynamicElevationOffset="8"
class="sampleButton" text="Button" tap="" />
<Button class="sampleButton2" text="Button" tap="" />
</StackLayout>
NativeScriptは、測定単位として、DIP(デバイス非依存ピクセル)、ピクセル値(postfixを介したpx)、パーセント値(width、height、marginは部分的なサポート)をサポートしています。
NativeScriptの推奨測定単位はDIPです。 すべての測定可能なプロパティ(width、height、margin、paddings、 border-widthなど)はデバイスに依存しないピクセル数をサポートしています。フォントサイズは常にDIPで測定されます。
.myLabel {
font-size: 28;
width: 200;
height: 30;
}
デバイスに依存しないピクセル(DIP)は、デバイス画面のピクセルをデバイス画面スケール(密度)で割った値に等しくなります。
const screen = require("tns-core-modules/platform").screen;
// mainScreen is of type ScreenMetrics interface /api-reference/interfaces/_platform_.screenmetrics
let scale = screen.mainScreen.scale;
let widthPixels = screen.mainScreen.widthPixels;
let heightPixels = screen.mainScreen.heightPixels;
let widthDIPs = screen.mainScreen.widthDIPs; // DIPs === pixels/scale (e.g 1024 pixels / 2x scale = 512 DIPs)
let heightDIPs = screen.mainScreen.heightDIPs;
import { screen } from "tns-core-modules/platform";
// mainScreen is of type ScreenMetrics interface /api-reference/interfaces/_platform_.screenmetrics
let scale = screen.mainScreen.scale;
let widthPixels = screen.mainScreen.widthPixels;
let heightPixels = screen.mainScreen.heightPixels;
let widthDIPs = screen.mainScreen.widthDIPs; // DIPs === pixels/scale (e.g. 1024 pixels / 2x scale = 512 DIPs)
let heightDIPs = screen.mainScreen.heightDIPs;
NativeScriptは、width、height、marginsでパーセント値をサポートします。 レイアウトパスが開始されると、まず親の使用可能なサイズに基づいてパーセント値が計算されます。 つまり、垂直なStackLayoutで2つのButtonをheight='50%'として配置すると、使用可能なすべての高さが得られます(たとえば、StackLayoutを垂直に塗りつぶします)。 marginプロパティにも同じことが当てはまります。 たとえば、marginLeft='5%'を設定した場合、要素には、親の利用可能な幅の5%に対応するマージンがあります。
NativeScriptは、アプリで使用されるCSSを通じて再利用可能な値のCSS変数 (カスタムプロパティまたはカスケード変数とも呼ばれます)をサポートします。
CSS変数は、親ビューから子ビューに引き継がれます。
変数の宣言:
/* Define --my-custom-color as a global value */
.ns-root {
--my-custom-color: black;
}
/* In landscape mode change the value to blue */
.ns-landscape {
--my-custom-color: blue;
}
子要素から変数をオーバーライドする:
/* Change --my-custom-color to green for elements below */
.ns-root .override-color {
--my-custom-color: green;
}
変数を使用する:
.using-variable {
color: var(--my-custom-color);
}
デフォルト値は--my-undefined-valueでblackとなります。 横長(landscape)モードではblueになります。 親要素にクラスoverride-colorがある場合、値はgreenになります。
代替値を使用する:
.using-variable {
color: var(--my-undefined-value, yellow);
}
--my-undefined-valueは定義されていないため、--my-undefined-valueの色はyellowが適用されます。
ネストされたフォールバック値を使用する:
.using-variable {
color: var(--my-undefined-value, var(--my-custom-color, yellow));
}
NativeScriptは、CSS値で簡単な計算を実行するための CSS calc()
関数をサポートしています。
構文:
element {
width: calc(100% * 1.25); /* width: 125% */
}
CSS variables
を使用:
element {
--my-variable: 10:
width: calc(100% * var(--my-variable)); /* width: 125% */
}
CSS仕様の一部ではないNativeScriptコンポーネントプロパティ値を設定できます。例えば:
StackLayout {
orientation: horizontal;
}
この機能は、string、number、booleanなどの単純なタイプのプロパティに限定され、XMLのコンポーネントマークアップ宣言に似たローカルプロパティ値を設定します。CSSの継承はサポートされていません。
font-familyプロパティには、いくつかの値を保持することができますが、リストの中で最初にサポートされているフォントが使用されます。 次の汎用フォントファミリもサポートされています。
プラットフォーム固有:
アプリでカスタムフォント(.TTFまたは.OTF形式)を使用できます。NativeScriptランタイムは、app/fonts/(Angularを使用している場合はsrc/fonts/) ディレクトリの下でフォントファイルを探し、それらを自動的にロードします。
@import CSSルールを使用すると、ローカルファイルからCSSをインポートできます。このルールは、他のすべてのタイプのルールよりも優先する必要があります。
@import url('~/your-style.css');
NativeScriptでは、プレーンなCSSファイルの代わりにSASS CSSプリコンパイラーを使用して、アプリのスタイルを管理できます。 Webプロジェクトと同様に、SASSはスタイルシートに共有変数、ミックスイン、ネストされたスタイルタグなどの追加機能を提供します。
NativeScriptでSASSを使用するには、"node-sass"
または"sass"のようなSASSコンパイラが必要です。
このコンパイラは、NativeScriptビルドプロセスに介入し、build
およびlivesync
中に
.scss
.sass
ファイルを自動的に.css
に変換します。
SASSはビルド時にCSSにコンパイルされるため、NativeScriptの通常の規則ベースのパターンが機能するためにスタイルシートの命名規則を変更する必要はありません。
NativeScriptページと同じ名前のSASSファイルは引き続き自動的にリンクされます。
以下の例では、SASSを手動で有効にした状態で使用できます。
または、SASSがすでに有効になっているテンプレートを使用します。例えば:
NativeScript 5.x以前(レガシーを使用しているnativescript-dev-webpack)で作成されたプロジェクトの場合、
migrate
コマンドを実行してSASSコンパイラーを更新(およびレガシープラグインを削除)できます。
このmigrate
コマンドは、NativeScript CLI 6以降で使用できることに注意してください。
NativeScriptプロジェクトへのSASSサポートの追加に関する詳細については、テーマドキュメントのこのページを参照してください。