AIが正しくCSSを書くための設計ガイド — linear-gradientのhoverアニメーション編

に公開

AIが正しくCSSを書くための設計ガイド

こんにちは。今回は Cursor + LLM を使って、
「背景グラデーションのhoverアニメーションをCSSだけで滑らかに動かす」ための 設計ルール をまとめます。

使用ツール

  • エディタ: Cursor
  • モデル: GPT-5
  • 環境: Next.js

まずはそのまま使ってみる

Cursorに投げた最初のプロンプト

グラデーションのボタンを作って、hoverで色が変わるように実装してください。

出力結果

.btn-gradient {
  background-image: linear-gradient(
    90deg,
    #6366f1 0%,
    #a855f7 50%,
    #ec4899 100%
  );
  transition: background-image 0.3s ease;
}

.btn-gradient:hover {
  background-image: linear-gradient(
    90deg,
    #ec4899 0%,
    #f43f5e 50%,
    #fb923c 100%
  );
}

*(話をグラデーション部分に絞るため、関係しない記述は削除しています)

なにが問題?

  • background-image は画像扱いで、色が補間されず“パッ”と切り替わる(=滑らかに変化しない)。
  • transition: background を書いても色の中間をアニメーションできない。

解決策 CSS変数 + @propertyを使用

  • グラデーションの色を変数化して、hoverで変数の値だけを変える。
  • 変数を補間可能にするため、@property で型を宣言する。

ルールをプロジェクトに仕込む(.style-guide-rules.md)

CSS変数と@propertyを使用することでアニメーションできても、
毎回手書きでCSSを書くのは非効率であり。特に、複数メンバーでの開発やLLMを利用したコード生成では、ルールがなければ書き方にブレが生じます。これを防ぎ、誰が書いても同じ品質・挙動を得られるようにするため、.style-guide-rules.md に明文化しておきます。

# CSS Style Guide Rules — Gradients / Hover Animation

## 基本方針
- グラデーションの色は **CSS変数**で渡す(`--grad-*`)。
- 変数は **@property**`<color>` 型を宣言して **補間可能**にする。
- `hover` では **background-imageを変えず**、色変数だけを書き換える。
- (必要なら)色数に応じて `--grad-stop-*` を増やす。

---

## 2色グラデーション(最小構成)

### 宣言(どこか一度だけ。例:globals.css)
```css
@property --grad-start {
  syntax: "<color>";
  inherits: false;
  initial-value: #6366f1;
}
@property --grad-end {
  syntax: "<color>";
  inherits: false;
  initial-value: #a855f7;
}

ルールに従って生成されたCSS

@property --grad-start {
  syntax: "<color>";
  inherits: false;
  initial-value: #6366f1;
}
@property --grad-mid {
  syntax: "<color>";
  inherits: false;
  initial-value: #a855f7;
}
@property --grad-end {
  syntax: "<color>";
  inherits: false;
  initial-value: #ec4899;
}

.btn-gradient {
  --grad-start: #6366f1;
  --grad-mid: #a855f7;
  --grad-end: #ec4899;
  background-image: linear-gradient(
    90deg,
    var(--grad-start) 0%,
    var(--grad-mid) 50%,
    var(--grad-end) 100%
  );
  transition: --grad-start 300ms ease,
              --grad-mid 300ms ease,
              --grad-end 300ms ease;
}

.btn-gradient:hover {
  --grad-start: #ec4899;
  --grad-mid: #f43f5e;
  --grad-end: #fb923c;
}

最後に

今回紹介した「linear-gradientのhoverアニメーション」も、ルール化しておくことでLLMが一発で正しいCSSを出せるようになります。
同じように、<details> を使ったアコーディオンアニメーションや grid / subgrid の実装方法など、LLMが標準では出力しにくいCSS設計パターンはまだまだあります。
次回以降は、そういった「LLMが出しにくいHTML / CSS」の実装を中心に、ルールと具体例を解説していきます。

Discussion