การเลือกไม่รวม Desktop และ Mobile ด้วย Responsive CSS และวิธีการตรวจสอบ
บทนำ
เมื่อสร้าง UI แนวคิด “เขียน @media ใน CSS แล้วจัดการ desktop และ mobile ในที่เดียว” เป็นเรื่องปกติ
อย่างไรก็ตาม แอพนี้ใช้แนวทาง ไม่ใช้ @media-based responsive CSS แต่ออกแบบ desktop และ mobile screens เป็นไฟล์แยกกันอย่างสมบูรณ์
บทความนี้บันทึกว่าทำไมเราเลือกแนวทางนั้น และวิธีการตรวจสอบแต่ละส่วน

ทำไมเราไม่ “รวมด้วย @media”
① Desktop และ Mobile มี “สิ่งที่ต้องการแสดงและโต้ตอบ” ต่างกัน
Desktop สามารถเพิ่ม information density ด้วย fixed-width layout
Mobile ให้ความสำคัญกับ tap operations ก่อน ไหลเนื้อหาใน single column
ความแตกต่างนี้ไม่สามารถแก้ได้ด้วยการ “เปลี่ยนความกว้างด้วย CSS” เพียงอย่างเดียว โครงสร้าง component ลำดับ element และขนาดปุ่ม — ทุกอย่างเปลี่ยน
การพยายามเปลี่ยนเฉพาะรูปลักษณ์ของ HTML เดียวกันด้วย @media มักสร้างหน้าจอที่ไม่ได้ optimize สำหรับ desktop หรือ mobile
② การเพิ่ม “Mobile Support” ทีหลังทำให้ CSS เปราะบาง
แนวทางการเพิ่ม @media ทีหลังให้กับ components ที่สร้างสำหรับ desktop นำไปสู่ CSS overrides ที่ซับซ้อน เพิ่มความเสี่ยงในการทำลาย desktop layout
③ การ Test และ Review มักจะ “ตรวจสอบแค่ด้านเดียว”
เมื่อ desktop และ mobile styles ผสมกันในไฟล์เดียว การแก้ไขด้านหนึ่งมักทำให้อีกด้านพังโดยไม่สังเกตเห็น
นโยบายของแอพนี้
| เป้าหมาย | นโยบาย |
|---|---|
| Desktop screens | กำลังทำงานอยู่ FilmsView.vue, FilmDetailView.vue ฯลฯ — ออกแบบเฉพาะ desktop |
| Mobile screens | จะ implement เป็น separate components และ separate files ในอนาคต |
ห้าม:
- เพิ่ม
@mediaให้ desktop components ที่มีอยู่ภายหลัง - ใช้ Bootstrap หรือ Tailwind’s “two birds with one stone responsive support”
- ตรวจสอบ desktop และ mobile ในไฟล์เดียวกัน
ขั้นตอนการตรวจสอบ Desktop Screen
1. เปิด Chrome DevTools ใน Desktop Mode
1. F12 (เปิด DevTools)
2. ยืนยันว่า device toolbar (ไอคอนโทรศัพท์) เป็น OFF
3. รักษาความกว้าง window ไว้ที่ 1200px หรือมากกว่า
อย่าสลับไปยัง Responsive mode (mobile simulator ของ DevTools)
Desktop components ควรตรวจสอบที่ desktop width
2. Operate และตรวจสอบแต่ละหน้าจอหลักตามลำดับ
- รายชื่อภาพยนตร์ (ทั้ง sidebar ขยายและพับ)
- รายละเอียดภาพยนตร์ (image fallback, video playback)
- Login และ member registration flow
- My Page, rental history, payment history
- Payment flow (normal header สลับเป็น Isolated Checkout header)
3. ตรวจสอบโดยเปลี่ยน Authentication State
ยังไม่ login → ดูรายชื่อภาพยนตร์ → รายละเอียด → Login → ไปยัง My Page
Login แล้ว → My Page → History → Payment flow
ตรวจสอบว่า layout สลับอย่างถูกต้องก่อนและหลัง login
// App.vue (implementation สลับการแสดง tab ตาม auth state)
<a
v-if="!isAuthenticated"
@click="currentPage = 'auth'"
>
Login / Register
</a>
<a
v-else
@click="currentPage = 'mypage'"
>
My Page
</a>
ขั้นตอนการตรวจสอบ Mobile Screen (เมื่อ Implement ในอนาคต)
Mobile screens จะถูกสร้างเป็น separate components และ separate files จาก desktop
การตรวจสอบก็จะแยกกันอย่างสมบูรณ์
❌ ตรวจสอบ desktop components ใน Responsive mode ของ Chrome DevTools
✅ ตรวจสอบ mobile-specific components บน actual device หรือ Chrome DevTools mobile simulator
การตรวจสอบความกว้างหน้าจอใน Vue 3 (อ้างอิง: ตั้งใจใช้สำหรับ Mobile Implementation ในอนาคต)
เมื่อสร้าง mobile-specific components บางครั้งอาจต้องการการตรวจสอบความกว้างหน้าจอด้วย JS
สิ่งนี้ใช้สำหรับ “การเริ่มต้น mobile-specific component” เท่านั้น ไม่ใช่สำหรับผสมเข้าไปใน desktop components
// กำหนด initial sidebar state ตามความกว้างหน้าจอ (ตัวอย่าง: desktop-only component)
const isSidebarOpen = ref(window.innerWidth > 991)
// กำหนดความกว้างหน้าจอด้วย matchMedia (อ้างอิงสำหรับ mobile-specific components ในอนาคต)
const isMobile = window.matchMedia('(max-width: 991px)').matches
สรุป
นโยบายของแอพนี้:
❌ เขียน @media เพื่อรวม desktop และ mobile support ในที่เดียว
❌ ใช้ responsive grid ของ Bootstrap เพื่อ "two birds with one stone"
❌ เพิ่ม @media ให้ desktop components ที่มีอยู่ภายหลัง
✅ ออกแบบ desktop และ mobile screens เป็น separate files ตั้งแต่แรก
✅ ตรวจสอบ desktop ที่ desktop width, ตรวจสอบ mobile ด้วยวิธีเฉพาะ mobile
✅ แยก implementation timing ของทั้งสองให้เป็นอิสระ
การตัดสินใจคือ “ออกแบบเป็น separate screens ตั้งแต่แรก” แทนที่จะเป็น “เขียน @media = รองรับทั้งหมดแล้ว”
นโยบายการออกแบบของแอพนี้: สร้าง Mobile-Specific Screens แยกต่างหากแทนที่จะเป็น Responsive
แอพ DVD rental นี้ ไม่ใช้ responsive design
นโยบายที่เลือกใช้
| รายการ | เนื้อหา |
|---|---|
| PC screen | Fixed width 1240px (min-width: 1240px), horizontal scroll operation |
| Mobile screen | จะถูกสร้างแยกต่างหากเป็น mobile-specific component ภายในแอพเดียวกัน |
| Features | ทั้ง PC และ mobile screens มี features เทียบเท่ากัน |
@media queries | โดยพื้นฐานไม่รวมไว้ใน PC components |
/* App.vue: PC screen ด้วย fixed width และ horizontal scroll support */
.page-shell {
min-width: 1240px; /* แม้ความกว้างจะลด ก็ยังเข้าถึง right edge ด้วย horizontal scroll */
}
แทนที่จะซ่อน right edge ด้วย overflow-x: hidden การออกแบบรักษาความสามารถในการเข้าถึง right column ผ่าน horizontal scroll
ทำไมไม่ Responsive?
แนวทาง responsive ที่แนะนำในบทความนี้คือเรื่อง “จัดการ devices ทั้งหมดด้วย component เดียว”
ในทางกลับกัน เนื่องจาก information density, operation style และ layout policy แตกต่างกันอย่างมีนัยสำคัญระหว่าง PC และ mobile ในโปรเจกต์นี้
แทนที่จะเพิ่ม @media ให้ component เดียวกันทีหลัง เราเลือก ออกแบบ mobile-specific components แยกต่างหาก
การตัดสินใจนี้ตามแนวคิดเดียวกับที่ e-commerce services เช่น Amazon, Rakuten และ DMM
ออกแบบ PC และ mobile เป็น UI ที่แยกกันอย่างสมบูรณ์
สรุป
Checklist ที่แนะนำในบทความนี้ครอบคลุม “verification items เมื่อทำ code เดียวให้ responsive”
เมื่อใช้นโยบายการออกแบบ “สร้าง dedicated screen แยกสำหรับ mobile” scope ของ checklist นี้ใช้กับการพัฒนา mobile-specific component
แผนที่บทความของ Series นี้
→ การสร้างแอพ DVD Rental สำหรับผู้ใช้ควบคู่กับหน้าจัดการ — ภาพรวมโครงสร้าง Vue 3 + Spring Boot