SHOEISHA iD

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

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

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

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

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

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

Flexboxでレイアウトする

 Flexboxは、UIをある方向に並べるという、ブラウザの世界にありそうでなかった仕様を実現するために用意されたCSSプロパティ群です。YogaというレイアウトエンジンはFlexboxの解釈と再現を目的に作られたため、React NativeのスタイルでもFlexboxが多用されます。リスト4のように、横に並べた要素が自動で折り返す処理なども、比較的容易に記述できます。

[リスト4]アイテムを並べる
import React from 'react';
import { View, Text, StyleSheet } from 'react-native';

export const Flexbox = () => (
  <View style={styles.container}>
    <Text style={styles.item}>Item 1</Text>
    <Text style={styles.item}>Item 2</Text>
    <Text style={styles.item}>Item 3</Text>
    <Text style={styles.item}>Item 4</Text>
    <Text style={styles.item}>Item 5</Text>
    <Text style={styles.item}>Item 6</Text>
  </View>
);

const styles = StyleSheet.create({
  container: {
    // display: 'flex' // デフォルトでflexなので指定しない
    flexDirection: 'row', // (2) 横方向に並べる
    flexWrap: 'wrap', // (3) 折り返す
  },
  item: {
    // (1) 100x100の正方形を作る
    width: 100,
    height: 100,
    // 見やすいように枠線をつける
    borderWidth: StyleSheet.hairlineWidth,
    borderColor: '#bbb'
  }
});

 (1)で100 x 100の正方形に加工したTextコンポーネントを、(2)の指定で横方向に並べます。縦で持ったときのスマートフォンでは、正方形を横方向に6つも並べられないので、(3)の指定で折り返しを許可しています。リスト4のコンポーネントを表示すると、図6のようになります。

図6:Flexboxを用いたレイアウト
図6:Flexboxを用いたレイアウト

 指定したとおり、親要素の中に子要素が入りきらないと判断した時点で、折り返す処理が行われています。多様な画面サイズに対応することが求められるスマートフォンアプリでは、とてもうれしい挙動です。

Flexboxのプロパティ

 React Nativeでは、次のプロパティが用意されています。

  • flexBasis:子要素の幅を指定する
  • flexGrow:子要素をどの程度伸ばしてもよいかを指定する
  • flexShrink:子要素をどの程度縮めてもよいかを指定する
  • flex:flexShrink: 1, flexBasis: 0を前提としたflexGrowを指定する
  • flexDirection:子要素を並べる方向を指定する
  • flexWrap:子要素を親要素の端で折り返すかどうかを指定する
  • justifyContent:子要素をflexDirectionの方向でどちらに寄せるかを指定する
  • alignContent:子要素をflexDirectionの垂直方向でどちらに寄せるかを指定する
  • alignSelf:子要素1つ分の中身をflexDirectionの垂直方向でどちらに寄せるかを指定する
  • alignItems:子要素すべての中身をflexDirectionの垂直方向でどちらに寄せるかを指定する

 React Nativeで使えるFlexbox仕様の多くは、ブラウザと共通です。ただし、スマートフォンアプリを開発することに主眼を置いた環境であることから、次のプロパティについてはデフォルトの設定がブラウザと異なります。

  • display: 'flex'が暗黙に指定されている
  • flexDirection: 'column'が暗黙に指定されている(ブラウザはrowがデフォルト)

 この2点があることで、「コンテンツを上から下に並べる」というレイアウトについては、スタイルを指定せずに実現できます。

absoluteやpositionでレイアウトする

 React Nativeのレイアウトは、基本的にはFlexboxで組んでいくことになります。しかし、マテリアルデザインのFloating Action Buttonのように、画面の右下に重なって配置するボタンを、Flexboxだけで実現するのは困難です。こういった場合に便利なのが、CSSにおける位置の指定方法である、position: 'absolute'です(リスト4)。

[リスト5]position: absoluteを使う
import React from 'react';
import { View, StyleSheet, SafeAreaView } from 'react-native';
import { WidthHeight } from './WidthHeight';
import { MarginPadding } from './MarginPadding';
import { Flexbox } from './Flexbox';

export default function App() {
  return (
    <SafeAreaView style={styles.container}>
      <View style={styles.container}>
        <WidthHeight />
        <MarginPadding />
        <Flexbox />
        <View style={styles.button} />{/* (1) */}
      </View>
    </SafeAreaView>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
  },
  button: {
    // 100x100の赤いビュー
    width: 100,
    height: 100,
    backgroundColor: 'red',
    // (2) 右下に配置する
    position: 'absolute',
    right: 16,
    bottom: 16,
  }
});

 (1)のビューをFloating Action Buttonに見立てて、(2)の指定で画面の右下に表示します。実際に表示したのが以下です(図7)。

図7:絶対指定でビューを表示する
図7:絶対指定でビューを表示する

 右下に赤い四角が表示されました。使いどころはあまり多くはありませんが、画面内で場所を固定したい表示がある場合は力を発揮するので、ぜひ覚えておきましょう。

まとめ

 前回と今回の2回に分けて、React Nativeのスタイルについて解説しました。レイアウトエンジンであるYogaが、CSSのプロパティの多くを再現するおかげで、CSSの知識を用いてモバイルアプリのUIを組み上げることが可能です。細かい使い方を調べる場合には、世の中のブラウザ向けのブログ記事が助けになるでしょう。次回はUIライブラリを使って、手軽に美しいUIを作り出す方法を解説します。

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
基礎からはじめる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/11957 2020/02/17 11:00

イベント

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

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

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

メールバックナンバー