SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

基礎からはじめるReact Native入門

React Nativeでアプリの見た目を整えよう~スタイルでコンポーネントを装飾する

基礎からはじめるReact Native入門 第6回

レイアウトと装飾のためのスタイル機能(2)

StyleSheetモジュール

 スタイルはstyle属性に直接オブジェクトを記述することでも実現できますが、JSXの記述量が肥大化しやすいデメリットがあります。この問題を解決するため、React NativeではStyleSheetという、スタイルをまとめて記述するためのモジュールが提供されています。リスト2のように、StyleSheet.createを使います。

[リスト2]StyleSheetでスタイルを定義する
import { StyleSheet } from 'react-native';

const styles = StyleSheet.create({
  red: {
    color: '#FF0000',
  },
  bigBlue: {
    color: '#0000FF',
    fontSize: 24,
  },
});

 スタイルのオブジェクトに、redbigBlueといった名前を付けて管理します。これを実際のコンポーネントに適用する場合は、リスト3の形になります。

[リスト3]StyleSheetで定義したスタイルをコンポーネントに適用する
import React from 'react';
import { View, Text, StyleSheet } from 'react-native';

export default function App() {
  return (
    <View>
        <Text style={styles.red}>赤文字</Text>{/* (1) */}
        <Text style={styles.bigBlue}>大きい青文字</Text>
        <Text style={[styles.bigBlue, styles.red]}>{/* (2) */}
          大きい青文字に赤文字を上書き
        </Text>
        <Text style={[styles.red, styles.bigBlue]}>{/* (3) */}
          赤文字に大きい青文字を上書き
        </Text>
    </View>
  );
}

const styles = StyleSheet.create({
  red: {
    color: '#FF0000',
  },
  bigBlue: {
    color: '#0000FF',
    fontSize: 24,
  },
});

 リスト2で指定した名前を(1)のstyles.redの形で呼び出しています。この呼び方なら、スタイルがどんなに複雑になってもJSXには名前だけを与えればいいので、スッキリしますね。

 ただのオブジェクトとして定義した場合と比べると、少し取り回しが悪くなってしまうのが難点ですが、(2)や(3)のように配列でスタイルを並べれば、スタイルを統合して扱うこともできます。リスト3を実行すると、図2のようになります。

図2:スタイルを適用した結果
図2:スタイルを適用した結果

 配列で書いたスタイルは、後に書いたもののほうが優先して反映されます。styles.redにもstyles.bigBlueにもcolorプロパティがあるので、リスト3の(3)では後から指定された青のほうが反映され、styles.redの効果はなくなってしまったわけです。

色の指定方法

 色について指定する場合、次の値を設定できます。

  • カラー名(例:'red','blue'
  • 16進数表記のカラーコード(例:'#FF0000'
  • rgb()関数表記(例:'rgb(255, 0, 255)'
  • rgba()関数表記(例:'rgba(255, 255, 255, 1.0)'
  • hsl()関数表記(例:'hsl(360, 100%, 100%)'
  • hsla()関数表記(例:'hsla(360, 100%, 100%, 1.0)'
  • 'transparent'

 使用できるすべてのカラー名についてはドキュメントを参照してください。CSS Color Module Level 4で策定されているものについては使用できるようです。

 rgb()は、赤(Red)、緑(Green)、青(Blue)の割合を0~255の範囲で指定することで、色を表現します。

 一方hsl()は、色相(Hue)、彩度(Saturation)、輝度(Lightness/Luminance)の組み合わせで色を表現する方式です。色相は0~360の(色相環における)角度で、彩度と輝度は0~100%の割合で指定します。

 rgba()hsla()は、これらの指定方法に透明度(Alpha)の指定を追加したものです。0.0~1.0の値を指定でき、0.0が完全に透明、1.0が完全に不透明となります。

単位の指定方法

 モバイルアプリ開発では、長さや大きさの単位がよく課題になります。端末によってピクセルのサイズが違うため、長さや大きさをピクセル(px)で指定すると、端末によってボタンや文字の大きさが変わってしまうのです。

 この問題を解決するため、AndroidやiOSでは、ピクセルサイズに依存しない、現実世界での大きさを重視した、抽象化された単位を使用しています。

  • Androidの単位
    • dp:長さの単位
    • sp:フォントサイズの単位
  • iOSの単位
    • pt:長さ、フォントサイズの単位

 React Nativeのスタイル指定では、これらをさらに抽象化するために単位を付けないといった思い切った方針をとっています。

[リスト4]単位を付けずに大きさ・長さを指定する
const styles = StyleSheet.create({
  text: {
    width: 300, // Android: 300dp, iOS: 300pt
    fontSize: 24, // Android: 24sp, iOS: 24pt
  },
}

 リスト4では、長さであるwidthや文字の大きさであるfontSizeに対して、number型の数値リテラルを指定してします。これは、React Nativeがスタイルを評価してネイティブUIに翻訳する過程で、dpspptといった単位に適切に変換されるため、問題なく運用できます。逆に、pxなどの単位を付けると動かなくなるため、癖で単位を付けてしまわないよう、注意が必要です。

次のページ
レイアウトと装飾

この記事は参考になりましたか?

基礎からはじめるReact Native入門連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 中川 幸哉(ナカガワ ユキヤ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/11864 2019/12/17 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー