ReactNativeアプリでスタイリングを使用する方法
序章
React Nativeを使用する場合、デフォルトではHTMLとCSSをWebアプリケーションとして使用しません。
実際、箱から出してすぐに、すべてがFlexboxに基づいて自動的にスタイル設定されます。
この記事では、ReactNativeアプリケーションにスタイリングを適用する方法を紹介します。
前提条件
この記事をフォローしたい場合は、次のものが必要になります。
- CSSのプロパティと値の使用に精通していること。
- ReactNativeでのJSX構文の使用に精通していること。
StyleSheet
を使用する
React Nativeスタイリングについて最初に知っておくべきことは、StyleSheet
コンポーネントを使用することです。
まず、次のようにインポートします。
import { StyleSheet } from 'react-native';
その後、次のように使用できます。
const styles = StyleSheet.create({ container: { height: 100 } })
次に、次のようにコンポーネントを適切にスタイル設定するために追加します。
<View style={styles.container}></View>
次のように、インラインルートを使用することもできます。
<View style={{height: 100}}></View>
このコードでも同じ結果が得られます。
ピクセルの処理
height: 100
の100
にユニットが表示されていないことに気付いたかもしれません。 px
、vm
などの書き方に慣れているかもしれません。 そして問題は、React Nativeでデフォルトで使用されるユニットは何ですか?
これは非常に複雑な質問であり、回答するのに複数の記事が必要です。 iOSの場合、これらは「論理的なポイント」であり、AndroidはDIPを使用します。 これには多くの理由があり、なぜこれが選ばれたのかについての論理もあります。 同じ画面サイズには、さまざまな画面サイズとさまざまな解像度があります。 したがって、通常のピクセルを使用した場合、一部の電話ではピクセル化されたように見えます。 しかし、「ポイント」の背後にある考え方は、ピクセル密度の高い高解像度の画面でも、低解像度の画面と同じように見えるようにすることです。
完璧ではありませんが、プラットフォーム間でほぼ同じように見えます。 height
、width
、borderWidth
などが画面上でどのように表示されるかを決定するために舞台裏で行われる計算があります。
'auto'
またはパーセンテージを使用することもできますが、次のように引用符で囲みます。
<View style={{ height: '100%' }}></View>
このコードは、フルハイトView
を生成します。
画面全体をラップする
ここで、<View>
を設定して画面全体に表示することについて知っておくべきことの1つは、iPhone Xのような電話の画面の一部がユーザーインターフェイス(UI)で覆われていることです。 通常、要素を配置する画面の一部は、画面の覆われた部分の下に非表示になります。
このためには、ReactNativeコンポーネント<SafeAreaView>
を使用して残りのコンポーネントをラップすると、すべての画面が確実に表示されます。
または、flex: 1
を使用することもできます。
React NativeはデフォルトでFlexboxを使用するため、display: flex
の適用について心配する必要はありません。 また、デフォルトでflexDirection
がrow
に設定されているWebバージョンとは異なり、ReactNativeは[X11X]に設定されたflexDirection
を使用します。 スタイルをflex: 1
に設定すると、コンポーネントにflex-grow
が適用され、Flexboxコンテナの主軸全体を占有します。
どちらのアプローチでも、コンテンツが表示されたままになります。
マージンとパディングの追加
Webでは、margin
およびpadding
の省略形を使用できます。
ただし、React Nativeには、マージンとパディングを適用するための追加のスタイリングヘルパーがあります。
たとえば、要素に20の上下マージンを与えるには、次のように設定できます。
<View style={{marginVertical: 20}}></View>
上部と下部にパディングを付けることもできます。
<View style={{paddingVertical: 20}}></View>
「垂直」のヘルパーに加えて、「水平」のヘルパーもあります:paddingHorizontal
およびmarginHorizontal
。
マージンとパディングの終わりにタグ付けできる「開始」と「終了」もあります。 スタイルに「開始」と「終了」が表示されている場合は常に、これらがコンテナのflexDirection
に依存していることがわかります。
flexDirection
がrow
の場合、marginStart
はmarginLeft
のように動作します。
flexDirection
がrow-reverse
の場合、marginStart
はmarginRight
のように動作します。
また、「開始」と「終了」はmarginLeft
とmarginRight
、paddingLeft
とpaddingRight
をオーバーライドすることに注意してください。
影と境界線の追加
CSSの通常のborder
スタイルは、ReactNativeスタイルでは使用できません。 borderColor
とborderWidth
に分解する必要があります。 これらの2つが示されているので、境界線を作成するのに十分です。 また、どちらの側がどの色と幅を受け取るかを選択できます。
borderRadius
もありますが、これは、ご存知のとおり、各コーナーに半径を与えます。 top-start
、top-end
、bottom-start
、またはbottom-end
を使用して、borderTopStartRadius: 20
のように個々の半径を選択するか、次のように使用できます。より簡単なtop-left
、top-right
など。
最後に、borderStyle
を使用して、破線、点線、または実線の境界線から選択できます。
React Nativeのシャドウに関しては、使い慣れたbox-shadow
を使用することはありません。
代わりに、React Nativeには、iOSでのみ機能するスタイルがあります。
shadowOffset: { height: 3, width: 3 }, shadowColor: '#000000', shadowOpacity: 0.5, shadowRadius: 5
古いバージョンのAndroidには、ReactNativeを使用した優れた組み込みソリューションはありません。 elevation
プロパティを設定できますが、これはカスタマイズできず、border
やbackground-color
などの他のスタイルではうまく機能しません。
プラットフォーム間の違いの処理
前のセクションでは、プラットフォーム間の最初の大きな違いを確認しました。1つにはシャドウスタイルがありますが、もう1つにはありません。 良い点は、上記の例では、Androidがサポートしていないスタイルを単に無視することです。 動作しませんが、少なくともエラーは発生しません。 これは、プラットフォームでサポートされていないすべてのスタイルに当てはまります。無視されます。
ただし、完璧でクリーンなスタイルであっても、プラットフォームごとに外観にかなりの違いが見られます。
プラットフォーム間でスタイルを同じに保つために、ReactNativeからPlatform
コンポーネントをインポートしましょう。
import { View, StyleSheet, Platform } from 'react-native'; {/* ... */} <View style={styles.container}></View> {/* ... */} const styles = StyleSheet.create({ container: { height: Platform.OS === 'android' ? 100 : 20, backgroundColor: Platform.OS === 'ios' ? 'yellow' : 'blue', ...Platform.select({ ios: { width: 100 } }) } })
ここで、プラットフォーム固有のスタイルを設定する2つの異なる方法に注意してください。 三項演算子を使用して、style
小道具の後に1つの方法があります。
height: Platform.OS === 'ios' ? 100, 20
これはほとんどの状況でうまく機能しますが、1つのプラットフォームでスタイルを設定したくない場合はどうでしょうか。 そこで登場するのが...Platform.select()
です。 これにより、1つのプラットフォームのみ、または両方でスタイルを指定できます。
...Platform.select({ ios { width: 100 }, android: { width: 75 } })
このコードは、iOSプラットフォームの場合はwidth
の100
を定義し、Androidプラットフォームの場合はwidth
の75
を定義します。
結論
この記事では、ReactNativeアプリケーションにスタイリングを適用する方法を紹介しました。
React Nativeでは、基本的にすべての要素がすべてのスタイルを使用できるWebとは異なり、スタイルはコンポーネントごとに異なることに気付くでしょう。
テキストコンポーネントのスタイルプロップの公式ReactNativeドキュメント。 それはウェブ上で利用可能なプロパティの完全な幅を持っていません。 また、 Button などの一部のコンポーネントには、style
プロップさえありません。
は、 <TouchableOpacity>
や、もちろん<View>
のようなコンポーネントを使用することもできます。これらのコンポーネントには、ほとんどのスタイリングプロップが用意されています。 または、styled-components
ライブラリをインポートして、通常のCSSを使用することもできます。