🛡️ これはなに?

「コードが複雑化して修正できなくなる」問題を解決するための、Antigravityとの約束事(鉄の掟)です。
17個のルールを10個に整理し、実用的で覚えやすいルールセットにしました。

1. モバイルファースト(小は大を兼ねない!)

「まずスマホ版のデザインを先に書く」。これだけでコード量は半分になります。

NG: Webファースト

デスクトップ版を先に作ると、スマホ版で「打ち消し」のコードが大量に必要になります。
padding: 0; border: none; flex-direction: column;
↑こんなコードが増えたら要注意です。

OK: モバイルファースト

スマホ版をベースにすれば、デスクトップ版は「追加」だけで済みます。
「スマホでシンプルな形を作る」→「画面が広かったら横並びにする(@media)」

2. 単一の情報源(One Source of Truth)

同じ内容を2箇所に書かない。必ず1箇所だけに定義する。

原則:元の場所を直接修正

NG:継ぎ足し方式

既存のコードには触らず、一番下に新しいCSSを書いて上書きする。
→ どこが有効なのか分からなくなり、管理不能になります。

OK:元の場所を直接修正

勇気を出して、元の記述を書き換える。
ファイル内検索(Ctrl+F)を使って、該当箇所の元の記述を探し出し、そこを直接修正します。

具体例:インラインCSS vs 外部CSS

NG:重複定義

index.html のインラインCSSと renewal.css の両方に同じクラスを定義する。
→ 修正時に両方を直さないと不整合が発生し、デザインが崩れます。

OK:役割を明確に分離

インラインCSSに書いて良いもの

  • @font-face 定義
  • ✅ CSS変数(:root
  • ✅ 基本レイアウト(html, body

外部CSSのみに書くべきもの

  • ❌ コンポーネントスタイル(.section-badge, .cta-buttonなど)
  • ❌ レスポンシブルール(@mediaクエリ)
  • ❌ アニメーション(@keyframes

CSS修正ワークフロー:
① 外部CSS(renewal.css)を直接修正
.min.css に同期:Copy-Item -Force "css\renewal.css" "css\renewal.min.css"
③ インラインCSSは絶対に触らない(フォント定義や変数以外)

3. Flexbox/Grid優先、絶対配置は装飾のみ

コンテンツ(文字や画像)を position: absolute で無理やり配置するのはやめましょう。

OK

中身の配置は必ず FlexboxGrid を使います。
absolute「背景の赤い丸」や「装飾アイコン」 など、崩れても読めるものだけに限定します。

4. セクションは独立させる(padding内完結)

求人LPは「先輩の声を上にしたい」「募集要項を最後にしたい」など、頻繁な並び替えが発生します。

OK

各セクションは上下に依存する余白(margin-top/bottom)を持たせない。
自分の内側の余白(padding)だけで完結させる。
→ これなら、どの順番に入れ替えてもレイアウトが崩れません。

5. !importantとインラインスタイル禁止

!important を使いたくなったら、それはCSSの設計が破綻しかけている合図です。

NG

width: 100% !important;
これを使うと、後で「やっぱり変更したい」と思った時に、誰も修正できなくなります。

OK:解決策
  • :where() セレクタでベーススタイルを定義(詳細度を上げない)
  • HTMLのクラス名を見直す
  • セレクタの強さ(詳細度)を整理する

🔄 実践:無限修正ループからの脱出

今回のセッションで実際に起きた「試行錯誤→重複→文字化け」の悪循環を防ぐための必須ルール

6. Git必須+段階的確認

「ちょっと試してみる」が取り返しのつかない事態を招きます。

①変更前に必ずコミット

OK
git add .
git commit -m "PRICE section 修正前"

# 実験的な変更はブランチで
git checkout -b fix/price-section

これで、いつでも git reset --hard HEAD で戻れます。

②ワンステップ・ワンテスト

NG:一気に変更

ボタンの幅 + 色 + フォント + 位置を同時に変更。
→ どれが原因でデザインが崩れたのか特定不可能。

OK:1つずつ確認
  1. ボタンの幅を変更 → ブラウザ確認
  2. OK → 色を変更 → ブラウザ確認
  3. OK → フォントを変更 → ブラウザ確認

③ブラウザ確認の最低限項目

必須チェック
  • デスクトップ表示(Chrome/Edge)
  • スマホ表示(DevTools: F12 → デバイスモード)
  • ボタンのクリック可否(実際にクリックしてみる)
  • テキストの読みやすさ(コントラスト、文字サイズ)

特に、スマホ表示は必須。ユーザーの8割はスマホです。

④ロールバック手順

戻し方
# 最後のコミットに戻す
git reset --hard HEAD

# 特定のコミットに戻す
git reset --hard [コミットID]

# ファイル単位で戻す
git checkout HEAD -- file.css

💡 ビジュアルツールでの復旧方法
VS Codeのタイムライン機能やGit Graphを使った画像付きの復旧手順は、 トラブル・復旧マニュアルを参照してください。

7. 環境設定の徹底(UTF-8, PowerShell対応)

【重要】PowerShellでファイルを保存する際の注意

問題

PowerShellの Set-ContentOut-File は、デフォルトでUTF-16 LEまたはシステムデフォルトエンコーディングで保存される。
これにより、日本語コメントを含むHTML/CSS/JSファイルが文字化けする。

OK(UTF-8 BOMなしを明示)
[System.IO.File]::WriteAllText('file.css', $content, (New-Object System.Text.UTF8Encoding $false))

確認方法: VS Codeの右下に表示されるエンコーディングが「UTF-8」であることを必ず確認する。

コマンド実行前チェックリスト

実行前チェック
  • -Encoding UTF8 は指定したか?
  • ☐ バックアップは取ったか?(cp file.css file.css.bak
  • ☐ 対象ファイルのパスは正しいか?
  • ☐ Gitでコミット済みか?

8. CVボタンは共通パーツ化

LPの唯一の目的は「応募」です。デザイン崩れでボタンが押せなくなることだけは万死に値します。

OK

最強の共通パーツを作る。
.btn-cta のような共通クラスを作り、どのページ、どの場所に置いても絶対に崩れないように独立させて管理します。


⚡ Performance First Coding

「後から高速化」は泥沼の元。最初から「爆速」で作るための鉄則。

9. Performance First(画像・動画・ライブラリ最適化)

① 文字・即・テキスト(脱・画像化)

NG

Photoshopで作った画像の中に文字を埋め込む。
→ 時給が50円変わるだけで画像の作り直しが発生します。

OK

HTMLテキスト+CSSで作る。
変更の可能性がある情報は、意地でもテキストデータとして実装します。

② Inline SVG(脱・アイコンフォント)

OK

FontAwesome等のアイコンフォントは使用禁止(250KBの無駄)。
アイコンは必ずSVGコードとしてHTMLに埋め込む。

③ JS Media Injection(動画の遅延読込)

OK

動画などの重いファイルは、HTMLに直接書かない。
window.innerWidth でPC判定してから、JSでタグを生成・注入する。
(スマホでの裏ダウンロードを完全に防ぐため)

④ Mobile Q50(スマホ画像は品質50)

OK

スマホ用画像は品質(Quality)を 50 まで落とす。
小さな画面では劣化が気にならず、容量を劇的に削減できる。

10. AI協働時の注意点

AIが生成するコードやコマンドの特性を理解し、事故を未然に防ぎます。

環境を明示する
  • OS(Windows)、シェル(PowerShell)、エンコーディング(UTF-8)を常に意識させる
  • PowerShell環境では grep ではなく Select-String を使うよう指示
段階的に確認する
  • AIが生成したコードを盲信せず、必ずブラウザで確認(ルール6)を行う
  • 一気に大量の修正を頼まず、セクションごとに段階的に依頼する

🛡️ 文字化け防止の最優先ルール

今回のような「ナビゲーション文字化け大量発生」を二度と起こさないための必須プロトコル

11. 文字化け完全防止プロトコル

【最重要】文字化けは「起きてから直す」のではなく「起きないようにする」

① プロジェクト設定を強制する

必須設定

`.vscode/settings.json` を作成(プロジェクト全体に適用):

{
  "files.encoding": "utf8",
  "files.autoGuessEncoding": false,
  "files.eol": "\n"
}

`.editorconfig` を確認(既存ファイルを更新):

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true

② ファイル作成時の鉄則

3ステップチェック

絶対に守る3つのステップ:

  1. テンプレートからコピー(ゼロから作らない)
  2. 右下のエンコーディング表示を確認(必ずUTF-8)
  3. 日本語を1文字入力→保存→ブラウザ確認(文字化けテスト)

③ PowerShellスクリプトのテンプレート

安全なヘルパー関数

全てのスクリプトに必須のヘッダー:

# ===== エンコーディング安全設定 =====
$OutputEncoding = [System.Text.Encoding]::UTF8
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8

# ファイル保存時は必ずこのヘルパー関数を使う
function Save-Utf8NoBom {
    param([string]$Path, [string]$Content)
    $utf8 = New-Object System.Text.UTF8Encoding $false
    [System.IO.File]::WriteAllText($Path, $Content, $utf8)
}

④ 文字化けチェックリスト(毎回実行)

作業前チェック

新規HTMLファイル作成後:

  • ☐ VSCode右下が「UTF-8」表示か?
  • ☐ 日本語コメント <!-- テスト --> を入力して保存
  • ☐ ブラウザで開いて日本語が正しく表示されるか?
  • ☐ Gitでコミット(git addgit commit

PowerShellでファイル操作後:

  • -Encoding UTF8 パラメータを付けたか?
  • ☐ または Save-Utf8NoBom 関数を使ったか?
  • ☐ VSCodeで開いて日本語が崩れていないか?

⑤ 緊急復旧コマンド

文字化け発見時
# 1. Gitで元に戻す(最優先)
git checkout HEAD -- ファイル名.html

# 2. または手動で修正
$content = Get-Content "ファイル.html" -Raw -Encoding UTF8
$utf8 = New-Object System.Text.UTF8Encoding $false
[System.IO.File]::WriteAllText("ファイル.html", $content, $utf8)
重要な習慣

作業開始前に必ずこのルールをAntigravityに見せる

「これから〇〇の作業をします。コーディング規則を確認してください」と伝えることで、
AIが事前にエンコーディングやGitコミットの注意点を意識した提案をしてくれます。


📁 CSSファイル管理

「ちょっとした追加」のたびにCSSファイルが増えると、優先順位が複雑化し、修正が効かなくなります

12. CSSファイルは増やさない(1LP = 1CSS)

【重要】機能追加のたびに新しいCSSファイルを作るのは絶対禁止。

NG:ファイル増殖

「CTAを強化したい」→ cta-enhancement.css を新規作成
「ヒーローを調整したい」→ hero-fix.css を新規作成
→ どのファイルが優先されるか分からなくなり、修正が効かない事態に。

OK:1LP = 最大2ファイル

許可されるCSS構成

  • インラインCSS(<style>タグ):フォント定義・CSS変数・FOUC防止の最小限のみ
  • 外部CSS 1本(renewal.css:全スタイルをここに集約

禁止事項

  • ❌ 機能単位でCSSファイルを分割(cta-enhancement.css など)
  • ❌ 修正用の上書きCSS(hero-fix.css など)
  • ❌ AIに「新しいCSSファイルを作って」と依頼すること

新機能を追加したいときは:
renewal.css の該当セクションを探して、そこに直接追記する。


🔗 CSS変数の罠

「変数は定義したはず」と思っていたら、実は自分自身を参照していた——このバグは発見が非常に困難です

13. CSS変数は必ず具体値で定義する(循環参照禁止)

【重要】:root で変数を定義するとき、値に同名の変数を使ってはいけません。

NG:自己参照(循環参照)
:root {
  /* ❌ 自分自身を参照 → 値が無効になる(テキストが消える) */
  --text-main: var(--text-main);
  --text-muted: var(--text-muted);
  --bg-light: var(--bg-light);
}

→ この変数を使った color: var(--text-main) などは値なしになり、テキストが見えなくなります。

NG:他ファイル依存(暗黙の参照)
/* renewal.css の :root で定義 */
:root {
  /* ❌ base.cssで定義されているはず、という前提で書く */
  --text-main: var(--color-neutral-dark); /* base.cssにあるかも? */
}

→ 読み込み順や定義の有無によって動いたり動かなかったりする 不安定なコードになります。

OK:必ず具体値を書く
:root {
  /* ✅ 具体的な値を直接書く */
  --text-main: #333333;
  --text-sub: #555555;
  --text-muted: #888888;
  --bg-light: #f4f6f9;
  --border-light: rgba(0, 26, 61, 0.1);
}

→ どのファイルが先に読まれても、必ず正しい値が適用されます。

確認コマンド(DevTools)

変数の値が正しく設定されているかは、ブラウザのDevToolsで確認できます:

  1. F12 → 「要素」タブで対象の要素を選択
  2. 右の「スタイル」パネルで color: var(--text-main) を探す
  3. 変数名の横に色が表示されていれば正常。何も表示されなければ循環参照の疑いあり

📝 まとめ:13の鉄則

  1. モバイルファースト
  2. 単一の情報源(One Source of Truth)
  3. Flexbox/Grid優先、絶対配置は装飾のみ
  4. セクションは独立させる(padding内完結)
  5. !importantとインラインスタイル禁止
  6. Git必須+段階的確認
  7. 環境設定の徹底(UTF-8, PowerShell対応)
  8. CVボタンは共通パーツ化
  9. Performance First
  10. AI協働時の注意点
  11. 文字化け完全防止プロトコル
  12. CSSファイルは増やさない(1LP = 1CSS)
  13. CSS変数は必ず具体値で定義する(循環参照禁止)
  14. モバイル互換性ルール(dvh禁止・バージョンバンプ必須)

これらを守れば、「修正の無限ループ」から必ず脱出できます。

📅 事例集(困った時の事例集セクション参照)


📱 LINE IAB / モバイル互換性

LINEアプリの内蔵ブラウザ(LINE IAB)はChromeとは異なるエンジンで動作し、新しいCSS機能の一部に非対応です

14. モバイル互換性ルール(dvh禁止・バージョンバンプ必須)

① dvh / svh / lvh は使わない

NG:LINE IABで高さが崩れる

dvh(Dynamic Viewport Height)はLINEの内蔵ブラウザが非対応。ヒーローなどの高さ計算が壊れてテキストが見切れる。

height: 100dvh;
min-height: 100dvh;
padding-top: calc(50dvh - 240px);
OK:全ブラウザ対応
height: 100vh;
min-height: 100vh;
padding-top: calc(50vh - 240px);

vh は全ブラウザ対応。見た目への差は数px程度で実害なし。
新しいビューポート単位(svh / dvh / lvh)は使用禁止。

② CSSを修正したら必ずバージョン番号を上げる

NG:スマホ・LINEに反映されない

CSSを変えてアップロードしても、URLが同じなら古いキャッシュが使われ続ける。PCは「キャッシュ無効化」で確認できるが、スマホ・LINEはできない。

OK:バージョンバンプで即反映
<!-- CSS修正のたびに ?v=X.X を上げる -->
<link rel="stylesheet" href="css/hero.css?v=3.2" />

CSSファイルを修正したら、index.html のバージョン番号を上げる。これがスマホ・LINEへの確実な反映方法。

🔍 困った時の事例集

実際のデバッグで発見した「これが原因だった」を症状ベースで記録。同じ罠に2度ハマらないために。
📅 2026-02-21 追記(堀田建設LP モバイルデバッグセッション)

事例1:モバイルで画像の上に空白が出る

症状:Broken GridをモバイルでリセットしたのにデスクトップのCSS(position:sticky)が残り、画像が下にずれる。

原因

position: stickytop: 100px が、position: relative にリセット後も残る。

解決策
.visual { position: relative; top: auto; /* ← 必須! */ width: 100%; margin: 0; }

事例2:モバイルでカードの右側が見切れる

症状:特定のカード(reverseクラス)だけ右端が画面からはみ出す。他のカードは正常。

原因

デスクトップの max-width: 1100px がモバイルで残り、containerのpaddingを超えて画面幅を突き破る。

解決策
/* モバイル用に親カードへ追加 */
.card { max-width: 100%; overflow: hidden; }

事例3:モバイルCSSが効かない(詳細度負け)

症状:モバイル用の margin: 0 を書いたのにデスクトップのスタイルが残っている。

原因

デスクトップセレクターのクラス数が多く(詳細度が高く)、モバイルセレクターが負けている。

解決策:親セレクターを追加して詳細度を上げる
/* NG(詳細度が低くてデスクトップに負ける) */
body .card .visual { margin: 0; }

/* OK(親クラスを足して詳細度を上げる。!importantは不要) */
body .voice-grid .card .visual { margin: 0; }

事例4:デプロイ成功なのにスマホに反映されない

デバッグ手順(この順番で試す)
  1. ファイル確認:Select-Stringで変更が実際に書き込まれているか確認
  2. PCで確認:F12 → Network → 「キャッシュを無効化」→ Ctrl+Shift+R
  3. バージョンバンプ:CSS読み込みを renewal.css?v=9.2 のように更新
  4. スマホのシークレットモード:スマホはPCと別キャッシュのためIncognitoで確認

事例5:過去の遺物「br表示制御」によるレイアウト崩壊

過去の誤った手法

過去は <br class="br-sp-only"><br class="pc-only"> で無理やり改行位置を調整していましたが、カード内でこれを使うと高さが揃わなくなり、PC/SPで1文字だけ改行される「泣き別れ現象」の温床でした。

最新の【ハイエンド基準】:br制御を完全禁止
  • すべてのbr表示制御タグ(.sp-only-br等)の使用を禁止します。
  • 解決策: 見出しや文章をPCとスマホで最適化したい場合は、必ず <h2 class="pc-only"><h2 class="sp-only"> の別ブロックとして完全に分離(HTMLごと用意) してください。

事例6:ブログページからのリンクが /blog/works.html になる(2026-02-24)

症状

ブログページ(https://web-tsukuru.jp/blog/)から「実績」リンクをクリックすると /blog/works.html に飛んでしまう

原因と解決策
  • 原因: /blog/(末尾スラッシュ)のURLでは pathname.split("/").filter(Boolean)["blog"]となりdepth=1になる。/blog/index.htmlならdepth=2。同じページなのにdepthが変わる
  • 解決策A(根本修正): 末尾が/のURLは"index.html"を付与してからdepth計算する
    var pathname = window.location.pathname;
    if (pathname.endsWith("/")) pathname += "index.html";
    var depth = pathname.split("/").filter(Boolean).length;
  • 解決策B(確実): 全サイト共通の重要リンク(実績・デザイン)は href="/works.html" のように絶対パスを使う

事例7:shared-nav.js を追加したのに一部ページで反映されない(2026-02-24)

症状

design.html のナビに「実績」リンクがなく、古いハードコードのナビのまま

原因と解決策
  • 原因: 新しいJSファイルを追加する際、一部ページへの適用を漏らした
  • チェック方法: grep -r "shared-nav.js" site/ で全ページの適用状況を確認する
  • ルール: 全ページ共通のスクリプトを追加した際は、必ず全HTMLを対象にgrepして確認する

事例8:デモサイトのリンクが存在しないフォルダを参照している(2026-02-24)

症状

design.html のネクスト・フロンティアの「デモサイトを見る」ボタンをクリックしても404になる

原因と解決策
  • 原因: テンプレートフォルダ名が type-speed/(過去の仮称)のまま残っており、実際のフォルダ名 type-b/ と不一致だった
  • チェック方法: href="templates/ でgrepし、実際のフォルダ一覧と照合する
  • ルール: テンプレートを追加・改名したとき、参照しているHTML全ファイルのリンクも同時に更新する

事例9:PowerShell で日本語ファイルを編集したら全テキストが文字化け(2026-02-24)

症状

PowerShell の Get-Content -Raw + -replace + Set-Content -Encoding UTF8 でクラス名を一括置換した直後、ブラウザで日本語が全て文字化けした(例:「未来を、」→「譛ェ譚・繧偵・」)

原因と解決策
  • 原因A(読み込み): 日本語Windowsでは Get-Content -Raw のデフォルトエンコードが Shift-JIS。UTF-8のHTMLをShift-JISとして誤読して内部文字列が壊れる
  • 原因B(書き込み): Set-Content -Encoding UTF8BOM付きUTF-8 で書き出す。ブラウザが誤解釈して文字化けする場合がある
  • 解決策(根本): 日本語テキストを含むHTMLファイルは replace_file_content / multi_replace_file_content ツールのみで編集する。PowerShellの文字列操作は使わない
  • 解決策(復旧): git checkout <正常commitハッシュ> -- <ファイルパス> で正常版に戻してから、編集ツールで再適用する
  • 例外(OK): バイト操作([System.IO.File]::ReadAllBytes)でBOM除去など、文字列を一切解釈しない処理は安全

事例10:LINEアプリで開くとヒーローのテキストが見切れる(2026-02-25)

症状

スマホのLINEからサイトURLを開くと、ヒーローセクションのh1テキスト冒頭が見えず、途中から表示される。Chromeでは正常。

原因と解決策
  • 原因: CSSの height: 100dvh / min-height: 100dvh を使用。dvh(Dynamic Viewport Height)はLINEの内蔵ブラウザ(LINE IAB)が非対応のため高さ計算が崩れる
  • 解決策: dvhvh に全て置き換える。vh はほぼ全ブラウザで対応しており、見た目への影響は数px程度で軽微
  • ルール: svh / dvh / lvh などの新しいビューポート単位はLINE IABで動作しない。モバイルでは vh を使う
/* NG: LINE IAbで非対応 */
height: 100dvh;
min-height: 100dvh;

/* OK: 全ブラウザ対応 */
height: 100vh;
min-height: 100vh;

事例11:CSSを修正してFTPアップしたのにLINEブラウザに反映されない(2026-02-25)

症状

CSSを修正してサーバーにアップロードしたのに、スマホのLINEブラウザでは古い表示のまま変わらない。PCのChromeでは反映されている。

原因と解決策
  • 原因: CSSファイルが hero.css?v=3.1 のようにバージョン番号付きでブラウザにキャッシュされている。ファイルの中身を変えてもURLが同じなら古いキャッシュを使い続ける
  • 解決策: index.html の CSS読み込みのバージョン番号を上げる(例: ?v=3.1?v=3.2
  • ルール: CSSを修正したら必ずバージョン番号を上げてからアップロードする。PCは「キャッシュを無効化」で確認できるがスマホ・LINEは無効化できないため、バージョンバンプが唯一の確実な方法
<!-- NG: CSSを変えてもURLが同じなのでキャッシュされたまま -->
<link rel="stylesheet" href="css/hero.css?v=3.1" />

<!-- OK: バージョン番号を上げてキャッシュを無効化 -->
<link rel="stylesheet" href="css/hero.css?v=3.2" />

事例12:absoluteで配置した要素、topとbottomどちらで指定するか(2026-03-28)

症状:top: calc(100% - Xpx) で位置指定した装飾ライン(.hero-line)が、モバイルとPCでズレる。数値を大きくすると上に行き、小さくすると下に行く——直感に反した動きで修正ループに入る。

NG:topで下端基準の位置を管理

top: calc(100% - 260px) のように書くと、数値を増やすほど上に行く(直感に反する)。モバイルとPCで 100% の値(ヒーロー高さ)が異なるため、ズレも変わる。

/* NG: 数値を増やすと上に動く(直感に反する) */
top: calc(100% - 260px);
OK:bottomで下端基準を直接指定

要素の下端を基準にしたいなら bottom: Xpx を使う。「ヒーロー下から何px上」が直接数値で表せるため、他の要素(赤丸など)と合わせやすい。

/* OK: ヒーロー下端からの距離を直接指定 */
.hero-decoration { bottom: 150px; height: 200px; } /* 円の上端 = bottom:350px */
.hero-line        { bottom: 150px; }                /* ラインの下端 = 円の下端に一致 */

👆 円の bottom 値に合わせれば「ラインが円の下端まで届く」を1行で実現できる。

事例13:PCのみ表示の装飾要素は「最初から非表示→PCで解除」で設計する(2026-03-28)

症状:モバイル向けに調整した装飾要素がPCでズレて、モバイルとPCの両方で位置計算が複雑になり、修正の無限ループに入る。

NG:モバイルにも表示しつつPC用に上書き

モバイルでも表示させつつ、メディアクエリでPC用位置を上書きしようとする。ヒーロー高さが端末ごとに違うため計算がずれ続ける。

OK:ベースでdisplay:none、PCメディアクエリで解除

スマホに不要な装飾は最初から非表示にする。PCのスタイルをひとつの @media ブロックに集約できるため、管理がシンプルになる。

/* ベースCSS(モバイル):最初から非表示 */
.hero-line {
  display: none;
  position: absolute;
  /* 以下はPC用の初期値として書いておいてもOK */
}

/* PC(1024px以上)のみ表示・配置 */
@media (min-width: 1024px) {
  .hero-line {
    display: block;
    bottom: -10px;   /* 円のbottom値に合わせる */
    height: 240px;
  }
}

事例14:モバイルで見出し文字が変な位置で改行されて読みにくい(2026-04-03)

NG:<br class="pc-only"> などの小手先で何とかしようとする

PCとスマホでは「最適な1行の文字数」が全く違うため、<br>の表示/非表示だけでごまかすと「て、」「に、」のように1文字だけが改行される非常に素人臭い見た目になる。また、HTML内に不要なクラスタグが散乱し保守性が落ちる。

OK:見出しブロックごとPC用とSP用で分離する

スマホでは物理的に「15文字前後」しか1行に入らないため、<h2 class="pc-only"><h2 class="sp-only"> のブロックごと完全に分離し、スマホの幅に合わせた最適な改行リズムで表示する。

📖 詳細はメインマニュアルへ集約: モバイル最適化ガイド(タイポグラフィ基準・エディトリアル文字組み)

事例15:スマホで見るとテキストが縦長によじれて極端に読みにくい(2026-04-03)

症状:ニュースリスト(日付・画像・テキスト)やカード内の文章が、スマホで「3〜4文字ずつ改行」されてガタガタに押しつぶされる。

原因

PC時の display: flex と並列要素の width: 130pxmargin-right: 50px といった固定幅がスマホでも継承されたため、残った数十ピクセルの中に長いテキストが強制的に押し込まれたことによるレイアウト崩壊。

解決策:スマホ専用のGridや縦積み(Column)に解放する
  • 横長カード: スマホでは flex-direction: column を指定し、横並びの「アイコン」をフル横幅(aspect-ratio:3/2等)の美しいバナー画像へ昇華させる。
  • リスト(News等): スマホ用に display: grid; grid-template-columns: 80px 1fr; を組み直し、「上段に日付・バッジ(幅100%)」「下段に画像とテキスト」のように要素を再配置してテキスト空間を確保する。

事例16:公開すべきではないダミーや社内資料がGoogleに拾われてしまう(2026-04-07)

症状

制作途中のデモサイト、クライアント専用の確認用URL(採用司令室など)、クラウドワークス用の提案資料などがそのままインターネット上に公開され、Google検索にインデックスされることにより、SEOの評価分散やクライアント情報の漏洩リスクが発生する。

原因と大原則(デフォルトnoindexルール)
  • 原因: HTMLファイルの <head>noindex タグを意図的に入れ忘れていたため。
  • 【絶対ルール】デフォルトnoindexの原則: 新しくHTMLファイルを作成・複製する際は、「トップページ」や「SEO集客用のブログ記事」など、明確に検索エンジンに拾わせたい【特例】を除き、すべてのHTMLの <head> 直下に例外なく <meta name="robots" content="noindex, nofollow"> を配置する。
  • 備考: 営業時のデモンストレーション用や内部管理用(site/templates/site/client-work/等の内部URL)は全てSEO的鎖国状態(noindex)を基本とする。

📁 クライアントフォルダ命名規則(2026-03-28 追加)

案件ごとにフォルダを整理するルール。Antigravityがすぐ資料を参照できる状態にしておくことが目的。

フォルダ命名・構成ルール

全案件は site/client-work/ 以下に配置する。

① フォルダ名の命名規則

OK:連番 + クライアント名(英数小文字)
site/client-work/
  01_hotta/          ← 完了案件
  02_hokkaido_cafe/  ← 完了案件
  03_okagesama/      ← 進行中
  04_drpedal/        ← 進行中
  05_(次の案件)/
  • 番号は2桁(01, 02, 03...)
  • クライアント名は英数小文字+アンダースコア
  • スペース・日本語・大文字は使わない

② フォルダ内部の構成ルール

標準構成
XX_clientname/
  docs/              ← ヒアリング資料・設計書(.md形式)
    project_brief.md ← 必ず作成する(Antigravityが読める形式)
  design/            ← Figmaスクリーンショット・参考画像
  images/            ← 本番で使用する画像素材
  index.html         ← メインファイル
  style.css          ← スタイルシート(1案件1CSS)

③ project_brief.md は必ず作る

Antigravityとの引き継ぎ資料

セッションをまたいでも即座に作業再開できるよう、受注時にproject_brief.mdを作成する。

  • 目的・KPI・ターゲット・デザイン方向
  • ページ構成(全ページ一覧)
  • 企業情報・SNSリンク・連絡先
  • 現在のステータス(どのStepか)

docs/project_brief.md を読んで作業してください」とAntigravityに伝えるだけで即スタートできる。

事例12:スクロール連動アニメーションの中間が重く(遅く)感じる(2026-04-03)

症状

ページをスクロールした際、連動して動くアニメーション(スライドアップ等)の入りと終わりはシュッと早いのに、中間部分でブレーキがかかったように粘り気があり、何度もスクロールしないと進まない。

原因と解決策
  • 原因: スクロール進捗(scroll progress)に直接連動させているのに、さらにCSSアニメ用のイージング数式(ease-out cubic など)を二重に掛けてしまったため。ユーザーの物理的な指の慣性と、数式のブレーキが喧嘩して中間地点でスタックする。
  • 解決策: スクロール量に直接連動させるアニメーションでは、数式を外して完全な等速(直列リニア: p2E = p2P)で追従させる。
  • ルール: 時間軸のアニメーション(Hover等)にはイージングをかける。スクロール軸(物理軸)のアニメーションは『Linear(リニア)』を絶対の基準とする。
/* NG: スクロール量に対してイージング(3乗)を掛ける */
const p2E = 1 - Math.pow(1 - p2P, 3);

/* OK: スクロール量に等速(直接)で追従させる */
const p2E = p2P;