Article · programming
CSS Responsive Design และการ์ดบริการ
HTML & CSS
บทเรียน HTML และ CSS EP27 เรียนรู้ Responsive Design, Flexbox, CSS Grid, Media Queries และการสร้างการ์ดบริการที่นำไปประยุกต์ใช้กับเว็บไซต์ธุรกิจและพอร์ตโฟลิโอได้จริง พร้อมตัวอย่าง Full-page HTML ที่ทดลองได้ทันที
1. Responsive Design คืออะไร
เว็บไซต์ในปัจจุบันต้องรองรับหน้าจอหลายขนาด ตั้งแต่โทรศัพท์มือถือ แท็บเล็ต ไปจนถึงคอมพิวเตอร์ หากเราออกแบบเว็บไซต์ให้มีความกว้างตายตัว เนื้อหาอาจล้นหน้าจอ ตัวอักษรเล็กเกินไป หรือการ์ดแต่ละใบเบียดกันจนใช้งานยาก
**Responsive Design** คือแนวทางออกแบบเว็บไซต์ให้โครงสร้างและองค์ประกอบปรับตามพื้นที่แสดงผล โดยใช้ HTML กำหนดโครงสร้าง และ CSS ควบคุมการจัดวาง ขนาดตัวอักษร ระยะห่าง และจุดเปลี่ยนของเลย์เอาต์ เป้าหมายไม่ใช่เพียงทำให้เว็บไซต์ย่อเล็กลง แต่ต้องรักษาความอ่านง่ายและการใช้งานที่ดีบนทุกอุปกรณ์
หลักคิดของ EP27ออกแบบเนื้อหาให้ชัดเจนก่อน แล้วใช้ CSS ปรับการจัดวางตามพื้นที่จริง แทนการกำหนดขนาดตายตัวให้ทุกองค์ประกอบ
2. เทคนิค CSS ที่ควรรู้
| เทคนิค | หน้าที่ | เหมาะกับงาน |
|---|---|---|
| Flexbox | จัดองค์ประกอบตามแนวแถวหรือแนวคอลัมน์ | แถบนำทาง ปุ่ม และการจัดกลุ่มองค์ประกอบ |
| CSS Grid | จัดเลย์เอาต์เป็นแถวและคอลัมน์ | การ์ดสินค้า การ์ดบริการ และแกลเลอรี |
| Media Queries | เปลี่ยนกฎ CSS ตามเงื่อนไข เช่น ความกว้างหน้าจอ | ปรับจำนวนคอลัมน์และระยะห่างบนมือถือ |
| minmax() และ auto-fit | กำหนดขนาดคอลัมน์ที่ยืดหยุ่น | สร้างกริดที่ปรับจำนวนคอลัมน์โดยอัตโนมัติ |
| clamp() | กำหนดขนาดที่ยืดหยุ่นพร้อมค่าต่ำสุดและสูงสุด | หัวข้อและระยะห่างที่ปรับตามหน้าจอ |
2.1 Flexbox สำหรับการจัดแนว
Flexbox เหมาะกับองค์ประกอบที่ต้องจัดเรียงตามแนวหลัก เช่น โลโก้และเมนูในแถบนำทาง คำสั่ง `display: flex` เปิดใช้ Flexbox ส่วน `justify-content` ควบคุมการกระจายพื้นที่ตามแนวหลัก และ `align-items` ใช้จัดแนวตามแนวขวาง
หากพื้นที่ไม่เพียงพอ สามารถใช้ `flex-wrap: wrap` เพื่อให้องค์ประกอบขึ้นบรรทัดใหม่ได้ แทนการบังคับให้ทุกอย่างอยู่ในแถวเดียว
.navigation {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
flex-wrap: wrap;
}
.navigation a {
text-decoration: none;
padding: 8px 12px;
}
@media (max-width: 600px) {
.navigation {
flex-direction: column;
align-items: stretch;
}
}
2.2 CSS Grid สำหรับการ์ดหลายคอลัมน์
เมื่อสร้างรายการบริการหรือสินค้า CSS Grid ช่วยให้จัดวางการ์ดได้เป็นระเบียบ รูปแบบ `repeat(auto-fit, minmax(230px, 1fr))` อนุญาตให้เบราว์เซอร์จัดจำนวนคอลัมน์ตามพื้นที่ที่มี โดยพยายามรักษาความกว้างขั้นต่ำของแต่ละคอลัมน์ไว้ที่ 230 พิกเซล
วิธีนี้เหมาะกับกรณีที่จำนวนการ์ดเปลี่ยนแปลงได้ เพราะไม่ต้องเขียนกฎแยกสำหรับทุกจำนวนคอลัมน์ อย่างไรก็ตาม ควรทดสอบกับเนื้อหาและขนาดหน้าจอจริง เพราะความกว้างที่เหมาะสมขึ้นอยู่กับรายละเอียดภายในแต่ละการ์ดด้วย
.service-grid {
display: grid;
grid-template-columns: repeat(
auto-fit,
minmax(min(100%, 230px), 1fr)
);
gap: 20px;
}
.service-card {
min-width: 0;
padding: 24px;
border-radius: 16px;
background: #ffffff;
border: 1px solid #dbe4f0;
}
2.3 Media Queries สำหรับหน้าจอขนาดเล็ก
Media Queries ช่วยกำหนดเงื่อนไขว่า CSS ชุดใดจะทำงานเมื่อหน้าจอมีขนาดตามที่ระบุ ตัวอย่างเช่น ปรับระยะห่างของส่วนหัว ลดขนาดตัวอักษร หรือเปลี่ยนแถบนำทางจากแนวนอนเป็นแนวตั้ง
ค่าความกว้างที่ใช้เป็นจุดเปลี่ยนควรอิงจากจุดที่เนื้อหาเริ่มจัดวางไม่เหมาะสม ไม่จำเป็นต้องใช้ค่ามาตรฐานเดียวกับทุกโครงการ และควรเริ่มออกแบบจากหน้าจอขนาดเล็กก่อนเมื่อเหมาะกับลักษณะผู้ใช้งาน
3. ตัวอย่างจริง: หน้าแสดงการ์ดบริการแบบ Responsive
ตัวอย่างนี้เป็นเว็บไซต์แนะนำบริการสำหรับธุรกิจขนาดเล็ก ประกอบด้วยแถบนำทาง ส่วนแนะนำบริการ การ์ดบริการสามประเภท และส่วนติดต่อ จุดเด่นคือการใช้ CSS Grid เพื่อปรับจำนวนคอลัมน์ตามพื้นที่ ใช้ `clamp()` สำหรับขนาดหัวข้อ และใช้ Media Query ปรับส่วนหัวให้เหมาะกับหน้าจอแคบ
คัดลอกโค้ดทั้งหมดลงในไฟล์ `index.html` แล้วเปิดด้วยเว็บเบราว์เซอร์ได้ทันที ตัวอย่างนี้ใช้เนื้อหาสาธิตและยังไม่มีระบบหลังบ้านหรือการส่งแบบฟอร์ม
<!DOCTYPE html>
<html lang="th">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="ตัวอย่างหน้าแสดงบริการด้วย Responsive Design">
<title>Responsive Service Studio</title>
<style>
:root {
--primary: #2563eb;
--primary-dark: #1d4ed8;
--text: #172033;
--muted: #64748b;
--surface: #ffffff;
--background: #f1f5f9;
--border: #dbe4f0;
--radius: 18px;
}
* {
box-sizing: border-box;
}
html {
scroll-behavior: smooth;
}
body {
margin: 0;
font-family: Tahoma, Arial, sans-serif;
color: var(--text);
background: var(--background);
line-height: 1.7;
}
a {
color: inherit;
}
.container {
width: min(1100px, calc(100% - 32px));
margin-inline: auto;
}
.site-header {
background: var(--surface);
border-bottom: 1px solid var(--border);
}
.nav {
min-height: 72px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 18px;
}
.brand {
color: var(--primary);
font-size: 1.25rem;
font-weight: 800;
text-decoration: none;
}
.nav-links {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 18px;
}
.nav-links a {
text-decoration: none;
font-weight: 600;
}
.nav-links a:hover {
color: var(--primary);
}
.hero {
padding: clamp(48px, 8vw, 88px) 0;
background: linear-gradient(135deg, #dbeafe, #f8fafc 75%);
}
.hero-inner {
max-width: 760px;
text-align: center;
margin-inline: auto;
}
.eyebrow {
color: var(--primary);
font-weight: 800;
letter-spacing: .06em;
text-transform: uppercase;
}
h1 {
margin: 12px 0;
font-size: clamp(2rem, 5vw, 3.5rem);
line-height: 1.2;
}
.hero p {
color: var(--muted);
font-size: clamp(1rem, 2vw, 1.125rem);
margin: 16px 0 24px;
}
.button {
display: inline-block;
padding: 12px 20px;
border-radius: 10px;
background: var(--primary);
color: #ffffff;
text-decoration: none;
font-weight: 700;
transition: background .2s ease, transform .2s ease;
}
.button:hover {
background: var(--primary-dark);
transform: translateY(-2px);
}
.button:focus-visible,
.nav-links a:focus-visible {
outline: 3px solid #f59e0b;
outline-offset: 4px;
}
.services {
padding-block: 60px;
}
.section-heading {
max-width: 680px;
margin: 0 auto 30px;
text-align: center;
}
.section-heading h2 {
margin: 0 0 10px;
font-size: clamp(1.6rem, 3vw, 2.2rem);
line-height: 1.3;
}
.section-heading p {
margin: 0;
color: var(--muted);
}
.service-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(100%, 250px), 1fr));
gap: 20px;
}
.service-card {
min-width: 0;
display: flex;
flex-direction: column;
align-items: flex-start;
padding: 24px;
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius);
box-shadow: 0 8px 24px rgba(15, 23, 42, .05);
transition: transform .2s ease, box-shadow .2s ease;
}
.service-card:hover {
transform: translateY(-4px);
box-shadow: 0 14px 30px rgba(15, 23, 42, .1);
}
.service-icon {
width: 48px;
height: 48px;
display: grid;
place-items: center;
border-radius: 14px;
background: #dbeafe;
color: var(--primary);
font-size: 1.4rem;
font-weight: 800;
}
.service-card h3 {
margin: 18px 0 8px;
font-size: 1.25rem;
}
.service-card p {
margin: 0 0 18px;
color: var(--muted);
}
.service-card a {
margin-top: auto;
color: var(--primary);
font-weight: 700;
text-decoration-thickness: 2px;
text-underline-offset: 4px;
}
.contact {
margin-bottom: 56px;
padding: clamp(28px, 5vw, 48px);
border-radius: var(--radius);
background: #172033;
color: #ffffff;
text-align: center;
}
.contact h2 {
margin-top: 0;
font-size: clamp(1.5rem, 3vw, 2rem);
}
.contact p {
max-width: 620px;
margin: 0 auto 22px;
color: #cbd5e1;
}
footer {
padding: 22px 0;
background: var(--surface);
border-top: 1px solid var(--border);
color: var(--muted);
text-align: center;
}
@media (max-width: 600px) {
.nav {
align-items: flex-start;
flex-direction: column;
justify-content: center;
padding-block: 14px;
}
.nav-links {
gap: 12px;
}
.hero-inner {
text-align: left;
}
.hero .button {
text-align: center;
}
.service-card {
padding: 20px;
}
}
@media (prefers-reduced-motion: reduce) {
html {
scroll-behavior: auto;
}
*, *::before, *::after {
transition-duration: .01ms !important;
animation-duration: .01ms !important;
}
}
</style>
</head>
<body>
<header class="site-header">
<nav class="container nav" aria-label="เมนูหลัก">
<a class="brand" href="#home">Responsive Studio</a>
<div class="nav-links">
<a href="#services">บริการ</a>
<a href="#contact">ติดต่อ</a>
</div>
</nav>
</header>
<main>
<section class="hero" id="home">
<div class="container hero-inner">
<div class="eyebrow">Design for every screen</div>
<h1>เว็บไซต์ที่ดี ต้องใช้งานง่ายทุกอุปกรณ์</h1>
<p>สร้างประสบการณ์ออนไลน์ที่ชัดเจนและอ่านง่าย ด้วยการออกแบบที่ปรับตามหน้าจอของผู้ใช้งาน</p>
<a class="button" href="#services">สำรวจบริการ</a>
</div>
</section>
<section class="container services" id="services">
<div class="section-heading">
<h2>บริการของเรา</h2>
<p>ตัวอย่างการจัดวางการ์ดด้วย CSS Grid ซึ่งจะปรับจำนวนคอลัมน์ตามพื้นที่ที่มี</p>
</div>
<div class="service-grid">
<article class="service-card">
<div class="service-icon" aria-hidden="true">01</div>
<h3>Landing Page</h3>
<p>หน้าเว็บไซต์สำหรับนำเสนอสินค้า แคมเปญ หรือบริการด้วยข้อความที่ตรงเป้าหมาย</p>
<a href="#contact">สอบถามรายละเอียด</a>
</article>
<article class="service-card">
<div class="service-icon" aria-hidden="true">02</div>
<h3>Business Website</h3>
<p>เว็บไซต์แนะนำธุรกิจที่จัดระเบียบข้อมูลบริการ ผลงาน และช่องทางติดต่อ</p>
<a href="#contact">สอบถามรายละเอียด</a>
</article>
<article class="service-card">
<div class="service-icon" aria-hidden="true">03</div>
<h3>Responsive Design</h3>
<p>ปรับการจัดวางให้เหมาะกับหน้าจอหลายขนาด พร้อมคำนึงถึงการเข้าถึง</p>
<a href="#contact">สอบถามรายละเอียด</a>
</article>
</div>
</section>
<section class="container contact" id="contact">
<h2>พร้อมเริ่มต้นโปรเจกต์หรือยัง?</h2>
<p>เปลี่ยนข้อความตัวอย่างนี้ให้เป็นข้อเสนอของธุรกิจจริง และใส่ช่องทางติดต่อที่ตรวจสอบแล้ว</p>
<a class="button" href="mailto:[email protected]">ส่งอีเมลสอบถาม</a>
</section>
</main>
<footer>
<div class="container">© 2026 Responsive Studio — ตัวอย่างสำหรับฝึกพัฒนาเว็บไซต์</div>
</footer>
</body>
</html>
4. อ่านโค้ดตัวอย่างอย่างเป็นระบบ
4.1 ใช้ตัวแปร CSS เพื่อให้แก้ธีมได้ง่าย
ส่วน `:root` กำหนดตัวแปร เช่น `--primary`, `--text` และ `--background` เพื่อให้สีที่ใช้ซ้ำมีแหล่งกำหนดเดียว เมื่อต้องเปลี่ยนสีหลักของแบรนด์จึงแก้ได้ง่ายกว่าเขียนค่าสีซ้ำหลายตำแหน่ง
แนวทางนี้ช่วยให้ดูแลโค้ดได้สะดวก โดยเฉพาะเมื่อเว็บไซต์มีหลายหน้าและใช้ชุดสีร่วมกัน
4.2 ใช้ clamp() กับขนาดตัวอักษร
คำสั่ง `clamp(ค่าต่ำสุด, ค่าที่ยืดหยุ่น, ค่าสูงสุด)` ช่วยให้ขนาดหัวข้อปรับตามพื้นที่ได้โดยไม่เล็กหรือใหญ่เกินค่าที่กำหนด เช่น `font-size: clamp(2rem, 5vw, 3.5rem);` หมายถึงขนาดจะปรับตามความกว้างของหน้าจอ แต่มีขอบเขตขั้นต่ำและขั้นสูงสุด
การใช้ clamp() ไม่ได้แทนการทดสอบจริง ควรตรวจสอบว่าหัวข้อภาษาไทยไม่ตัดบรรทัดอย่างไม่เหมาะสม และยังอ่านได้เมื่อขยายตัวอักษร
4.3 ใช้ min-width: 0 กับเนื้อหากริด
ในเลย์เอาต์ที่ใช้ Grid หรือ Flexbox เนื้อหาบางประเภทอาจทำให้คอลัมน์กว้างเกินพื้นที่ เช่น ข้อความยาวหรือองค์ประกอบที่มีขนาดขั้นต่ำสูง การกำหนด `min-width: 0` ให้การ์ดช่วยให้รายการสามารถหดตามพื้นที่ที่จัดสรรได้ จากนั้นควรตรวจสอบเนื้อหาภายในเพิ่มเติมเพื่อป้องกันข้อความหรือรูปภาพล้นกรอบ
5. ปรับตัวอย่างให้เป็นเว็บไซต์สำหรับลูกค้าจริง
ต้นแบบจะมีคุณค่ามากขึ้นเมื่อเปลี่ยนให้ตรงกับปัญหาของธุรกิจหนึ่งประเภท อย่าเริ่มด้วยการใส่ทุกฟังก์ชัน แต่ให้กำหนดเป้าหมายหลักของหน้าเว็บก่อน เช่น ให้ผู้ใช้โทรติดต่อ ดูบริการ หรือส่งคำขอใบเสนอราคา
| ประเภทธุรกิจ | เนื้อหาที่ควรเน้น | องค์ประกอบที่ควรมี |
|---|---|---|
| ร้านอาหาร | เมนู เวลาเปิด และตำแหน่งร้าน | รายการเมนู ลิงก์แผนที่ และช่องทางติดต่อ |
| ร้านเสริมสวย | บริการ ราคา และผลงาน | การ์ดบริการ แกลเลอรีที่ได้รับอนุญาต และช่องทางจอง |
| ผู้ให้บริการอิสระ | ความเชี่ยวชาญและผลงาน | แนะนำตัว ตัวอย่างงาน และปุ่มติดต่อ |
| ธุรกิจซอฟต์แวร์ | คุณสมบัติและประโยชน์ของผลิตภัณฑ์ | ส่วนแนะนำผลิตภัณฑ์ รายละเอียด และคำถามที่พบบ่อย |
6. ตรวจสอบ Responsive Design ก่อนส่งมอบ
การดูเว็บไซต์เพียงบนหน้าจอของตนเองยังไม่เพียงพอ ควรตรวจสอบอย่างน้อยทั้งหน้าจอแคบ หน้าจอขนาดกลาง และหน้าจอขนาดใหญ่ โดยทดสอบเนื้อหาจริงที่มีความยาวแตกต่างกัน รวมถึงการขยายตัวอักษรและการใช้งานด้วยคีย์บอร์ด
| รายการทดสอบ | สิ่งที่ต้องตรวจ | ผลที่ต้องการ |
|---|---|---|
| หน้าจอมือถือ | เมนู การ์ด และปุ่มไม่เบียดกัน | อ่านง่ายและกดใช้งานสะดวก |
| หน้าจอแท็บเล็ต | ช่องว่างและจำนวนคอลัมน์เหมาะสม | เนื้อหาไม่กระจุกตัวหรือกระจายเกินไป |
| หน้าจอคอมพิวเตอร์ | ความกว้างเนื้อหาและระยะห่าง | อ่านสบายและใช้พื้นที่อย่างเหมาะสม |
| เนื้อหายาว | หัวข้อและลิงก์ไม่ดันการ์ดให้ล้น | การ์ดจัดวางเป็นระเบียบ |
| การเข้าถึง | โฟกัสคีย์บอร์ด สี และลำดับหัวข้อ | ผู้ใช้หลายรูปแบบเข้าถึงเนื้อหาได้ |
| การเคลื่อนไหว | เอฟเฟกต์ hover และการตั้งค่า reduced motion | ไม่พึ่งพาการเคลื่อนไหวเพื่อสื่อสารข้อมูลสำคัญ |
ข้อควรระวังอย่าซ่อนเนื้อหาสำคัญเพียงเพราะหน้าจอเล็ก และอย่าใช้การกำหนดความกว้างตายตัวกับทุกการ์ด หากข้อความหรือชื่อบริการยาวกว่าตัวอย่าง ควรทดสอบและปรับการจัดวางให้รองรับข้อมูลจริง
7. ต่อยอดเป็นโอกาสสร้างรายได้
ทักษะ Responsive Design สามารถนำไปใช้กับงานรับทำเว็บไซต์ธุรกิจ หน้าโปรโมตสินค้า การปรับเว็บไซต์เดิมให้เหมาะกับมือถือ และการสร้างแม่แบบสำหรับใช้งานซ้ำได้ ก่อนรับงานควรประเมินขอบเขตให้ชัดเจนว่าเป็นเพียงการปรับ CSS หรือรวมการออกแบบเนื้อหา การติดตั้งโดเมน การตั้งค่าโฮสต์ และการดูแลหลังส่งมอบด้วย
การคิดราคาอาจใช้รูปแบบต่อโครงการ ต่อหน้า หรือแพ็กเกจดูแลรายเดือนตามลักษณะงานจริง ควรคำนึงถึงเวลาแก้ไข การทดสอบ การสื่อสารกับลูกค้า และค่าใช้จ่ายต่อเนื่อง ไม่ควรรับประกันยอดขายหรือรายได้จากการทำเว็บไซต์เพียงอย่างเดียว
แผนฝึกทำผลงานใน 5 ขั้นตอน
1. เลือกประเภทธุรกิจสมมติหนึ่งประเภท
2. สร้างหน้าเว็บที่มีส่วนหัว ส่วนแนะนำ และการ์ดบริการ
3. ใช้ CSS Grid หรือ Flexbox เพื่อจัดวางเนื้อหาให้ยืดหยุ่น
4. ทดสอบบนหน้าจอหลายขนาด พร้อมตรวจลิงก์และการเข้าถึง
5. บันทึกภาพหน้าจอและอธิบายว่าออกแบบเพื่อแก้ปัญหาใด โดยระบุให้ชัดเจนว่าเป็นผลงานทดลองหากยังไม่ได้ทำให้ลูกค้าจริง
8. คำถามที่พบบ่อย
ต้องใช้ JavaScript เพื่อทำ Responsive Design หรือไม่?
ไม่จำเป็น CSS Grid, Flexbox และ Media Queries สามารถจัดการ Responsive Design ได้หลายกรณี JavaScript มีประโยชน์เมื่อจำเป็นต้องเพิ่มพฤติกรรม เช่น เมนูที่เปิดปิดได้หรือการโต้ตอบที่ซับซ้อน
ควรเลือก Grid หรือ Flexbox?
ใช้ Flexbox เมื่อต้องการจัดองค์ประกอบตามแนวหลัก เช่น แถบนำทางหรือกลุ่มปุ่ม ใช้ Grid เมื่อต้องการจัดเลย์เอาต์เป็นแถวและคอลัมน์ เช่น การ์ดบริการ ทั้งสองเทคนิคสามารถใช้ร่วมกันในหน้าเดียวได้
ต้องกำหนด Media Query หลายจุดหรือไม่?
ไม่จำเป็นต้องมีจำนวนจุดเปลี่ยนตายตัว เริ่มจากเลย์เอาต์ที่ยืดหยุ่น แล้วเพิ่ม Media Query เมื่อเนื้อหาเริ่มจัดวางไม่เหมาะสม ทดสอบจากความต้องการจริงแทนการเลือกค่าตามอุปกรณ์เพียงอย่างเดียว
โค้ดตัวอย่างพร้อมนำไปใช้กับธุรกิจจริงหรือยัง?
สามารถใช้เป็นจุดเริ่มต้นได้ แต่ควรเปลี่ยนชื่อธุรกิจ ข้อความ และช่องทางติดต่อให้ถูกต้อง ตรวจสอบลิงก์ รูปลักษณ์บนอุปกรณ์หลายขนาด และสิทธิ์การใช้ทรัพยากรต่าง ๆ ก่อนเผยแพร่ ตัวอย่างนี้ไม่มีระบบหลังบ้านหรือระบบจัดการข้อมูลลูกค้า
เว็บไซต์ที่ยืดหยุ่นไม่ได้เกิดจากการทำให้ทุกอย่างเล็กลง แต่เกิดจากการจัดลำดับความสำคัญของเนื้อหาให้เหมาะกับพื้นที่ที่ผู้ใช้มี
สรุป EP27
Responsive Design เป็นทักษะสำคัญสำหรับการสร้างเว็บไซต์ที่ใช้งานได้จริง CSS Grid เหมาะกับการจัดการ์ดหลายคอลัมน์ Flexbox ช่วยจัดแนวองค์ประกอบ และ Media Queries ใช้ปรับกฎตามพื้นที่แสดงผล เมื่อรวมกับการเลือก HTML ที่มีความหมายและการตรวจสอบการเข้าถึง คุณจะสามารถพัฒนาหน้าเว็บที่มีคุณภาพและต่อยอดเป็นพอร์ตโฟลิโอได้
ภารกิจของ EP27 คือปรับตัวอย่างให้แสดงผลได้ดีทั้งบนมือถือและคอมพิวเตอร์ จากนั้นลองเปลี่ยนการ์ดบริการเป็นสินค้าหรือบริการของธุรกิจสมมติ แล้วตรวจสอบว่าข้อความยาว ปุ่ม และระยะห่างยังใช้งานได้เหมาะสมหรือไม่
เรียนรู้ HTML และ CSS เพิ่มเติม
อ่านจนถึงระยะ 500px ก่อนท้ายหน้าและอยู่ในหน้านี้อย่างน้อย 5 นาที เพื่อรับ EXP วันละครั้ง
⏳ กำลังจับเวลาอ่าน...