การออกแบบและจัดรูปแบบด้วย CSS
บทเรียนนี้จะเน้นที่ CSS (Cascading Style Sheets) ซึ่งเป็นภาษาที่ใช้ในการจัดรูปแบบและกำหนดการแสดงผลของเอกสาร HTML ทำให้เว็บไซต์มีความสวยงามและน่าใช้งาน
2.1 พื้นฐาน CSS
วิธีการเรียกใช้ CSS
มี 3 วิธีหลักในการนำ CSS ไปใช้กับเอกสาร HTML:
-
Inline Style: ใส่ Style โดยตรงในแท็ก HTML ด้วย Attribute
style(ไม่แนะนำสำหรับงานจริง)<p style="color: blue; font-size: 16px;">ข้อความสีน้ำเงิน</p> -
Internal Style: ใส่ Style ในส่วน
<head>ของเอกสาร HTML โดยใช้แท็ก<style><head> <style> h1 { color: red; } </style> </head> -
External Style (วิธีที่แนะนำ): สร้างไฟล์
.cssแยกต่างหาก และเชื่อมโยงเข้ากับเอกสาร HTML ด้วยแท็ก<link>ในส่วน<head><head> <link rel="stylesheet" href="styles/main.css"> </head>
Syntax และ Selector พื้นฐาน
โครงสร้างของ CSS Rule ประกอบด้วย Selector, Property และ Value
selector {
property: value;
property-2: value-2;
}| Selector | คำอธิบาย | ตัวอย่าง |
|---|---|---|
| Element Selector | เลือกทุก Element ที่ตรงกับชื่อแท็ก | p { color: black; } |
| ID Selector | เลือก Element ที่มี Attribute id ตรงกัน (ใช้ #) |
#header { background: gray; } |
| Class Selector | เลือก Element ที่มี Attribute class ตรงกัน (ใช้ .) |
.button { padding: 10px; } |
| Universal Selector | เลือกทุก Element (ใช้ *) |
* { margin: 0; } |
2.2 Model กล่อง (Box Model)
ทุก Element ใน HTML ถูกมองเป็นกล่อง (Box) ซึ่งประกอบด้วย 4 ส่วนหลักจากด้านในสุดไปด้านนอกสุด:
- Content: เนื้อหาจริงของ Element (ข้อความ, รูปภาพ)
- Padding: ช่องว่างระหว่าง Content กับ Border (ขอบด้านใน)
- Border: เส้นขอบที่ล้อมรอบ Padding และ Content
- Margin: ช่องว่างภายนอก Border (ขอบด้านนอก)
.box {
width: 200px;
height: 100px;
padding: 20px; /* ช่องว่างภายใน 20px รอบด้าน */
border: 5px solid red; /* เส้นขอบหนา 5px สีแดง */
margin: 10px 20px; /* ช่องว่างภายนอก บน-ล่าง 10px, ซ้าย-ขวา 20px */
}Box Sizing: โดยค่าเริ่มต้น width และ height จะกำหนดขนาดของ Content เท่านั้น แต่เราสามารถเปลี่ยนให้รวม Padding และ Border ได้ด้วย box-sizing: border-box; (แนะนำให้ใช้)
* {
box-sizing: border-box; /* ทำให้ width และ height รวม padding และ border */
}2.3 การจัดรูปแบบข้อความและสี
การจัดการ Font
| Property | คำอธิบาย | ตัวอย่าง |
|---|---|---|
font-family |
กำหนดรูปแบบตัวอักษร | font-family: 'Sarabun', sans-serif; |
font-size |
กำหนดขนาดตัวอักษร | font-size: 16px; หรือ font-size: 1rem; |
font-weight |
กำหนดความหนาของตัวอักษร | font-weight: bold; หรือ font-weight: 700; |
line-height |
กำหนดระยะห่างระหว่างบรรทัด | line-height: 1.5; |
text-align |
กำหนดการจัดวางข้อความ | text-align: center; |
สีและพื้นหลัง
| Property | คำอธิบาย | ตัวอย่าง |
|---|---|---|
color |
สีของข้อความ | color: #333; |
background-color |
สีพื้นหลังของ Element | background-color: #f0f0f0; |
background-image |
รูปภาพพื้นหลัง | background-image: url('bg.jpg'); |
หน่วยวัด (Units):
| หน่วย | ประเภท | คำอธิบาย |
|---|---|---|
px |
Absolute | พิกเซล (ขนาดคงที่) |
% |
Relative | เปอร์เซ็นต์เมื่อเทียบกับ Element แม่ |
em |
Relative | เทียบกับ font-size ของ Element นั้นๆ |
rem |
Relative | เทียบกับ font-size ของ Element ราก (<html>) (แนะนำ) |
vw/vh |
Relative | เทียบกับความกว้าง/ความสูงของหน้าจอ (Viewport) |
2.4 การจัดวางองค์ประกอบด้วย Flexbox
Flexbox (Flexible Box Layout) เป็นเครื่องมือสำหรับจัดวางองค์ประกอบในมิติเดียว (แถวหรือคอลัมน์) เหมาะสำหรับการจัดเรียง, จัดตำแหน่ง และกระจายช่องว่างระหว่าง Item
แนวคิดหลัก
- Flex Container: Element แม่ที่กำหนด
display: flex; - Flex Item: Element ลูกที่อยู่ภายใน Container
Property หลักสำหรับ Flex Container
| Property | คำอธิบาย |
|---|---|
display: flex; |
เปลี่ยน Element ให้เป็น Flex Container |
flex-direction |
กำหนดทิศทางการจัดเรียง (row, column) |
justify-content |
จัดตำแหน่ง Item ตามแกนหลัก (Main Axis) |
align-items |
จัดตำแหน่ง Item ตามแกนรอง (Cross Axis) |
ตัวอย่าง Flexbox:
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>.container {
display: flex; /* กำหนดให้เป็น Flex Container */
flex-direction: row; /* จัดเรียงเป็นแถว (ค่าเริ่มต้น) */
justify-content: space-between; /* กระจายช่องว่างระหว่าง Item */
align-items: center; /* จัด Item ให้อยู่กึ่งกลางตามแนวตั้ง */
height: 100px;
border: 1px solid #ccc;
}2.5 การจัดวางองค์ประกอบด้วย Grid
Grid (CSS Grid Layout) เป็นเครื่องมือสำหรับจัดวางองค์ประกอบในสองมิติ (แถวและคอลัมน์) เหมาะสำหรับการสร้าง Layout หลักของหน้าเว็บ
แนวคิดหลัก
- Grid Container: Element แม่ที่กำหนด
display: grid; - Grid Item: Element ลูกที่อยู่ภายใน Container
Property หลักสำหรับ Grid Container
| Property | คำอธิบาย |
|---|---|
display: grid; |
เปลี่ยน Element ให้เป็น Grid Container |
grid-template-columns |
กำหนดจำนวนและความกว้างของคอลัมน์ |
grid-template-rows |
กำหนดจำนวนและความสูงของแถว |
gap |
กำหนดช่องว่างระหว่าง Grid Item |
ตัวอย่าง Grid:
.wrapper {
display: grid;
/* สร้าง 3 คอลัมน์: คอลัมน์แรก 100px, สองและสามแบ่งพื้นที่เท่ากัน */
grid-template-columns: 100px 1fr 1fr;
grid-template-rows: auto 50px; /* แถวแรกสูงตามเนื้อหา, แถวที่สองสูง 50px */
gap: 10px; /* ช่องว่างระหว่าง Item 10px */
}2.6 Responsive Web Design (RWD)
RWD คือการออกแบบเว็บไซต์ให้สามารถแสดงผลได้อย่างเหมาะสมบนทุกขนาดหน้าจอ (Desktop, Tablet, Mobile)
Viewport Meta Tag
ต้องเพิ่มแท็กนี้ในส่วน <head> ของ HTML เสมอ เพื่อให้เบราว์เซอร์บนมือถือแสดงผลหน้าเว็บด้วยความกว้างจริงของอุปกรณ์
<meta name="viewport" content="width=device-width, initial-scale=1.0">Media Queries
คือหัวใจของ RWD ใช้เพื่อกำหนด Style ที่จะถูกนำไปใช้เมื่อหน้าจอมีคุณสมบัติตรงตามที่กำหนด (เช่น ขนาดความกว้าง)
/* Style ทั่วไป (Mobile-First: สำหรับหน้าจอเล็ก) */
body {
background-color: lightblue;
}
/* Style สำหรับหน้าจอที่มีความกว้างตั้งแต่ 768px ขึ้นไป (Tablet) */
@media (min-width: 768px) {
body {
background-color: lightgreen;
}
.container {
width: 90%;
margin: 0 auto;
}
}
/* Style สำหรับหน้าจอที่มีความกว้างตั้งแต่ 1200px ขึ้นไป (Desktop) */
@media (min-width: 1200px) {
body {
background-color: white;
}
.container {
width: 1140px;
}
}2.7 การเปลี่ยนผ่านและแอนิเมชัน (Transitions & Animations)
Transitions (การเปลี่ยนผ่าน)
ใช้เพื่อสร้างการเปลี่ยนค่า Property ของ CSS อย่างราบรื่นในช่วงเวลาที่กำหนด มักใช้เมื่อมีการโต้ตอบ (เช่น การวางเมาส์เหนือ Element)
.button {
background-color: blue;
transition: background-color 0.3s ease-in-out; /* กำหนดให้เปลี่ยนสีพื้นหลังใช้เวลา 0.3 วินาที */
}
.button:hover {
background-color: darkblue; /* เมื่อเมาส์อยู่เหนือปุ่ม */
}Animations (แอนิเมชัน)
ใช้เพื่อสร้างการเคลื่อนไหวที่ซับซ้อนและทำซ้ำได้ โดยใช้ @keyframes เพื่อกำหนดสถานะต่างๆ ของแอนิเมชัน
/* 1. กำหนด Keyframes */
@keyframes slidein {
from {
transform: translateX(0%);
}
to {
transform: translateX(100%);
}
}
/* 2. นำ Animation ไปใช้กับ Element */
.element {
animation-name: slidein;
animation-duration: 3s; /* ใช้เวลา 3 วินาที */
animation-iteration-count: infinite; /* เล่นซ้ำไม่สิ้นสุด */
}แบบฝึกหัดท้ายบท
- สร้างไฟล์
styles.cssและเชื่อมโยงเข้ากับเอกสาร HTML - ใช้ Class Selector เพื่อกำหนดสีพื้นหลังและสีข้อความให้กับ Element
<p> - สร้าง
<div>ที่มี Box Model ที่ชัดเจน:width: 300px,padding: 20px,border: 5px solid black,margin: 30px - ใช้ Flexbox จัดเรียง Item 3 ชิ้นให้อยู่ตรงกลางทั้งแนวตั้งและแนวนอน
- ใช้ Media Query เพื่อเปลี่ยนสีพื้นหลังของ
<body>เป็นสีแดงเมื่อความกว้างหน้าจอน้อยกว่า 600px
ในบทถัดไป เราจะเพิ่มการโต้ตอบให้กับเว็บไซต์ด้วย JavaScript
ตัวอย่างโค้ดแบบฝึกหัดท้ายบท (CSS)
ไฟล์ index.html (สำหรับใช้กับแบบฝึกหัด):
<!DOCTYPE html>
<html lang="th">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>แบบฝึกหัด CSS</title>
<!-- ข้อ 1: เชื่อมโยงไฟล์ styles.css -->
<link rel="stylesheet" href="styles.css">
</head>
<body>
<!-- ข้อ 2: Element p ที่มี class selector -->
<p class="highlight-text">ข้อความนี้จะถูกจัดรูปแบบด้วย Class Selector</p>
<!-- ข้อ 3: Div ที่มี Box Model ชัดเจน -->
<div class="box-model-demo">
นี่คือกล่องสาธิต Box Model
</div>
<!-- ข้อ 4: Flexbox Container -->
<div class="flex-container">
<div class="flex-item">Item 1</div>
<div class="flex-item">Item 2</div>
<div class="flex-item">Item 3</div>
</div>
</body>
</html>ไฟล์ styles.css (สำหรับใช้กับแบบฝึกหัด):
/* ข้อ 5: Media Query สำหรับ Mobile-First */
body {
/* Style เริ่มต้นสำหรับหน้าจอใหญ่ */
background-color: white;
transition: background-color 0.3s;
}
/* ข้อ 5: Media Query เพื่อเปลี่ยนสีพื้นหลังสำหรับหน้าจอเล็ก */
@media (max-width: 600px) {
body {
background-color: red;
}
}
/* ข้อ 2: Class Selector */
.highlight-text {
background-color: yellow;
color: blue;
padding: 5px;
border-radius: 5px;
}
/* ข้อ 3: Box Model */
.box-model-demo {
width: 300px;
padding: 20px;
border: 5px solid black;
margin: 30px;
background-color: lightgray;
/* แนะนำให้เพิ่ม box-sizing: border-box; เพื่อให้ขนาดกล่องคงที่ */
box-sizing: border-box;
text-align: center;
}
/* ข้อ 4: Flexbox */
.flex-container {
display: flex;
height: 200px; /* กำหนดความสูงเพื่อให้เห็นการจัดแนวตั้ง */
border: 2px dashed gray;
margin-top: 20px;
/* จัดให้อยู่ตรงกลางทั้งแนวตั้งและแนวนอน */
justify-content: center; /* แนวนอน */
align-items: center; /* แนวตั้ง */
}
.flex-item {
padding: 15px;
margin: 5px;
background-color: lightgreen;
border: 1px solid green;
}