Dark mode
Responsive Design (การออกแบบที่ตอบสนองต่ออุปกรณ์)
เรียนรู้เทคนิคการสร้างเว็บไซต์ที่รองรับทุกขนาดหน้าจอด้วย CSS
พื้นฐานการทำ Responsive
Viewport (วิวพอร์ต)
การตั้งค่า viewport ที่ถูกต้องเป็นสิ่งสำคัญที่สุดในการทำ Responsive Design
html
<!-- ต้องมี meta viewport ใน head ทุกครั้ง -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
TIP
ตรวจสอบ Viewport ผ่าน DevTools: เปิด Developer Tools (F12) > Toggle Device Toolbar (Ctrl+Shift+M)
Media Queries (มีเดีย เควียรี่)
เครื่องมือหลักในการปรับแต่งสไตล์ตามขนาดหน้าจอ
css
/* เริ่มต้นที่มือถือก่อน (Mobile First) */
.container {
padding: 1rem; /* ระยะห่างขอบในสำหรับมือถือ */
}
/* แท็บเล็ต (768px ขึ้นไป) */
@media (min-width: 768px) {
.container {
padding: 2rem;
}
}
/* เดสก์ท็อป (1024px ขึ้นไป) */
@media (min-width: 1024px) {
.container {
max-width: 1200px; /* จำกัดความกว้างสูงสุด */
margin: 0 auto; /* จัดกึ่งกลาง */
}
}
ข้อควรระวัง
ควรใช้ Mobile First Approach เพื่อประสิทธิภาพที่ดีกว่า
เทคนิคการจัดเลย์เอาท์แบบยืดหยุ่น
Flexbox (การจัดเรียงแบบยืดหยุ่น)
css
.nav {
display: flex;
flex-wrap: wrap; /* อนุญาตให้ขึ้นบรรทัดใหม่ */
gap: 1rem; /* ระยะห่างระหว่างไอเทม */
justify-content: space-between; /* จัดวางไอเทม */
align-items: center; /* จัดแนวแนวตั้ง */
}
CSS Grid (กริดแบบยืดหยุ่น)
css
.grid-container {
display: grid;
/* auto-fit + minmax() ทำให้กริดยืดหยุ่นตามขนาดหน้าจอ */
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 1rem;
padding: 1rem;
}
เคล็ดลับ
- ใช้ Flexbox สำหรับ 1 มิติ (แถวหรือคอลัมน์)
- ใช้ Grid สำหรับ 2 มิติ (ทั้งแถวและคอลัมน์)
การทำงานกับตัวอักษรและรูปภาพ
Fluid Typography (ตัวอักษรที่ปรับขนาดได้)
css
:root {
--text-base: 1rem; /* 16px เป็นค่าเริ่มต้น */
}
h1 {
/* ขนาดขั้นต่ำ: 1.5rem, ขนาดอ้างอิง: 5vw, ขนาดสูงสุด: 2.5rem */
font-size: clamp(1.5rem, 5vw, 2.5rem);
}
p {
/* อ่านเพิ่มเติม: https://developer.mozilla.org/en-US/docs/Web/CSS/clamp */
font-size: clamp(1rem, 2.5vw, 1.25rem);
line-height: 1.6; /* ระยะห่างระหว่างบรรทัด */
}
Responsive Images (รูปภาพที่ปรับขนาดได้)
html
<picture>
<!-- หน้าจอใหญ่ 1024px+ -->
<source media="(min-width: 1024px)" srcset="large.jpg">
<!-- แท็บเล็ต 768px-1023px -->
<source media="(min-width: 768px)" srcset="medium.jpg">
<!-- มือถือ (ค่าเริ่มต้น) -->
<img
src="small.jpg"
alt="คำอธิบายรูปภาพ"
style="width: 100%; height: auto;"
loading="lazy" /* โหลดแบบขี้เกียจ */
>
</picture>
ข้อควรระวัง
- อย่าลืมใส่
alt
เสมอ - ใช้
loading="lazy"
สำหรับรูปภาพที่อยู่ด้านล่าง - ควรบีบอัดรูปภาพก่อนอัปโหลด
Aspect Ratio (อัตราส่วนภาพ)
css
/* วิดีโอ 16:9 */
.video-container {
aspect-ratio: 16 / 9;
width: 100%;
background: #eee;
}
/* การ์ดรูปภาพ 2:3 */
.card {
aspect-ratio: 2 / 3;
object-fit: cover; /* ปรับรูปให้เต็มพื้นที่ */
}
เทคนิคขั้นสูง
CSS Custom Properties (ตัวแปร CSS)
css
:root {
/* สีหลัก */
--primary: #2563eb;
--primary-dark: #1d4ed8;
/* ธีมสว่าง (ค่าเริ่มต้น) */
--text: #1f2937;
--bg: #ffffff;
--surface: #f9fafb;
/* ระยะห่าง */
--space-sm: 0.5rem;
--space-md: 1rem;
--space-lg: 2rem;
}
/* ธีมมืด */
@media (prefers-color-scheme: dark) {
:root {
--text: #f3f4f6;
--bg: #111827;
--surface: #1f2937;
}
}
Container Queries (คอนเทนเนอร์ เควียรี่)
css
/* ประกาศ container */
.card {
container-type: inline-size; /* ใช้ inline-size สำหรับความกว้าง */
container-name: card; /* ตั้งชื่อ container */
}
/* ใช้ @container query */
@container card (min-width: 500px) {
.card-content {
display: flex;
gap: 1rem;
}
.card-image {
flex: 0 0 200px; /* กำหนดขนาดรูปภาพ */
}
}