人來過
從零到產品 EP.5

用 AI 寫出你的第一個網頁

為什麼分三層 + 跟 AI 改網頁的三個層級指令

← 回系列目錄
📅 發佈於 2026-04-08🔄 最後更新 2026-04-08

我先講一句你可能會傻眼的話:

2026 年的 vibe coder,
不會自己寫 HTML、CSS、JavaScript。
一行也不會。

那這篇還教什麼?

我教的是「為什麼 AI 寫的網頁,
長那個樣子」。

知道為什麼長那樣,
你才知道要叫 AI 改哪一塊。
知道改哪一塊,
你才能下對指令、一次就改對,
不會跟 AI 來回 10 輪還在原地。

這篇是我們系列的轉捩點 —
從這裡開始,
你會「跟 AI 講同一種語言」。

Part A:為什麼 AI 寫的網頁長那樣

你的第一個 prompt

假設你打開 Antigravity(或任何 AI 工具),
第一句話就跟它說:

幫我做一個我的個人簡介頁。
名字、一段自介、一張頭像、一個聯絡按鈕。

三秒鐘後 AI 給你三個檔案:

1
index.html
看起來是文字跟一些 <div><p> 的角括號
2
style.css
看起來是 color、font-size、padding 之類的詞
3
script.js
看起來像 function 跟一些英文邏輯

你打開檔案夾,
腦袋第一個問題會是:

「為什麼一定要三個檔案?
不能寫成一坨嗎?」

這個問題就是這篇要回答的核心。

三層分工的真實理由

三層分開寫的真正理由很實際 —
跟教科書怎麼說無關,
而是因為「分開」對 AI 跟對你都有具體的好處。

① 改一個地方,不會壞另一個地方

想像一下:
如果所有東西寫在一個檔案裡,
你跟 AI 說「按鈕變藍色」,
AI 為了找到那個按鈕,
得在一坨 1000 行的程式裡掃半天,
還可能順手改壞旁邊的東西。

分成三層之後:

改文字
→ AI 只動 index.html,CSS 跟 JS 不會被碰
改顏色
→ AI 只動 style.css,HTML 結構不會跑掉
改行為
→ AI 只動 script.js,畫面長相不會變

這件事對 vibe coder 超重要 —
你會發現 AI 改一個東西的時候,
比較不會亂改其他地方。

② 同一個樣式,可以套用很多頁

如果你做的是「一個有很多頁的網站」,
會有 5、10、20 個不同的 HTML 檔。

如果樣式全部塞在 HTML 裡,
你要改一次顏色,
得改 20 個檔案。

分出 CSS 之後,
你只改一個 style.css,
20 個頁面同時變色。

這也是為什麼後面我們講 GitHub、講部署的時候,
你會發現「分層」省下的時間會越來越誇張。

③ AI 讀起來也比較快

AI 工具有「context」的概念 —
它一次能讀的字數是有限的。

如果你的網頁都擠在一個檔案,
AI 每次改任何東西都得把整個檔讀一次。

分層之後,
「只想改顏色」的時候 AI 只讀 style.css,
速度快、用的額度少、出錯機率低。

三層分工就是為了「AI + 人類協作」設計的工作方式。
2026 年這個分工方式變得更重要,
不會因為 AI 變強而被淘汰,反而被放大。

三層各自負責什麼(一句話版)

HTML
「有什麼東西在頁面上」
標題、段落、圖片、按鈕、表單 — 你看得到的「東西」全部都在這層
CSS
「這些東西長什麼樣」
顏色、大小、字型、位置、間距、動畫 — 視覺上的「樣子」全部都在這層
JavaScript
「按下去會發生什麼」
點擊反應、表單送出、跟後端 API 對話、計時器 — 所有「動作」都在這層

你不用記語法,
但你要記得這個分工。
因為下一段 Part B 我們就要用這個分工,
來教你怎麼下指令。

Part B:跟 AI 改網頁的三個層級指令

現在你有了第一版網頁,
跑起來大概 80 分。
你想把它改成 100 分。

vibe coder 90% 的時間花在「改」這件事上 —
真正從零做的時間其實很少。

改的時候,
你的指令要對上層級。
對錯了,AI 就會做出你不想要的東西。

層級 1:你想加東西 → HTML 層指令

「加」「放」「插入」「新增」這類動作。

在頁尾加一個聯絡按鈕

主標題下面再插一段 slogan

把那張圖換成 hero section(一張大圖 + 標題 + 副標)

這些都是「畫面上多了一個東西」,
所以 AI 要動的是 HTML。

下這類指令的時候,
盡量把「這個東西要長在誰旁邊」講清楚。
例如:

不夠精準
「加一個按鈕」
夠精準
「在主標題正下方,加一個寫著『聯絡我』的按鈕」

位置 + 內容講清楚,
AI 一次就放對。

層級 2:你想改長相 → CSS 層指令

「變」「改成」「再大一點」「換顏色」「圓角」「靠右」這類動作。

按鈕變藍色

整體字大一號

主標題置中、加粗、加陰影

所有卡片改成圓角 + 微微的陰影

這些都是「東西還是同一個,但長相不一樣了」,
所以 AI 要動的是 CSS。

下這類指令的時候,
用「形容詞」比用「數字」好。
因為你不會記得 padding 是 16px 還是 20px,
但你知道「再寬鬆一點」「太擠了」。

用形容詞
「按鈕再大一點、邊角再圓一點、顏色再暖一點」
用感覺
「整體看起來太擠,給我多一點呼吸感」
用對比
「跟 Linear 那種乾淨的感覺接近一點」

AI 對形容詞 + 對比的反應,
比對「padding: 24px」這種精確指令還要好。

層級 3:你想加行為 → JS 層指令

「點」「按」「滑」「跳出」「自動」「送出」這類動作。

點按鈕跳出留言框

滑鼠移到卡片上微微放大

表單按送出之後顯示「已送出」

頁面打開 3 秒後自動跳一個訂閱彈窗

這些都是「你要互動才會發生的事」,
所以 AI 要動的是 JavaScript。

下這類指令的時候,
把觸發條件 + 反應動作 + 結束狀態三件事講清楚。

觸發條件
什麼時候會發生?(按下去 / 滑過去 / 載入後 5 秒)
反應動作
會做什麼?(跳訊息 / 變色 / 送出 / 跳轉)
結束狀態
做完之後呢?(自動關掉 / 留在那 / 鎖住按鈕)

三個都講清楚,
AI 不會亂自由發揮。

一個按鈕的三種改法

同樣是「按鈕」,
三種改法分屬三個不同的層級。
看完這個範例,
你就會永遠記得怎麼分。

情境:你的網頁右上角有一個叫「訂閱」的按鈕,
你想要它變得不一樣。

改法 ① 改文字 / 改位置 → HTML 層

指令
「把『訂閱』改成『加入電子報』,並把它從右上角移到頁尾正中央」
AI 動的是
index.html — 改 button 的文字內容、改它的位置(從 header 搬到 footer)

改法 ② 改外觀 → CSS 層

指令
「按鈕改成深綠底白字、邊角加大、加一個微微的陰影、滑鼠移過去顏色變深」
AI 動的是
style.css — 改 background、color、border-radius、box-shadow、:hover 樣式

改法 ③ 改行為 → JS 層

指令
「按下按鈕之後,顯示一個輸入 email 的小視窗,使用者填完按送出,按鈕變成『感謝訂閱』並停用」
AI 動的是
script.js — 加 click 事件、彈出 modal、處理表單、改按鈕狀態

同一個按鈕、三種改法、三個檔案。
看懂這個分工之後,
你下次叫 AI 改東西的時候,
會自動知道你的指令會落在哪一層。

vibe coder 最常踩的指令陷阱

陷阱 1:把三層的需求混在同一句指令裡

爛指令
「把按鈕變綠色、移到下面、按下去要彈訊息」

三件事擠在一句話。
AI 通常會做完前兩件,
第三件做一半,
然後你會抓不到哪裡沒做好。

好指令
分三輪講:先改顏色 → 改完跑一次 → 再講位置 → 跑一次 → 最後加 click 事件

陷阱 2:用效果反推語法

爛指令
「我要 padding 20、margin 16、border-radius 8」

vibe coder 寫不出比 AI 更好的數字,
講感覺就好。

好指令
「整體視覺再寬鬆一點,邊角再圓一點」

陷阱 3:跨檔案的修改沒講清楚

爛指令
「換一個按鈕」

AI 不知道你要換 HTML 那層的「換掉這個按鈕的位置」,
還是 CSS 那層的「換一個樣式」。

好指令
「換掉按鈕的『樣子』,內容跟位置不變」(→ 鎖在 CSS 層)

給你的提問模板

下次想叫 AI 改網頁,
套這個結構:

[層級]:我要 [改 / 加 / 換]
位置:[在哪個元素旁邊 / 在哪個區塊裡]
內容:[要變成什麼樣 / 加什麼進去]
互動:[按下去 / 滑過去 / 自動觸發]
我希望結果是:[一句話形容感覺]

把這個模板存起來,
第一週你會覺得很機械,
第二週你會發現 AI 改錯的次數變得很少,
第三週這個結構會內化成你跟 AI 對話的本能。

會下對指令,比會寫程式重要

你不需要記語法。
你需要記住三層的分工、跟對應的指令模式。
剩下的全部是 AI 的工作。

講完三個層級的指令之後,
你大概會發現一件事:

有些東西,
你嘴巴怎麼形容都形容不到位。

「我要的卡片跟你做的差很多,
但我不知道怎麼跟你講⋯⋯」

這個感覺出現的時候,
更精準的文字幫不了你,
你需要的是「直接畫給 AI 看」。

下一篇 EP.6,
我們就要動到 Figma —
vibe coder 用最少的學習成本,
把腦袋裡的畫面變成 AI 看得懂的設計。

上一篇
EP.4 動手前 — 你需要的工具
下一篇 — 即將上線
EP.6 用 Figma 把畫面想清楚

追蹤系列更新

新篇章上線會在 Threads 通知

追蹤 @kanisleo328