Reference · ใช้ตอน W12 / W14 / W15 — ทุกครั้งที่ AI สร้าง UI

📐 UX/UI Principles — ตัดสินงาน AI ให้เป็น

หน้านี้ "ไม่ใช่" design school · เป็นพื้นฐานแค่พอ "อ่าน UI ที่ AI สร้างให้แล้วบอกได้ว่าดี/แย่" · AI เขียน UI ที่ "ดูเสร็จ" ได้ใน 30 วินาที — แต่ "ใช้จริงไม่ได้" · งานของคุณคือ จับให้ทัน

🔒 ทำไม UX/UI ยังเป็นงานของคน ไม่ใช่ AI AI ไม่รู้ว่า "user ของคุณคือใคร" · ไม่รู้ "ทำงานอยู่ในมือถือ/desktop" · ไม่รู้ "data ของคุณจะหน้าตายังไงจริง" · มัน "เดา" ทุกอย่าง · ผลที่ได้ดูดี แต่ส่วนใหญ่ไม่ตรงงานจริง

📑 สารบัญ

  1. เลือก UI Technology ให้ตรงงาน 🎯
  2. รู้จัก user ก่อนเขียน UI
  3. ลำดับความสำคัญ (Hierarchy)
  4. 5 States ที่ AI ลืมเสมอ
  5. Feedback & Confirmation
  6. Forms ที่ใช้ได้จริง
  7. Tables & Lists
  8. Layout Patterns ที่ใช้บ่อย
  9. คิดถึงมือถือ
  10. สี · ไอคอน · ความหมาย
  11. 10 ข้อ "อย่าทำ"
  12. Accessibility พื้นฐาน
  13. ⚠️ AI-Era UX Traps
  14. Checklist ก่อนส่งงาน

0. เลือก UI Technology ให้ตรงงาน 🎯

"คำถามแรก ก่อนพูดถึง design — UI ของคุณจะรันที่ไหน?" · ถ้าตอบผิดตรงนี้ → design ดีแค่ไหนก็ "ใช้ไม่ได้" · ตัวอย่างคลาสสิก: นักศึกษาสร้าง tkinter app สวย ๆ แล้วอยาก "deploy ขึ้น cloud" → ทำไม่ได้

⚠️ Mismatch ที่เจอบ่อยที่สุดในนักศึกษา เริ่มเขียน Tkinter / PyQt (desktop GUI) แล้วอยาก "ให้เพื่อนเปิดบนมือถือ" หรือ "deploy บน Cloud Run""ทำไม่ได้" · desktop GUI รันใน browser ไม่ได้ · ต้องสร้างเป็น .exe แล้วส่งให้ทุกคนติดตั้ง · "เลือก tech ก่อนเขียน · ไม่ใช่หลัง"

🤔 ตอบ 3 คำถามนี้ก่อนเลือก tech

  1. user จะใช้ที่ไหน? — เครื่องเดียวกับคุณ / เครื่องคนละเครื่อง / มือถือ / ที่ไหนก็ได้ที่มีเน็ต
  2. user จะเปิดยังไง? — double-click .exe / เปิด browser แล้ว URL / chat กับ bot ใน LINE
  3. มีกี่คนใช้พร้อมกัน? — แค่ฉัน / 5 คน / 100 คน / 10,000 คน

📊 7 UI Technologies — เปรียบเทียบ

Technology เหมาะกับ รันที่ Deploy cloud? Learning curve
CLI
input(), click, argparse
tool ของตัวเอง · script · automation · workshop W07 terminal บนเครื่อง user ❌ no ⭐ ง่ายสุด
Tkinter / PyQt
(Desktop GUI)
app เครื่องเดียว · ออฟไลน์ · ใช้กับ hardware · kiosk desktop ของ user NO — ส่งเป็น .exe เท่านั้น ⭐⭐ ปานกลาง
Streamlit data dashboard · prototype · internal tool · W09/W10/W12 browser ของ user (server-rendered) ✅ yes (Streamlit Cloud · Cloud Run) ⭐⭐ ง่าย-ปานกลาง
Gradio demo ML model · quick form · share link browser ✅ yes (Hugging Face Spaces) ⭐⭐ ง่าย
Flask / FastAPI + HTML web app จริงจัง · multi-page · login · DB · W12+ browser (server-rendered) ✅ yes (Cloud Run · Render · Fly.io) ⭐⭐⭐ ปานกลาง-ยาก
HTML/JS frontend + Python API web app ที่ต้องการ UI ขั้นสูง · real-time · mobile-feel browser + cloud server ✅ yes (frontend: Cloudflare/Vercel · backend: Cloud Run) ⭐⭐⭐⭐ ยาก
LINE / Discord Bot command via chat · notification · ส่งภาพ · ใช้บนมือถือ chat client (LINE/Discord) ของ user ✅ yes (webhook + Cloud Run/Lambda) ⭐⭐⭐ ปานกลาง

🌳 Decision Tree — "ฉันควรใช้อะไร?"

ใครจะใช้ + ที่ไหน?
│
├─ แค่ฉัน · บนเครื่องฉัน · ออฟไลน์ก็ได้
│   ├─ งานสั้น · ใช้ครั้งเดียว        → CLI (W07)
│   ├─ ต้องมี GUI ปุ่มกด · ต่อ hardware → Tkinter
│   └─ data analysis · plot          → Jupyter / Colab
│
├─ คน 5–50 คน · มือถือ/desktop · ต้องการ URL
│   ├─ data dashboard · quick proto  → Streamlit (W09–W12)
│   ├─ form + DB + login + multi-page → Flask + HTML (W12+)
│   └─ ML demo · share link          → Gradio
│
├─ command บนมือถือ · ส่งข้อความ
│   └─ → LINE / Discord Bot
│
└─ คน 1,000+ · UI ขั้นสูง · real-time
    └─ → HTML/JS frontend + Python API
        (เกินขอบเขตคอร์สนี้ · เป็นเป้าหมายปี 2-3)

⚠️ Common Mismatches — กับดักที่นักศึกษาเจอบ่อย

ทำแล้วอยากปัญหาทำยังไง
Tkinter app "deploy บน Cloud Run" ❌ ทำไม่ได้ · Tkinter รันใน browser ไม่ได้ เขียนใหม่เป็น Streamlit / Flask · หรือสร้างเป็น .exe ส่งให้ติดตั้ง
Tkinter app "เพื่อนเปิดบนมือถือ" ❌ ทำไม่ได้ · ไม่มี Python บนมือถือ · ไม่มี windowing เขียนเป็น web app (Streamlit/Flask) → URL → มือถือเปิดได้
Streamlit "รับ user 10,000 คน" ⚠️ ช้า + แพง · Streamlit ออกแบบสำหรับ internal tool เขียนเป็น Flask/FastAPI + HTML/JS · scale ได้ดีกว่า
Flask + HTML "แค่ทำ chart ดู" ⚠️ over-engineering · ใช้เวลา 1 อาทิตย์ทั้งที่ Streamlit ทำได้ใน 30 นาที ใช้ Streamlit ก่อน · ถ้าจำเป็นค่อยย้ายไป Flask
CLI "ส่งคุณยายใช้" ❌ คุณยายเปิด terminal ไม่เป็น ทำเป็น web app หรือ bot
LINE Bot "admin panel แก้ database" ⚠️ Bot UI จำกัด · table ใหญ่ใส่ไม่ได้ ใช้ web app สำหรับ admin · bot เก็บไว้ใช้กับ end-user
Jupyter Notebook "ให้คนกดใช้งาน" ❌ Notebook = environment ของ developer · ไม่ใช่ของ user เขียน code ใน .py → ใส่ใน Streamlit / Flask

🚢 Deployment Reality Check

เลือก tech แล้ว · ตรวจว่า "จริง ๆ deploy ยังไง" ก่อนใช้เวลาเขียน:

Techวิธี distributeค่าใช้จ่าย
Tkinter / PyQt PyInstaller → .exe · ส่งไฟล์ให้ user / USB / เซิร์ฟเวอร์ download ฟรี · ใช้ disk บนเครื่อง user
Streamlit Streamlit Cloud (ฟรี · เชื่อม GitHub) · หรือ Cloud Run ฟรี-เริ่มต้น · เพิ่มขึ้นถ้าใช้เยอะ
Flask Cloud Run (Google) · Render · Fly.io · Heroku ฟรี-เริ่มต้น (มี free tier · จำกัด)
HTML/JS + API Frontend: Cloudflare Pages / Vercel · Backend: Cloud Run ฟรี-เริ่มต้น (มี free tier เยอะ)
LINE Bot Webhook URL บน Cloud Run + LINE Developers Console ฟรี (LINE ไม่คิดเงิน webhook)
CLI user ลง Python + รัน pip install ของฉัน หรือใช้ pipx ฟรี

💪 ในคอร์สนี้เน้นอะไร

📌 ในคอร์สนี้ "ไม่สอน" tkinter เพราะ Year-1 ส่วนใหญ่อยากทำของแชร์ได้ · web app เหมาะกว่า · ถ้าต้องการเขียน desktop app (มี hardware) → เรียนได้ตอนปี 2-3 หรือศึกษาเอง · แต่ "อย่าเริ่มต้นที่ tkinter ถ้าตั้งใจ deploy"

1. รู้จัก user ก่อนเขียน UI

ก่อนถาม AI ว่า "ทำหน้านี้ให้หน่อย" — ตอบ 4 คำถามนี้ในใจก่อน:

  1. user ใช้บนอะไร? — มือถือ / desktop / tablet / TV / kiosk
  2. user มีเวลาแค่ไหน? — อ่านยาวได้ / 3 วินาทีต้องเข้าใจ
  3. user ทำสำเร็จเมื่อไหร่? — กดอะไรเสร็จ → success?
  4. user พลาดเมื่อไหร่? — กดผิด / ใส่ผิด → จะเสียอะไร?
💡 Prompt ที่ดีถึง AI "ทำหน้า login สำหรับ TA · ใช้บนมือถือ · ต้องเปิดเป็นโหมดมืดด้วย · มีปุ่ม 'ลืมรหัส' ที่กด 2 ขั้นถึงจะเซ็ตใหม่ได้ (ป้องกันกดเล่น)""ระบุ context" ก่อนขอ UI · AI จะตอบตรงงานมากขึ้น 10x

2. ลำดับความสำคัญ — Information Hierarchy

UI ที่ดี = "มองครั้งแรกรู้ทันทีว่าต้องกดอะไร"

❌ Bad — ทุกอย่างเท่ากันหมด
┌─────────────────────────────┐ │ [Save] [Delete] [Export] │ │ [Settings] [Help] [Share] │ │ [Print] [Email] [Cancel] │ │ │ │ User Name: ____________ │ │ Email: ____________ │ │ Phone: ____________ │ └─────────────────────────────┘
9 ปุ่ม · ขนาดเท่ากัน · สีเดียวกัน · ใช้เวลานานกว่าจะหาว่าปุ่มไหนหลัก
✅ Good — 1 ปุ่มหลัก ปุ่มรองเทาๆ
┌─────────────────────────────┐ │ User Name: ____________ │ │ Email: ____________ │ │ Phone: ____________ │ │ │ │ ┏━━━━━━━━━━━┓ │ │ ┃ Save ┃ │ │ ┗━━━━━━━━━━━┛ │ │ Cancel · Delete │ └─────────────────────────────┘
Save = primary (ใหญ่ · สีเด่น) · Cancel/Delete = secondary (ตัวอักษรเฉยๆ) · ลำดับชัด

กฎ 1-2-3 ของ primary action


3. 5 States ที่ AI ลืมเสมอ 🔥

"#1 จุดที่ AI สร้าง UI ผิดบ่อยที่สุด" · AI สมมุติว่า data มีเสมอ · มีถูกต้อง · โหลดเสร็จ · ไม่มี error · realtime · — โลกจริงไม่ใช่

State ที่ทุก UI ต้องคิด

Stateเกิดเมื่อต้องโชว์อะไร
Loadingกำลังโหลด dataspinner / skeleton · บอก "กี่วินาที" ถ้าได้
Emptydata ว่าง (เพิ่งเริ่ม / ลบหมด)คำอธิบาย + ปุ่ม "เพิ่มอันแรก"
Errorโหลดผิด · ไม่มี internet · 403error message ภาษาคน + ปุ่ม "ลองใหม่"
Partialโหลดบางส่วน · บางช่องว่างโชว์ของที่มี + dim ของที่ขาด · ไม่ใช่ blank ทั้งหน้า
Successdata มา · กดสำเร็จfeedback ชัด · ไม่ใช่หน้าเดิมเฉย ๆ
❌ Bad — Empty State หายไป
┌─────────────────────────────┐ │ รายชื่อนักศึกษา │ ├─────────────────────────────┤ │ │ │ │ │ │ │ │ │ │ └─────────────────────────────┘
user งง · มี bug? · หรือว่ายังไม่มี data? · ไม่รู้ทำอะไรต่อ
✅ Good — Empty State ที่อธิบายชัด
┌─────────────────────────────┐ │ รายชื่อนักศึกษา │ ├─────────────────────────────┤ │ │ │ 👥 │ │ ยังไม่มีนักศึกษา │ │ │ │ เพิ่มคนแรกเพื่อเริ่มต้น │ │ │ │ ┏━━━━━━━━━━━━━━┓ │ │ ┃ + เพิ่มนักศึกษา ┃ │ │ ┗━━━━━━━━━━━━━━┛ │ └─────────────────────────────┘
อธิบายสถานะ + บอก next action · user รู้ทันทีว่าต้องทำอะไร
🤖 Prompt ที่ใช้บังคับ AI ให้คิด state "ออกแบบหน้า [X] · ต้องครอบ 5 state: loading, empty, error, partial, success · อธิบายว่าแต่ละ state โชว์อะไร ก่อนเขียน code"

4. Feedback & Confirmation

4 กฎ "ตอบกลับ user"

  1. การกระทำที่ใช้เวลา >0.5 วินาที ต้องโชว์ loading · ไม่ใช่ปล่อยให้นั่งงง
  2. การกระทำที่กลับไม่ได้ (ลบ, ส่ง email, จ่ายเงิน) ต้องถาม confirm ก่อน
  3. การกระทำที่กลับได้ (toggle, edit) ไม่ต้องถาม · ทำเลย · ถ้าผิด user กดกลับ
  4. หลังกดสำเร็จ ต้องมี feedback (toast, change color, redirect) · ไม่ใช่หน้าเงียบ
❌ Bad — ลบแล้วเงียบ
┌─────────────────────────────┐ │ นักศึกษา │ ├─────────────────────────────┤ │ Ploy 85 [Delete] ✓ │ │ Nat 72 [Delete] │ │ Mint 91 [Delete] │ └─────────────────────────────┘ ↓ (กด Delete) ┌─────────────────────────────┐ │ นักศึกษา │ ├─────────────────────────────┤ │ Nat 72 [Delete] │ │ Mint 91 [Delete] │ └─────────────────────────────┘
ลบไปแล้ว · ทำไม? เผลอกด? · ไม่มี undo · ไม่มีคำว่า "ลบสำเร็จ"
✅ Good — Confirm + Undo
┌─────────────────────────────┐ │ นักศึกษา │ ├─────────────────────────────┤ │ Ploy 85 [Delete] ✓ │ │ │ │ ┌───────────────────────┐ │ │ │ ลบ Ploy? │ │ │ │ การลบกลับไม่ได้ │ │ │ │ [Cancel] [ลบ] │ │ │ └───────────────────────┘ │ └─────────────────────────────┘ ↓ (กด ลบ) ┌─────────────────────────────┐ │ ✓ ลบ Ploy แล้ว · [Undo] │ └─────────────────────────────┘
ถาม confirm สำหรับการลบ · หลังลบมี toast + undo 5 วินาที · user ปลอดภัย

5. Forms ที่ใช้ได้จริง

กฎพื้นฐาน 8 ข้อ

  1. Label อยู่บนช่อง (ไม่ใช่ข้างใน) — ช่อง placeholder ไม่ใช่ label
  2. Required ใส่ * หรือบอก "(จำเป็น)" · optional ใส่ "(ไม่จำเป็น)"
  3. Validate ใต้ช่อง (ไม่ใช่ alert popup)
  4. Validate ตอนกด Submit (ไม่ใช่ขณะพิมพ์) · ยกเว้น email/password ที่มี rule ชัด
  5. Error message บอก "ทำยังไงต่อ" · ไม่ใช่แค่ "ผิด"
  6. Default value ดี ๆ · ลด typing — user ไม่ต้องเดาว่าใส่อะไร
  7. เรียง field ตามลำดับธรรมชาติ · ชื่อ → email → เบอร์ (ไม่ใช่ตรงข้าม)
  8. กลุ่ม field ที่เกี่ยวกัน (ที่อยู่ทุก field ติดกัน · ไม่ใช่กระจาย)
❌ Bad — Error ไม่ช่วยอะไร
┌─────────────────────────────┐ │ ลงทะเบียน │ ├─────────────────────────────┤ │ Email: │ │ [ploy@ ] │ │ │ │ Password: │ │ [123 ] │ │ │ │ [ลงทะเบียน] │ │ │ │ ⚠️ Error │ └─────────────────────────────┘
"Error" ลอย ๆ · ไม่บอกว่าผิดที่ไหน · ไม่บอกว่าต้องทำยังไงต่อ
✅ Good — Error เฉพาะที่ + แนะนำ
┌─────────────────────────────┐ │ ลงทะเบียน │ ├─────────────────────────────┤ │ Email * │ │ [ploy@ ] │ │ ⚠ ใส่ email ให้ครบ │ │ (เช่น ploy@ubu.ac.th) │ │ │ │ Password * (อย่างน้อย 8) │ │ [••• ] │ │ ⚠ ต้องอย่างน้อย 8 ตัว │ │ เหลืออีก 5 ตัว │ │ │ │ [ลงทะเบียน] │ └─────────────────────────────┘
ใต้แต่ละช่อง · บอกชัดว่าผิดอะไร · บอก "next step" · ใช้ได้ทันที

6. Tables & Lists

ตาราง = 80% ของ admin panel

AI ชอบทำ table แบบ vanilla — ไม่มี sort, filter, empty state · ของจริงต้องมี:

❌ Bad — Action เต็มแถว
┌──────┬──────┬─────┬─────────────────────────┐ │ Name │Score │Grade│ Actions │ ├──────┼──────┼─────┼─────────────────────────┤ │ Ploy │ 85 │ A │[View][Edit][Del][Mail] │ │ Nat │ 72 │ B │[View][Edit][Del][Mail] │ │ Mint │ 91 │ A │[View][Edit][Del][Mail] │ └──────┴──────┴─────┴─────────────────────────┘
4 ปุ่มต่อแถว · กดผิดง่าย · ใช้พื้นที่เยอะ · บนมือถือล้น
✅ Good — 1 ปุ่มหลัก + เมนู
┌──────┬──────┬─────┬──────────────┐ │ Name │Score │Grade│ │ ├──────┼──────┼─────┼──────────────┤ │ Ploy │ 85 │ A │ [View] ⋮ │ │ Nat │ 72 │ B │ [View] ⋮ │ │ Mint │ 91 │ A │ [View] ⋮ │ └──────┴──────┴─────┴──────────────┘ ↑ คลิก row = view ⋮ = edit/del/mail
1 primary action ต่อแถว · อันรองอยู่ใน menu · คลีน · ใช้กับมือถือก็ได้

7. Layout Patterns ที่ใช้บ่อย

มี ~6 layout ที่ครอบ 95% ของแอปที่จะทำในคอร์สนี้ · เลือกให้ตรง "ก่อนสั่ง AI"

(a) List-Detail

ซ้าย = list · ขวา = detail ของที่เลือก · เหมาะกับ email, chat, file manager

┌─────────────┬──────────────────────┐
│ ▸ Ploy      │ Ploy                 │
│ ▾ Nat       │ ID: 640002           │
│   Mint      │ Email: nat@ubu...    │
│   Pim       │ Scores: 85, 72, 91   │
│             │ [Edit] [Mail]        │
└─────────────┴──────────────────────┘

(b) Dashboard / Cards

กลุ่ม metric / status · เหมาะกับ overview · "ระวัง — อย่าใส่ dashboard ถ้าไม่จำเป็น"

┌─────────┬─────────┬─────────┐
│ Total   │ Passed  │ Failed  │
│  42     │  35     │   7     │
└─────────┴─────────┴─────────┘
┌────────────────────────────┐
│ Recent Activity            │
│  • Ploy submitted lab 3    │
│  • Nat updated profile     │
└────────────────────────────┘

(c) Wizard / Stepper

สำหรับ workflow หลายขั้น · บังคับลำดับ · ใช้กับ form ยาว, registration, checkout

┌─────────────────────────────────┐
│ ●─────●─────○─────○             │
│ Info  Course Submit Confirm     │
├─────────────────────────────────┤
│  Step 2: Choose course          │
│  [ ] ENG101                     │
│  [ ] ENG102                     │
│  [x] CPM 101                    │
│                                 │
│         [Back]    [Next →]      │
└─────────────────────────────────┘

(d) Settings / Tabs

เมนูซ้าย / tab บน · เปลี่ยน content ขวา · เหมาะกับ admin / preferences

┌─────────┬──────────────────────┐
│ Profile │ ▸ Account            │
│ Account │                      │
│ Security│  Username: ploy      │
│ Notifs  │  Email:    ____      │
│         │       [Save]         │
└─────────┴──────────────────────┘

(e) Public landing

หน้าโฮม · hero + features + call-to-action · เหมาะกับ marketing / portfolio

┌─────────────────────────────────┐
│  [Logo]            [Sign in]    │
├─────────────────────────────────┤
│                                 │
│     Big Headline Here           │
│   Subtitle explaining what      │
│         [Get Started]           │
│                                 │
├─────────────────────────────────┤
│  Feature 1  Feature 2  Feature 3│
└─────────────────────────────────┘

(f) Single-action page

1 ปุ่มใหญ่กลางจอ · เหมาะกับ kiosk, quick action, mobile-first

┌─────────────────────────────────┐
│                                 │
│                                 │
│           Scan QR              │
│       ┏━━━━━━━━━━━┓             │
│       ┃   ▢▢▢▢   ┃             │
│       ┗━━━━━━━━━━━┛             │
│                                 │
│      [Open Camera]              │
│                                 │
└─────────────────────────────────┘
💡 บอก AI ตอน prompt "ใช้ layout pattern แบบ list-detail" · "แบบ wizard 3 step" · "แบบ single-action mobile" — AI จะรู้ทันทีว่าต้องสร้างอะไร · ไม่ต้องบรรยาย 10 บรรทัด

8. คิดถึงมือถือ

"นักศึกษาส่วนใหญ่เปิด web app บนมือถือ" · ถ้าไม่ทดสอบบนมือถือ → AI สร้าง UI ที่ใช้บนมือถือไม่ได้

5 กฎพื้นฐานมือถือ

  1. ปุ่มอย่างน้อย 44×44 px · นิ้วต้องกดได้
  2. font ≥ 16 px · ไม่งั้น iOS จะ zoom ทุกครั้งที่กรอก
  3. 1 column · อย่ายัด 2-3 column บนหน้าจอแคบ
  4. Form fields ใช้ type ที่ถูก · type="email", type="tel" · มือถือเปลี่ยน keyboard ให้
  5. ไม่ต้อง hover · มือถือไม่มี · ทำให้ทุกอย่างกดได้
📱 ทดสอบใน DevTools เปิด Chrome / Edge → F12 → กดไอคอนมือถือ (Toggle device toolbar) → เลือก iPhone/Pixel · เห็นว่า UI ใช้ได้บนมือถือมั้ย · "ทดสอบบนมือถือจริง = ทดสอบบน devtools"

9. สี · ไอคอน · ความหมาย

สีมีความหมาย — อย่าใช้สุ่ม

สีหมายถึงตัวอย่างใช้
🔴 แดงdanger · destructiveปุ่ม Delete · error message
🟢 เขียวsuccess · positive"บันทึกสำเร็จ" · ผ่าน
🟡 เหลือง / ส้มwarning · ต้องระวัง"คุณยังไม่ได้ save" · เตือน
🔵 ฟ้า / น้ำเงินinfo · primary · neutralปุ่มหลัก · ลิงก์ · ข้อมูล
⬜ เทาdisabled · secondaryปุ่มที่กดไม่ได้ตอนนี้

3 กฎสี

  1. 1 สี primary · 1 สี accent · neutral grayscale 4-5 ระดับ — มากกว่านี้จะดูเหมือนรุ้ง
  2. contrast พอ — text สีเทาบนพื้นเทา = อ่านไม่ออก · ใช้ contrast checker
  3. ใช้สีให้ตรงความหมาย — แดง = อันตราย · ไม่ใช่แดง = ปุ่มหลักเพราะเด่นดี (สับสน)

ไอคอน — ใช้ที่ user รู้


10. ❌ 10 ข้อ "อย่าทำ"

อย่าเพราะทำแทน
Modal popup ทุกอย่าง กระทบ flow · มือถือใช้ไม่สะดวก inline edit · drawer · navigate page ใหม่
ซ่อน action สำคัญในเมนู ⋮ user หาไม่เจอ primary action เห็นทันที
ใส่ dashboard ที่ user ไม่ดู เสียพื้นที่ · AI ชอบเสริมเข้ามาเอง ถาม user ว่าต้องการดู metric อะไรจริง
Form ยาว 30 ช่อง user ทิ้ง แบ่งเป็น wizard / เก็บแค่จำเป็น
auto-save ที่ไม่บอก user ไม่รู้ว่า save แล้วหรือยัง มี indicator "Saved · 3s ago"
Color-only signal color-blind มองไม่ออก ใส่ icon + text + color
Disable ปุ่มเงียบ ๆ user ไม่รู้ว่าทำไมกดไม่ได้ tooltip บอกเหตุผล · หรือบอกเงื่อนไขข้างปุ่ม
Error "Something went wrong" ไม่ช่วยอะไร บอกว่าผิดอะไร + ทำยังไงต่อ
Carousel/slider บน landing คนกดดูจริงน้อยมาก · เสีย performance โชว์ทุก feature เรียง · ให้ scroll
Animation 1+ วินาที ช้า · annoying animation ≤ 300ms · functional ไม่ใช่ decorative

11. Accessibility พื้นฐาน

"a11y" = accessibility · ทำให้ user ที่ตาบอด/หูหนวก/มือไม่สะดวก ใช้ได้ · "ไม่ใช่แค่จริยธรรม · ส่วนหนึ่งของกฎหมายในหลายประเทศ"

6 ข้อขั้นต่ำ (เริ่มได้ทันที)

  1. contrast ≥ 4.5:1 สำหรับ text · ตรวจที่ WebAIM Contrast Checker
  2. alt attribute ใน <img> ทุกรูป · ถ้าเป็น decorative ใส่ alt=""
  3. Button ใช้ <button> ไม่ใช่ <div onclick> · screen reader อ่านออก · keyboard ใช้ได้
  4. Form ทุกช่องมี <label> · ผูกกับ <input> ด้วย for + id
  5. ใช้ <h1> <h2> <h3> ตามลำดับ · ไม่ใช่ใช้ขนาด font อย่างเดียว
  6. Keyboard navigation ใช้ได้ — Tab ผ่านทุกปุ่ม · กด Enter / Space ทำงาน · ทดสอบ: ปิด mouse, ใช้ Tab อย่างเดียว
🤖 Prompt AI "ตรวจ HTML นี้ว่า accessibility ผ่านมั้ย · บอก issue 5 ข้อหลัก · ใช้ WCAG 2.1 AA" — AI เก่ง a11y review · ใช้ก่อน deploy ทุกครั้ง

12. ⚠️ AI-Era UX Traps — กับดักที่เจอบ่อย

AI สร้าง UI ที่ "ดูดี ใช้ไม่ได้" ในรูปแบบเหล่านี้:

Trap 1 — Dashboard syndrome

ถาม AI ให้ทำ "หน้าแรก" → ออกมาเป็น dashboard เต็มไปด้วย metric ที่ user ไม่ดู · AI default ทำแบบนี้เพราะเห็นใน training data เยอะ

วิธีจับ ถามตัวเองว่า "user มาหน้านี้เพื่อทำอะไร?" — ถ้าตอบไม่ได้ใน 5 วินาที → ตัด dashboard ออก

Trap 2 — Feature creep

ขอ AI ทำ form login · มันใส่ "remember me" + "social login" + "magic link" + "2FA" + "captcha" ทั้งที่ไม่ได้ขอ

วิธีจับ เขียน prompt: "ทำ form login พื้นฐานที่สุด · มีแค่ email + password + ปุ่ม login · ห้ามเพิ่มอย่างอื่น"

Trap 3 — State-less UI

AI สร้าง UI ที่ "ดูเสร็จ" แต่ไม่มี loading / empty / error state · ใช้กับ real data ไม่ได้

วิธีจับ หลัง AI สร้าง · ถามต่อ: "แล้วถ้า API ช้า · ถ้า data ว่าง · ถ้า request fail · UI โชว์อะไร?"

Trap 4 — Pretty placeholder data

AI ใส่ name "Lorem Ipsum", score "85, 92, 78" สวย ๆ · พอใช้ data จริง — ชื่อยาว 60 ตัวอักษร, score 0/null → layout พัง

วิธีจับ Prompt: "ใส่ test data ที่ extreme: ชื่อยาว 100 ตัว · email ว่าง · score 0 · score null · 1000 แถว"

Trap 5 — Desktop-first design

AI default ออกแบบบน desktop ก่อน · มือถือกลายเป็นของแถม · ของจริง 70% user อยู่บนมือถือ

วิธีจับ Prompt: "design mobile-first · 375px wide · ตรวจว่าทุกปุ่มกดได้ด้วยนิ้ว · text อ่านออกบนมือถือ"

Trap 6 — Over-animated

AI ชอบใส่ transition, fade-in, hover effect ทุกที่ · ของจริง animation นาน > 300ms = annoying

วิธีจับ Prompt: "ลบ animation ทั้งหมด · ยกเว้น functional transition (modal open · toast slide)"

Trap 7 — Color = signal alone

AI ใช้สีบอกความหมาย (เขียว=success, แดง=fail) แต่ไม่มี icon/text ประกอบ · color-blind user เห็นเทาเหมือนกัน

วิธีจับ เปิด DevTools → emulate color blindness · ดูว่ายังแยกออกมั้ย

13. ✅ Checklist ก่อนส่งงาน (W12 / W14 / W15)

ก่อนคิดว่า UI "เสร็จ" — เช็คตามนี้:

🧑 User

📐 Layout

🔄 States

📝 Forms

♻️ Reversibility

♿ Accessibility

📱 Mobile

🤖 AI Output Review


📚 อ่านเพิ่ม (Optional)

📌 ใช้หน้านี้ยังไง เปิดทิ้งไว้ในแท็บ "ขณะทำ W12 (Flask/Streamlit) / W14 (Deploy) / W15 (Final Project)" · ทุกครั้งที่ AI สร้าง UI → กลับมาเช็ค checklist ก่อนรับงาน · "ไม่ใช่อ่านครั้งเดียวจบ"