0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

画像を自然言語でAIに渡してCSSを生成させる実践フロー

0
Posted at

はじめに

デザイナーが作ったFigmaや参考画像を見ながら、ピクセル単位でCSSを書き起こす作業——地味に時間を食います。色を拾い、余白を測り、フォントサイズを当てはめて……。

最近はAI(Claude、GPT-4o、Gemini など)のマルチモーダル能力が十分実用的になってきたので、画像を渡して「これをCSSにして」と頼むフローを実務に組み込んでいます。ただ、ただ画像を投げるだけでは精度がイマイチ。自然言語での補足と適切なプロンプト設計をセットにすると、一気に使える出力になります。

この記事では、自分が普段使っている画像→CSS生成のフローとプロンプトのコツを紹介します。

想定読者

  • フロントエンドエンジニアで、デザインカンプ起こしに時間がかかっていると感じている人
  • AI(特にClaude CodeやCursor)を日常的に使っている人
  • プロンプトをそのままコピペして試したい人

全体フロー

┌─────────────────┐
│ 1. 画像を用意    │  Figma書き出し / スクショ / 手描きラフ
└────────┬────────┘
         ↓
┌─────────────────┐
│ 2. 文脈を言語化   │  どこの、何のための、どういう状態のUIか
└────────┬────────┘
         ↓
┌─────────────────┐
│ 3. プロンプトで   │  制約・トークン・出力形式を指定
│    制約を渡す     │
└────────┬────────┘
         ↓
┌─────────────────┐
│ 4. 生成・検証     │  ブラウザで確認 → 差分を自然言語でフィードバック
└─────────────────┘

ポイントは**「画像だけ投げない」**こと。画像はあくまで入力の一部で、自然言語での補足がないとAIはプロジェクトの文脈を知らないので、浮いたCSSが出てきます。

各ステップの詳細

1. 画像を用意する

準備する画像は以下のいずれか。

  • Figmaからフレーム単位でPNG書き出し(2x推奨)
  • 実装済みの参考サイトのスクショ
  • 手描きのラフをスマホで撮ったもの

コツ: 余計な領域を含めず、対象コンポーネントだけをトリミングすること。周囲のUIが写っていると、AIがそちらに引きずられて意図しないCSSを返してくることがあります。

2. 文脈を言語化する

ここがいちばん効きます。画像に写っていない情報を先にテキストで渡す。具体的には以下。

  • どこの画面のなにか(例: ダッシュボードの通知カード / ランディングのヒーローセクション)
  • インタラクション状態(デフォルト / hover / active / disabled)
  • レスポンシブの扱い(モバイルファースト / PCのみ / ブレークポイント)
  • 既存のデザイントークン(CSS変数、Tailwindのテーマ、既存スタイルガイドなど)

これを書かないと、AIは「それっぽい汎用CSS」を返してきます。

3. プロンプトで制約を渡す

ここでテンプレを使います。以下のプロンプトをベースに、案件ごとにトークンや制約を差し替えて使っています。

汎用プロンプト(コピペ用)

添付した画像のUIをCSSで再現してください。

## コンテキスト
- 画面: {どこの画面}
- コンポーネント名: {コンポーネント名}
- 状態: {デフォルト / hover / active など}
- 対象ブラウザ: {モダンブラウザのみ / IE11対応 など}

## 技術スタック
- CSSフレームワーク: {Tailwind v4 / CSS Modules / 素のCSS など}
- 既存のデザイントークン:
  ```css
  --color-primary: #0066ff;
  --color-bg: #ffffff;
  --radius-md: 8px;
  --space-4: 16px;
  --font-sans: "Inter", sans-serif;
  ```

## 出力ルール
- 既存のデザイントークンがあればそれを優先して使う
- トークンにない値のみ生の数値で書く(その際はコメントで理由を付ける)
- マジックナンバーは避け、rem / em / % を適切に使い分ける
- フォントサイズは画像から推定し、rem換算で記述
- hoverやfocusなどのインタラクション状態も推測して含める
- 実装後のHTML構造も提示する

## 出力形式
1. 推定したデザインの要約(3〜5行)
2. HTML
3. CSS
4. 採用した値の根拠(色・余白・フォントサイズの推定理由)

ポイントは最後の「採用した値の根拠」。これを出させることで、AIがどう画像を読み取ったかが可視化され、ズレの修正が一発でできます。

4. 生成・検証・フィードバック

出てきたコードをそのままブラウザに貼って確認します。だいたい8割くらいの精度なので、残り2割を自然言語でフィードバックします。

フィードバック時のコツは**「どう違うか」を具体的に言語化すること**。

悪い例:

もっといい感じにして

良い例:

ボタンの角丸が強すぎます。画像だと4pxくらいに見えますが、12pxで出力されています。
また、アイコンとテキストの間隔が狭いので、8px → 12pxに広げてください。
hoverで背景が暗くなる挙動も追加してほしいです(画像の右側の状態を参照)。

画像の中でどの部分を指しているかを明示すると、さらに精度が上がります。

実例: カード型の通知コンポーネント

実際に手元でやったときの流れを紹介します。

入力した自然言語

添付画像はSaaS管理画面の「未読通知カード」です。

## コンテキスト
- 画面: ダッシュボード左サイドの通知リスト内の1アイテム
- 状態: 未読(左端に青いドット / 背景が薄い青)
- 既読時は背景が透明になり、ドットが消える想定

## 技術スタック
- Tailwind CSS v4
- 既存トークン: primary-500 (#2563eb), neutral-50 (#f9fafb), neutral-900 (#111827)

## 出力ルール
- Tailwindクラスで記述(任意値[]は最小限)
- 未読・既読の両方をdata属性で切り替えるHTML構造
- 根拠も添えて

AIから返ってきた出力(抜粋)

<article
  data-read="false"
  class="group relative flex gap-3 rounded-lg bg-blue-50 p-4 transition-colors
         hover:bg-blue-100 data-[read=true]:bg-transparent"
>
  <span
    class="mt-1.5 h-2 w-2 shrink-0 rounded-full bg-primary-500
           group-data-[read=true]:hidden"
    aria-hidden="true"
  ></span>
  <div class="flex-1 min-w-0">
    <p class="text-sm font-medium text-neutral-900">新しいコメントが届きました</p>
    <p class="mt-0.5 text-xs text-neutral-500">2分前 · プロジェクトA</p>
  </div>
</article>

根拠の出力例

  • 背景色: bg-blue-50 → 画像の背景は彩度の低い薄青で、neutral-50より明らかに青寄り
  • パディング: p-4 (16px) → ドットとテキストの余白、カード端の余白からおおよそ16pxと推定
  • ドットサイズ: h-2 w-2 (8px) → 相対的にテキスト1文字分の高さの半分程度
  • gap: gap-3 (12px) → ドットとテキストの距離がドットの1.5倍程度

この根拠があると、「ドットのサイズだけ10pxにしてほしい」みたいな微調整がやりやすい。

うまく使うためのTips

トークンを先に食わせる

デザインシステムがあるプロジェクトでは、先にトークン一覧をプロンプトに含めるのが必須。そうしないと生の#2563ebみたいな値が出てきて、あとで全部置換する羽目になります。

Claude CodeならCLAUDE.md.cursor/rulesにトークンを書いておくと、毎回コピペしなくて済みます。

画像を複数枚渡す

  • デフォルト状態 + hover状態の2枚
  • デスクトップ + モバイルの2枚
  • ライトモード + ダークモードの2枚

複数枚渡すと、AIが状態間の差分を読み取ってくれるので、CSS変数の設計まで提案してくれます。

苦手なものを知る

AIは以下の要素が苦手です。

  • フォントの特定: 画像だけから「これはInter」「これは游ゴシック」を当てるのは無理。フォント名は必ず明示する
  • 厳密なピクセル値: 1〜2px単位の誤差は出る前提で、あとから微調整する
  • 複雑なグラデーション: 方向と色は合うが、角度や停止位置のズレが出やすい
  • z-index: 画像から重なり順を正確に読み取れない。構造で補足する

検証を自動化する

生成したCSSをそのまま信用せず、Storybookやプレビュー環境でデザインと並べて表示して差分を見る運用が安全です。Playwrightでスクショを撮ってdiffをとる、みたいなところまでやるプロジェクトもあります。

おわりに

AIに画像からCSSを生成させるのは、「ベテランの実装者によくあるUIをサクッと書いてもらう」のに近い感覚です。完璧を期待せず、8割を爆速で作って2割を人間が調整するくらいの分担がちょうど良い。

プロンプトのテンプレ化、デザイントークンの事前共有、そして具体的な自然言語フィードバック——この3つを意識するだけで、体感の生産性が大きく変わります。

もし同じようなフローでやってる方がいたら、プロンプトの工夫をコメントで教えてもらえると嬉しいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?