本文へ移動

ホーム / デザイナー / 第3部 デザインシステムと実装

第3部 デザインシステムと実装・第7章

コンポーネント

★★☆ 重要6トピック・面接 3問

ボタン・入力欄・カードなどの部品(コンポーネント)は、デザインとコードをつなぐいちばん大事な単位です。この章では、Figma の部品とコードの部品の対応、部品の状態、組み合わせ方、アイコン、Storybook を押さえます。

ひとことで

ボタン・入力欄などを、状態と種類(バリアント)ごとに部品として定義する。

コンポーネントは、ボタン・入力欄・カードなど、何度も使う部品です。Figma のコンポーネントと、コードのコンポーネント(React・SwiftUI・Jetpack Compose など)が1対1で対応していると、デザインがそのまま実装に移せます。

コードのコンポーネントは props(外から渡す設定)で見た目や動きを変えます。Figma のバリアントやプロパティの名前と値を、props にそろえるのがこつです。

Figmaコード(例)注意
バリアント:Type = Primary / Secondaryvariant="primary"名前と値の綴りまでそろえる
バリアント:Size = S / M / Lsize="md"サイズは数を絞る
真偽のプロパティ:アイコンありicon={...}「あり・なし」ではなく何を入れるか
State = Disabled / Loadingdisabled・loading渡す値になる状態
State = Hover / Pressed / Focus(props ではない)操作でブラウザや OS が切り替える。見た目だけ決める
操作で自動に変わる:見た目だけ決めるコードから渡す(props)通常ホバー押下無効処理中PrimarySecondary保存保存保存保存保存保存保存保存保存中…保存中…<Button variant="primary" disabled>保存</Button>Figma のバリアント(Type・State)と props の名前・値をそろえる
ボタンのバリアントと状態。ホバー・押下は操作で、無効・処理中は props で切り替わる

ホバー・押下・フォーカスは、props ではなく操作で自動的に変わる状態です。デザインでは全部の見た目を決めますが、エンジニアに「この状態を渡す」設定はありません。一方、無効・処理中・エラーはコードから渡す状態です。この違いを知っておくと、バリアントの作り方が実装に近づきます。

面接ではこう答える

コンポーネントは、ボタンや入力欄のように何度も使う部品です。Figma のコンポーネントとコードのコンポーネントが1対1で対応していると、デザインがそのまま実装に移せます。そのために、Figma のバリアントやプロパティの名前と値を、コードの props にそろえます。例えば Type = Primary なら variant="primary" です。ホバーや押下のように操作で変わる状態は props ではないので、見た目だけ決める、という区別もしています。

ひとことで

部品には、通常・ホバー・押下・フォーカス・無効・処理中・選択中・エラーなどの状態がある。操作で変わる状態と、コードから渡す状態を分けて考える。

ボタンの操作の状態(どれも見た目を決める)保存通常保存ホバー保存押下保存フォーカス保存無効保存中…処理中ホバー・押下・フォーカス:操作でブラウザや OS が切り替える無効・処理中:コードから渡す(props)
部品の操作の状態

部品の状態は、全部の見た目をデザインで決めます。そのうえで、どの状態が操作で自動的に変わるもので、どれがコードから渡すものかを知っておくと、バリアントの作り方が実装に近づきます。

状態切り替わり方デザインの注意
ホバーマウスを乗せたとき(タッチにはない)ホバーだけに情報を載せない
押下押している間押した手応えが分かる程度の変化
フォーカスキーボードの Tab などで選んだときはっきり見える枠。背景とのコントラスト 3:1 を目安に
無効コードから渡すなぜ押せないか分かるか。押せないより、押して理由を示すほうがよい場面も
処理中コードから渡す二重に押せないように。文言を「保存中…」に
選択中・エラーコードから渡す色だけでなく印や文言でも示す

面接ではこう答える

ボタンなどの部品には、通常・ホバー・押下・フォーカス・無効・処理中といった状態があり、デザインでは全部の見た目を決めます。このうちホバー・押下・フォーカスは、ユーザーの操作でブラウザや OS が自動的に切り替えるもので、無効や処理中はコードから props として渡すものです。フォーカスはキーボードで操作する人が今どこにいるかを知る手がかりなので、消さずにはっきり見える形にします。無効の状態は、なぜ押せないかが分かるようにするかもあわせて考えます。

ひとことで

部品の中に「好きな中身を入れる場所」を作り、小さな部品を組み合わせて大きな部品を作る。バリアントを増やしすぎない方法。

部品の中身を差し替えられるようにする(スロット)カード(外側の部品)見出しの場所中身の場所(何でも入る)文章画像+説明ボタンの並び
外側の部品と、差し替えられる中身の場所

「アイコンあり・なし」「ボタン1つ・2つ」「画像あり・なし」……と全部をバリアントにすると、組み合わせの数がすぐに数十になります。代わりに、外側の部品に中身を入れる場所を作り、小さな部品を組み合わせる方法があります。

やり方Figmaコード(例)
決まった種類から選ぶバリアントvariant="primary"
中の部品を差し替えるインスタンスの差し替え(Instance swap)アイコンなどの部品を props で渡す
好きな中身を入れる中身の場所を空けておく・差し替え用の部品部品の中に子の部品を入れる(React の children など)
文字を変えるテキストのプロパティ文字を props で渡す

どこまでを部品が決め、どこからを使う側に任せるかの線引きが大事です。自由にしすぎると画面ごとに見た目がばらばらになり、固めすぎるとバリアントが増えます。よく使う形はバリアントに、まれな形は組み合わせで、が目安です。

面接ではこう答える

部品を作るとき、すべての組み合わせをバリアントで用意すると、数が増えすぎて管理しきれなくなります。そこで、カードのような外側の部品に、見出しの場所や中身の場所を作っておき、そこに文章や画像、ボタンの並びなどの小さな部品を入れて組み合わせます。コードでも、部品の中に別の部品を入れる作りが一般的です。Figma ではインスタンスの差し替えなどで同じ考え方を表せるので、デザインとコードの構造をそろえやすくなります。

ひとことで

コードの部品を、状態ごとに1つずつ並べて見られる道具。「ストーリー」1つが1つの状態にあたる。

Storybook:部品を状態ごとに並べて確かめる部品の一覧ButtonPrimarySecondaryDisabledLoadingTextFieldCardButton / Disabled保存props を画面で変えて試せる幅を変えて崩れを見る読み上げのチェックも
Storybook の画面のイメージ

Storybook は、コードのコンポーネントを1つずつ、状態ごとに並べて見られる道具です(Web で広く使われています)。「ストーリー」1つが1つの状態にあたります。デザイナーは Storybook を見て、実装された部品がデザインどおりか、全部の状態がそろっているかを確かめられます。新しい部品をデザインするときも、まず Storybook に似た部品がないかを探すと、作らなくてよい部品に気づけます。

Storybook でできることデザイナーの使い道
状態ごとの部品を見る無効・処理中・エラーなど、全部の状態がそろっているか確かめる
props を画面で変える長い文言・アイコンあり・なしで崩れないか試す
幅を変える狭い幅での見え方を確かめる
アクセシビリティのチェック(追加機能)コントラスト不足などを自動で見つける
部品の一覧新しい部品を作る前に、似たものがないか探す

面接ではこう答える

Storybook は、コードで作った部品を、状態ごとに1つずつ並べて見られる道具です。Web の開発で広く使われていて、ストーリー1つが、例えば無効のボタンや処理中のボタンのような1つの状態にあたります。デザイナーは、実装された部品がデザインどおりか、全部の状態がそろっているかを、画面全体を動かさずに確かめられます。新しい部品をデザインする前に Storybook で似た部品を探すと、作らなくてよい部品に気づけます。

ひとことで

アイコンは決まった大きさの枠と線の太さで描き、SVG で渡す。アイコンだけのボタンには読み上げ用の名前を付ける。

アイコンは決まった枠の中で描き、SVG で渡す24×24 の枠(例)の中で、線の太さをそろえて描くSVG なら大きさを変えてもくっきり色はコードから変えられるように(単色)押せるアイコンは、押せる範囲を 44pt・48dp 以上に
アイコンの作り方の例
決めること理由
枠の大きさ(16・20・24 など)並べたときに大きさと位置がそろう
線の太さ・角の丸みアイコンの雰囲気がそろう
単色で作るコードから色をトークンで変えられる(ダークモードにも対応)
名前の付け方icon/search のように、形ではなく意味で名前を付けると探しやすい
読み上げの名前アイコンだけのボタンには「検索」「閉じる」などの名前を注釈で
飾りのアイコン文字と並んで意味が重なるアイコンは、読み上げで飛ばす指定にする

公開されているアイコンのセット(Material Symbols など)を使う場合は、ライセンスと、どの太さ・スタイルを使うかをチームで決めます。独自のアイコンと混ぜるときは、線の太さと枠をそろえます。

面接ではこう答える

アイコンは、24×24 のような決まった大きさの枠の中で、線の太さや角の丸みをそろえて描きます。SVG で渡すと、大きさを変えてもくっきり表示され、単色にしておけばコードから色をトークンで変えられます。アイコンだけのボタンは、見た目には名前がないので、読み上げ用の名前を注釈で決めて渡します。押せるアイコンは、見た目が小さくても押せる範囲を 44pt や 48dp 以上にするよう伝えています。

小さな部品から組み立てる(Atomic Design の考え方)原子ボタン・アイコン分子検索欄有機体ヘッダー・一覧テンプレート画面の骨組みページ実データの画面デザインシステムで持つのは主に原子〜有機体。テンプレートより上は画面ごと
部品の大きさの段階(Atomic Design)

部品をどの大きさで分けるかの考え方として、Brad Frost が提唱した Atomic Design がよく知られています。小さな部品(原子)を組み合わせて、大きな部品・画面を作るという考え方です。

段階例誰が持つか
原子(Atoms)ボタン・入力欄・アイコン・ラベルデザインシステム
分子(Molecules)入力欄+ボタンの検索欄デザインシステム
有機体(Organisms)ヘッダー・商品カードの一覧デザインシステムか、各プロダクト
テンプレート・ページ画面の骨組みと実際の画面各プロダクトの画面

段階の名前を厳密に守る必要はありません。大事なのは、Figma のライブラリとコードの部品の分け方と名前をそろえることです。デザインでは1つの部品なのに、コードでは3つの部品の組み合わせ、となっていると、受け渡しのたびに読み替えが必要になります。

この章のまとめ

🖨 まとめシート(印刷・PDF)
  • Figma のバリアント・プロパティの名前と値を、コードの props にそろえる
  • ホバー・押下・フォーカスは操作で変わる状態、無効・処理中はコードから渡す状態
  • Storybook で実装された部品を状態ごとに確かめ、作らなくてよい部品に気づく

この章のクイズ

面接ではこう聞かれる

まず答えを見ずに声に出して答え、そのあと開いて比べる。

Q1Figma のコンポーネントとコードのコンポーネントを、どうやって対応させていますか?

模範回答

バリアントやプロパティの名前と値を、コードの props にそろえます。例えば Figma で Type = Primary / Secondary、Size = S / M / L とするなら、コードでも variant と size に同じ値を使います。

注意するのは、ホバーや押下のように操作で自動的に変わる状態と、無効や処理中のようにコードから渡す状態を分けて考えることです。前者は見た目だけを決め、後者は props になります。実装された部品は Storybook で状態ごとに見て、デザインとずれていないか、状態がそろっているかを確かめます。

深掘りされたら

  • Storybook はどのように使っていますか?

見られているポイントprops とバリアントの対応、状態の種類

Q2デザインシステムにない部品が必要になったら、どうしますか?

模範回答

まず、本当に新しい部品が要るのかを確かめます。既存の部品の組み合わせやバリアントの追加で済むことが多く、Storybook や Figma のライブラリで似たものを探します。

それでも必要なら、その画面だけの部品として作るか、デザインシステムに加えるかを、ほかの画面でも使う見込みで決めます。加える場合は、状態とバリアントをそろえ、トークンで値を指定し、エンジニアとレビューしてから Figma とコードの両方に入れます。一度だけの例外をそのまま増やすと、似た部品が並んで使われなくなるので、例外にした理由も残しておきます。

深掘りされたら

  • 使われなくなった部品は、どう整理しますか?

見られているポイント既存の再利用を先に考え、追加の手順がある

Q3アイコンだけのボタンをデザインするとき、何を決めて渡しますか?

模範回答

3つあります。1つ目は読み上げ用の名前です。見た目には文字がないので、「閉じる」「検索」などの名前を注釈で決めて渡します。2つ目は押せる範囲で、アイコンが 24 の大きさでも、押せる範囲は iOS で 44pt、Android で 48dp 程度を目安に広げてもらいます。

3つ目は状態で、ホバー・押下・フォーカス・無効の見た目と、意味が伝わりにくいアイコンなら、文字のラベルを添えるかどうかです。アイコン自体は単色の SVG で渡して、色はトークンで変えられるようにしています。

深掘りされたら

  • アイコンに文字のラベルを付けるかどうかは、どう判断しますか?

見られているポイント読み上げ・押せる範囲・状態を、見た目と一緒に渡しているか