CSS Foundation
Day 1 - ชั่วโมงที่ 3: CSS Foundation and Responsive Form Layout
เป้าหมายของชั่วโมงนี้
หลังจบชั่วโมงที่สาม ผู้เรียนควรสามารถ:
- เข้าใจว่า CSS ทำหน้าที่อะไรในหน้าเว็บ
- ใช้ selector พื้นฐานเพื่อเลือก element ที่ต้องการตกแต่งได้
- เข้าใจ box model ได้แก่ content, padding, border และ margin
- จัด layout หน้าเว็บด้วย Flexbox และ Grid ในระดับพื้นฐานได้
- ตกแต่ง form ให้ใช้งานง่ายและอ่านง่ายขึ้น
- ทำ responsive layout เบื้องต้นสำหรับ mobile และ desktop ได้
- เข้าใจ state สำคัญของ UI เช่น hover และ focus
ไฟล์ที่ใช้ในชั่วโมงนี้
CSS ทั้งหมดใส่ใน:
style.cssHTML ที่ต้องเพิ่ม class เช่น form-group หรือ form-row อยู่ใน:
index.htmlถ้า slide เป็น CSS ให้ระบุ:
File: style.cssโครงสร้างเวลา 60 นาที
| เวลา | หัวข้อ | รูปแบบ |
|---|---|---|
| 0-5 นาที | Recap HTML จากชั่วโมงที่สอง | เชื่อมเข้าเนื้อหา |
| 5-15 นาที | CSS คืออะไร และเชื่อมกับ HTML อย่างไร | Explain + demo |
| 15-25 นาที | Selector และ cascade | Live coding |
| 25-35 นาที | Box model และ spacing | Visual explanation |
| 35-45 นาที | Form styling และ UI states | Live coding |
| 45-55 นาที | Responsive layout | Live coding |
| 55-60 นาที | สรุปสิ่งที่ทำ | ทำทีละขั้นตอน |
Slide 1: จากโครงสร้าง HTML สู่หน้าที่อ่านง่าย
Hour 2 เราสร้าง index.html ที่มีส่วนหัว Form แจ้งปัญหา และส่วนท้ายแล้ว
Hour นี้เราจะสร้างไฟล์ style.css เพื่อ:
- จัดระยะห่างและสีของหน้า
- ทำให้ Form อ่านและกรอกได้ง่าย
- แสดง Focus เมื่อผู้ใช้ใช้ Keyboard
- ปรับ Layout ให้เหมาะกับมือถือและหน้าจอกว้าง
CSS เปลี่ยนการแสดงผล แต่ไม่เปลี่ยนความหมายของ HTML หรือข้อมูลใน Form
Slide 2: CSS ทำงานร่วมกับ HTML อย่างไร
CSS ย่อมาจาก Cascading Style Sheets ใช้กำหนดหน้าตาและการจัดวางของ HTML
| HTML: สร้างเนื้อหา | CSS: ตกแต่งเนื้อหา |
|---|---|
<h1>รายการปัญหา</h1> | h1 { color: #0f766e; } |
- HTML สร้างหัวข้อด้วย
<h1> - CSS ใช้ Selector
h1เลือกหัวข้อนั้น แล้วเปลี่ยนสีด้วยcolor
CSS เปลี่ยนเฉพาะหน้าตา ข้อความ “รายการปัญหา” และความหมายของ <h1> ยังเหมือนเดิม
Slide 3: เชื่อม style.css เข้ากับหน้าเว็บ
สร้างไฟล์ใหม่ style.css ไว้ระดับเดียวกับ index.html
project/
index.html
style.cssแก้บางส่วน: เพิ่มบรรทัดนี้ใน <head> ของ index.html
<link rel="stylesheet" href="style.css" />หากชื่อไฟล์หรือ Path ไม่ตรง Browser จะเปิด HTML ได้ แต่ Style จะไม่แสดง
Slide 4: CSS Rule และ Selector
selector {
property: value;
}h1 {
color: #0f172a;
font-size: 32px;
}h1คือ Selector ที่เลือก Elementcolorและfont-sizeคือ Properties- ค่าด้านหลัง
:คือ Values
Selector แบบ Tag เช่น h1 เลือกทุก Tag ชนิดนั้น ส่วน Selector แบบ Class เช่น .form-group เลือกทุก Element ที่มี Class ตรงกัน
Slide 5: เข้าใจ Box Model ก่อนจัดระยะห่าง
ทุก Element บนหน้าเว็บมีลักษณะเป็นกล่อง
- Content คือข้อความหรือเนื้อหาด้านใน
- Padding คือระยะจาก Content ถึง Border
- Border คือขอบของกล่อง
- Margin คือระยะห่างจากกล่องอื่น
เพิ่มไว้บรรทัดแรกของ style.css เพื่อให้ Width รวม Padding และ Border แล้ว:
* {
box-sizing: border-box;
}ปกติถ้ากำหนดกล่องกว้าง 300px แล้วเพิ่ม Padding ซ้ายและขวาด้านละ 20px กล่องจริงจะกว้างเป็น 340px จนอาจเกินพื้นที่ที่เตรียมไว้
box-sizing: border-box เปลี่ยนวิธีคำนวณให้ Padding และ Border รวมอยู่ภายใน 300px กล่องจึงไม่ขยายเกิน Width ที่กำหนด ส่วน * หมายถึงให้ใช้กฎนี้กับทุก Element
Slide 6: กำหนด Style พื้นฐานของหน้า
เพิ่มต่อใน style.css
body {
margin: 0;
font-family: Arial, sans-serif;
background: #f6f7fb;
color: #111827;
line-height: 1.5;
}
main {
width: 100%;
max-width: 760px;
margin: 0 auto;
padding: 24px;
}width: 100%ให้mainใช้พื้นที่เท่าที่หน้าจอมีmax-widthจำกัดความกว้างไม่ให้เนื้อหาอ่านยากmargin: 0 autoจัดmainให้อยู่กลางหน้า
เมื่อใช้ร่วมกับ box-sizing: border-box ค่า padding จะถูกรวมอยู่ภายในความกว้างของ main จึงไม่ดันหน้าให้กว้างเกิน Viewport
Slide 7: แยกส่วนหัวและพื้นที่ Form
เพิ่มต่อใน style.css
header {
background: #0f766e;
color: white;
padding: 32px 24px;
}
header h1 {
margin: 0 0 8px;
}
header p {
margin: 0;
}
section {
background: white;
border: 1px solid #e5e7eb;
border-radius: 8px;
padding: 24px;
}สีพื้นและ Border ช่วยแยกพื้นที่ แต่ข้อความยังต้องมี Contrast เพียงพอให้อ่านง่าย
Slide 8: ตกแต่งส่วนท้ายของหน้า
เพิ่มต่อใน style.css
footer {
color: #64748b;
font-size: 14px;
padding: 24px;
text-align: center;
}
footer p {
margin: 0;
}text-align: center จัดข้อความไว้กึ่งกลาง ส่วนสีและขนาดตัวอักษรที่เบาลงช่วยให้ Footer อ่านได้โดยไม่เด่นกว่าส่วนหลัก
Slide 9: จัด Field ใน Form ให้เป็นกลุ่ม
เพิ่มต่อใน style.css
fieldset {
margin: 0;
padding: 0;
border: 0;
}
legend {
margin-bottom: 16px;
font-size: 20px;
font-weight: 700;
}
.form-group {
display: flex;
flex-direction: column;
gap: 6px;
margin-bottom: 16px;
}
label {
font-weight: 600;
}form-group ใช้ Style ชุดเดียวกับทุก Field ทำให้ Form มีรูปแบบสม่ำเสมอ
Slide 10: ตกแต่ง Input และ Textarea
เพิ่มต่อใน style.css
input,
textarea {
width: 100%;
border: 1px solid #cbd5e1;
border-radius: 6px;
padding: 10px 12px;
font: inherit;
background: white;
}
textarea {
resize: vertical;
}width: 100%ทำให้ Field กว้างตามพื้นที่ของ Formfont: inheritใช้ Font เดียวกับส่วนอื่นของหน้าresize: verticalให้ผู้ใช้ขยาย Textarea ได้เฉพาะแนวตั้ง
Slide 11: แสดง Focus ให้รู้ว่ากำลังกรอก Field ใด
เพิ่มต่อใน style.css
input:focus,
textarea:focus {
outline: 3px solid #99f6e4;
border-color: #0f766e;
}:focus คือ State ที่เกิดขึ้นเมื่อผู้ใช้คลิกหรือใช้ Keyboard มายัง Field
ลองกด Tab เพื่อเลื่อนผ่านแต่ละ Field หากไม่เห็นตำแหน่ง Focus ชัดเจน ผู้ใช้ Keyboard จะใช้งาน Form ได้ยาก
Slide 12: ทำให้ปุ่ม Submit มองเห็นและตอบสนอง
เพิ่มต่อใน style.css
button {
border: 0;
border-radius: 6px;
padding: 12px 16px;
font: inherit;
font-weight: 700;
background: #0f766e;
color: white;
cursor: pointer;
}
button:hover {
background: #115e59;
}:hover แสดงผลเมื่อ Pointer อยู่เหนือปุ่ม ช่วยบอกว่าปุ่มนี้โต้ตอบได้ แต่ข้อความบนปุ่มยังต้องบอกการทำงานให้ชัดเจนด้วย
Slide 13: เตรียมสอง Field สำหรับหน้าจอกว้าง
แก้บางส่วน: ใน index.html ครอบ reporterName และ reporterEmail ด้วย form-row
<div class="form-row">
<div class="form-group">
<label for="reporterName">ชื่อผู้แจ้ง</label>
<input id="reporterName" name="reporterName" type="text" required />
</div>
<div class="form-group">
<label for="reporterEmail">อีเมลผู้แจ้ง</label>
<input id="reporterEmail" name="reporterEmail" type="email" required />
</div>
</div>ตอนนี้หน้าตายังเหมือนเดิม เพราะเรายังไม่ได้กำหนด Style ให้ form-row
Slide 14: เปลี่ยนเป็นสองคอลัมน์ด้วย Media Query
เพิ่มไว้ท้ายไฟล์ style.css
@media (min-width: 720px) {
.form-row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px;
}
}บนหน้าจอเล็ก Field ยังคงเรียงจากบนลงล่างตาม HTML เดิม เมื่อหน้าจอกว้างอย่างน้อย 720px Media Query จึงเปลี่ยน form-row เป็น Grid สองคอลัมน์
แนวทางนี้เรียกว่า Mobile-first เพราะ Style พื้นฐานรองรับจอเล็กก่อน แล้วค่อยเพิ่ม Layout สำหรับจอกว้าง
Slide 15: ตรวจหน้าเว็บก่อนเพิ่ม Issue List
เปิด index.html แล้วตรวจผลลัพธ์:
- หน้าเว็บโหลด
style.cssสำเร็จ - เนื้อหาอยู่กลางหน้าและไม่กว้างเกินไป
- Form มีระยะห่างสม่ำเสมอ
- Footer อยู่กึ่งกลางและแยกจากเนื้อหาหลักชัดเจน
- กด
Tabแล้วเห็น Focus ชัดเจน - ปุ่มเปลี่ยนสีเมื่อ Hover
- จอเล็กแสดง Field แนวตั้ง
- จอกว้างแสดงชื่อและอีเมลสองคอลัมน์
Hour ถัดไปเราจะเพิ่ม Issue List และ Status Badge ก่อนบันทึก Project ด้วย Git