MẬT DANH: ZERO — Chương 02: CSS (đọc miễn phí) | HÀN NGỮ KOOKMIN
Tủ sách
MẬT DANH: ZERO · Chương 02 · CSS
📕 Đặt sách 1 / 1
MẬT DANH: ZERO — Chương 02: CSS, khoác áo màu sắc cho trang web Đọc miễn phí · Chương 02

02

Khoác áo màu sắc: CSS

Vũ khí thứ hai · 두 번째 무기 — 디자인
Gồm Flexbox, Grid & Responsive

Chạm nửa phải màn hình để lật trang ›

Thư đến · 05:30 sáng

✉ Thư đến — 05:30 sáng Từ: GIÁM ĐỐC

"Trang thông báo trông như từ năm 1995.
Khách hàng đang chụp màn hình chế giễu trên mạng.
Làm cho nó TỬ TẾ. Ngay."

Trưởng nhóm xoa trán. "Họ nói đúng. Trang chạy được, nhưng xấu đến mức làm xấu mặt cả công ty." Anh nhìn sang ZERO. "Cậu dựng được cái khung. Giờ ai làm nó trông ra hồn đây?"

Tiền bối

"Để ZERO làm. Một bộ khung trơ trụi thì ai cũng chê. Nhưng khoác cho nó lớp áo đúng cách, cùng một trang sẽ trông chuyên nghiệp ngay. Đó là việc của vũ khí thứ hai — CSS. Giờ là lúc dán giấy dán tường và bật đèn."

Đã 5 giờ sáng, cả văn phòng vẫn sáng đèn — không ai về. "Anh ấy không ngủ ba ngày rồi," tiền bối nói khẽ, nhìn về phía Trưởng nhóm đang đứng trước tấm bảng trắng chi chít sơ đồ. "Vụ sập xảy ra dưới ca trực của anh ấy. Nếu không khôi phục kịp, người mất việc sẽ là anh ấy — chứ không phải kẻ thật sự gây ra chuyện này."

ZERO nhìn người đàn ông kia, và lần đầu hiểu rằng: sau mỗi dòng code đều có một con người, với những áp lực rất thật. Cô quay lại màn hình, quyết tâm hơn.

Góc bàn của ZERO · 05:42 sáng · hai ly cà phê đã nguội

Tiền bối

"Đố em đấy. Anh muốn mọi tiêu đề trên trang đổi sang màu xanh. Em sẽ vào sửa từng cái một chứ?"

ZERO

"Chẳng lẽ phải mở từng dòng HTML ra tô tay? Trang này có cả trăm tiêu đề…"

Tiền bối

"Đó là lý do người ta ghét HTML thuần. Nhìn này — anh chỉ viết một câu: h1 { color: blue; }. Toàn bộ tiêu đề đổi màu cùng lúc."

ZERO

"Khoan… nghĩa là em ra lệnh cho cả nhóm chứ không phải từng đứa?"

Tiền bối

"Chính xác. Cái h1 đứng trước gọi là bộ chọn (selector) — nó chỉ ra 'ai' nghe lệnh. Phần trong ngoặc là 'phải làm gì'. Nắm được điều đó, em nắm được một nửa CSS."

Bài học vừa nảy ra từ một câu đố

CSS không tô màu từng chữ — nó chọn một nhóm rồi ra lệnh cho cả nhóm. Hiểu "selector" là hiểu cách nói chuyện với trình duyệt.

Vũ khí thứ hai

CSS là gì?

CSS viết tắt của Cascading Style Sheets. Nếu HTML quyết định một thứ "là cái gì", thì CSS quyết định nó "trông như thế nào". Màu sắc, kích thước, khoảng cách, vị trí — mọi thứ thuộc về thiết kế đều là lãnh địa của CSS.

Lời ví của tiền bối

"Nếu HTML là cơ thể con người, thì CSS là quần áo và trang điểm. Cùng một người, mặc đồ khác nhau là trông khác hẳn. Bạn có thể thay đổi hoàn toàn ấn tượng của trang mà không động vào bộ khung."

Một quy tắc CSS luôn theo một khuôn mẫu: chọn ai (bộ chọn) → thuộc tính gìgiá trị thế nào.

style.css
h1 { /* bộ chọn: chọn mọi h1 */
  color: crimson; /* màu chữ thành đỏ thẫm */
  font-size: 48px; /* kích thước 48 pixel */
  text-align: center; /* căn giữa */
}
▼ Sau khi áp dụng CSS
Đang khôi phục hệ thống

Cùng một thẻ <h1> đã hoàn toàn khác. Không thêm dòng nội dung nào — chỉ thay đổi kiểu dáng.

Bí mật của mọi thiết kế

Box Model

Box Model · 박스 모델

Mọi phần tử trên web đều nằm trong một chiếc hộp vô hình gồm 4 lớp. Hiểu nó, bạn giải thích được 90% vấn đề về khoảng cách và bố cục.

MARGIN — lề ngoài (마진)
BORDER — viền (테두리)
PADDING — đệm trong (패딩)
CONTENT — nội dung thật
LớpViệt / HànVai trò
ContentNội dung · 콘텐츠Phần trong cùng — chữ hoặc ảnh thật sự
PaddingĐệm trong · 패딩Khoảng trống giữa nội dung và viền — như độ dày đệm ghế
BorderViền · 테두리Đường bao quanh chiếc hộp
MarginLề ngoài · 마진Khoảng cách với hộp khác — như cách nhà hàng xóm

Cách nói chuyện với trình duyệt

Ba cách "chỉ tay" vào phần tử

Để trang điểm cho một phần tử, trước hết CSS phải "chọn" được nó. Có ba cách chọn phổ biến — hiểu được ba cách này là bạn điều khiển được mọi thứ trên trang.

Cách chọnCú phápÝ nghĩa
Theo tên thẻp { }Chọn MỌI thẻ <p> trên trang
Theo class.tieude { }Chọn phần tử có class="tieude" (dấu chấm)
Theo id#main { }Chọn phần tử có id="main" (dấu thăng, mỗi id một)
selector.html + css
<!-- HTML: gắn nhãn class cho thẻ -->
<p class="noibat">Dòng quan trọng</p>

/* CSS: chọn theo class .noibat */
.noibat { color: red; font-weight: bold; }
🔑 Khi nào dùng gì?

Dùng class (dấu chấm) cho những kiểu lặp lại nhiều nơi — phổ biến nhất. Dùng id (dấu thăng) cho một phần tử duy nhất. Dùng tên thẻ khi muốn áp cho tất cả thẻ cùng loại.

Bộ đồ nghề trang điểm

Vài thuộc tính CSS bạn sẽ yêu thích

Thuộc tínhLàm gì
colorMàu chữ
background-colorMàu nền
font-sizeCỡ chữ
text-alignCăn lề chữ (left / center / right)
padding / marginĐệm trong / lề ngoài (nhớ Box Model!)
borderViền (vd: 1px solid black)
border-radiusBo tròn góc

Cách hiểu màu trong CSS

Cách viếtVí dụ
Tên màured, blue, teal — đơn giản, ít lựa chọn
Mã HEX#0e7c66 — phổ biến nhất, 6 ký tự
RGBrgb(14,124,102) — 3 kênh đỏ–lục–lam
RGBArgba(14,124,102,0.5) — thêm độ trong suốt
🎨 Mẹo chọn màu

Dùng công cụ chọn màu online (color picker) để lấy mã HEX. Đừng chọn quá nhiều màu — một trang đẹp thường chỉ dùng 2–3 màu chính hài hòa. Ít mà tinh tế hơn nhiều mà rối.

Khác biệt giữa "tập sự" và "chuyên nghiệp"

Vài thủ thuật khiến trang "sang" hơn hẳn

Thuộc tínhHiệu ứng
box-shadowĐổ bóng, tạo chiều sâu cho hộp
border-radiusBo tròn góc — mềm mại, hiện đại
transitionChuyển động mượt khi thay đổi (vd: di chuột)
opacityĐộ mờ / trong suốt
linear-gradientMàu chuyển sắc (gradient) cho nền
dep.css
.the {
  border-radius: 12px; /* bo góc */
  box-shadow: 0 4px 12px rgba(0,0,0,.1); /* bóng nhẹ */
  transition: .3s; /* chuyển mượt */
}
.the:hover { /* khi di chuột vào */
  box-shadow: 0 8px 24px rgba(0,0,0,.2); /* bóng đậm hơn */
}
✦ :hover là người bạn thân

Nó áp dụng kiểu khi người dùng di chuột vào phần tử. Kết hợp với transition, bạn tạo được hiệu ứng "nổi lên khi rê chuột" mà các trang chuyên nghiệp hay dùng.

▣ Nhiệm vụ 02 — ban màu

☐ Thêm thẻ <style> vào trong <head> của file my.html
☐ Đổi colorfont-size của h1
☐ Tô màu nền cho body bằng background-color
☐ Cho p một padding: 20px và quan sát sự thay đổi

✎ Nhật ký của ZERO — ngày thứ nhất

"Hôm nay mình đổi được màu một dòng chữ. Chỉ một dòng thôi. Nghe thật nhỏ bé. Nhưng mình đã ngồi ngắm nó suốt năm phút, như ngắm một điều kỳ diệu. Sáu tháng qua mình tin mình chẳng làm được gì nên hồn. Hôm nay, lần đầu tiên, mình nghĩ: có lẽ mình đã sai về bản thân.

Tiền bối nói câu mình cứ nhớ mãi: 'Đừng học thuộc. Hãy hiểu.' Mình chưa hiểu hết ý anh ấy. Nhưng mình cảm thấy nó quan trọng. Quan trọng hơn cả CSS."

⚿ Không có trên Google · ghi chép từ người đi trước

Vì sao frontend Hàn thích <div> + Flexbox hơn <table>?

✕ Ngày xưa người ta dùng <table> để dàn layout. Giờ tuyệt đối tránh — table là để hiển thị dữ liệu dạng bảng, không phải để bố cục.

✕ Layout bằng table cứng nhắc, không responsive được, rất khó bảo trì — một thay đổi nhỏ là vỡ cả trang.

✕ Công ty Hàn chuộng div + Flexbox/Grid vì linh hoạt, co giãn theo màn hình, dễ cho người sau đọc.

✕ Dàn layout bằng table trong bài test phỏng vấn — gần như chắc chắn bị loại.

⚿ Góc nhìn thực chiến

Một bug CSS từng khiến cả team mất 3 ngày

✕ Một dự án thật: nút "Mua hàng" biến mất trên iPhone nhưng vẫn hiện trên Android. Cả team soi JavaScript suốt 2 ngày.

✕ Hóa ra thủ phạm là một dòng CSS: overflow:hidden ở thẻ cha cắt mất nút con khi màn hình hẹp.

Bài học: rất nhiều "bug logic" thực ra là bug CSS. Khi giao diện sai, hãy nghi ngờ CSS trước khi đổ lỗi cho code.

✦ Trợ thủ AI · dùng đúng cách

Sau khi học CSS, AI giúp bạn debug giao diện rất nhanh — nếu bạn mô tả đúng vấn đề:

💬 "Đây là CSS của tôi. Nút bị tràn ra ngoài khung trên màn hình nhỏ. Hãy chỉ ra nguyên nhân và cách sửa bằng Flexbox."

💬 "Chuyển đoạn layout dùng float này sang Flexbox hiện đại, giải thích từng thuộc tính cho người mới."

Xếp theo MỘT chiều

Flexbox — hàng hoặc cột

Flexbox · 플렉스박스

Công cụ CSS giúp xếp các phần tử con thành một hàng (ngang) hoặc một cột (dọc), và căn chỉnh dễ dàng. Chỉ cần đặt display: flex cho phần tử cha là các con tự động xếp hàng.

flexbox.css
.menu {
  display: flex; /* bật chế độ flex */
  justify-content: center; /* căn giữa chiều ngang */
  align-items: center; /* căn giữa chiều dọc */
  gap: 16px; /* khoảng cách giữa các con */
}
display: flex (xếp ngang)
Hộp 1
Hộp 2
Hộp 3

justify-content căn theo chiều chính (ngang nếu xếp hàng); align-items căn theo chiều vuông góc. Nhớ mẹo: "justify = chính, align = phụ". Flexbox tuyệt cho thanh menu, hàng nút, căn giữa một thứ gì đó.

Xếp theo HAI chiều

Grid — lưới hàng và cột

CSS Grid · 그리드

Khi cần bố cục dạng lưới hai chiều (vừa hàng vừa cột) — như thư viện ảnh, bảng sản phẩm — Grid là công cụ mạnh nhất. Đặt display: grid và khai báo số cột.

grid.css
.thuvien {
  display: grid;
  grid-template-columns: repeat(3, 1fr); /* 3 cột bằng nhau */
  gap: 12px;
}
display: grid — 3 cột × 2 hàng
💡 Khi nào dùng cái nào?

Một chiều (một hàng nút, một thanh menu) → Flexbox. Hai chiều (lưới ảnh, dashboard) → Grid. Đơn vị 1fr nghĩa là "một phần bằng nhau" — repeat(3, 1fr) là ba cột chia đều.

▣ Nhiệm vụ 2.5 — tự sắp đặt không gian

☐ Tạo 3 khối <div> màu nền khác nhau
☐ Dùng Flexbox xếp chúng thành một hàng ngang, cách đều
☐ Thử đổi sang Grid 2 cột, quan sát sự khác biệt
☐ Thử justify-content các giá trị: center, space-between, flex-end

Một trang, mọi màn hình

Responsive là gì?

Responsive — Web đáp ứng · 반응형

Cách làm trang web tự điều chỉnh bố cục cho vừa mọi kích thước màn hình — máy tính, máy tính bảng, điện thoại. Cùng một trang, nhưng "co giãn" thông minh để luôn dễ đọc, dễ dùng.

Vũ khí số 1 — Media Query (미디어 쿼리): viết CSS "có điều kiện theo kích thước màn hình". NẾU màn hình nhỏ hơn 768px (cỡ điện thoại), THÌ áp dụng các quy tắc này.

responsive.css
/* Mặc định: 3 cột cho màn hình lớn */
.danhsach { display: grid;
  grid-template-columns: repeat(3, 1fr); }

/* Khi màn hình < 768px (điện thoại): 1 cột */
@media (max-width: 768px) {
  .danhsach { grid-template-columns: 1fr; }
}
Máy tính: 3 cột
Điện thoại: 1 cột
🔑 Bí mật của dân chuyên

Đừng đặt kích thước cứng bằng px cho mọi thứ. Hãy nghĩ "co giãn": dùng %, max-width, để Flexbox/Grid tự sắp. Luôn có <meta name="viewport"> trong <head>, và img { max-width: 100%; } để ảnh không tràn.

▣ Nhiệm vụ 2.6 — làm trang co giãn được

☐ Mở trang "Về tôi" trên điện thoại (hoặc thu nhỏ cửa sổ trình duyệt)
☐ Thêm <meta name="viewport" content="width=device-width, initial-scale=1">
☐ Thêm một media query đổi bố cục khi màn hình nhỏ
☐ Đặt max-width: 100% cho mọi ảnh

Còn nội dung — cuộn xuống