Bài 14

Định dạng văn bản bằng CSS

Làm chủ các thuộc tính CSS định dạng phông chữ (font-family, font-size, font-style, font-weight), định dạng dòng văn bản (line-height, text-align, text-decoration, text-indent), cơ chế kế thừa và thứ tự ưu tiên của CSS.

🚀

1. Khởi động (Engagement)

Khi đọc sách báo in truyền thống, mắt chúng ta dễ dàng bị thu hút bởi các kiểu chữ nghệ thuật, những tiêu đề in hoa đậm nét, hay những đoạn trích dẫn được in nghiêng trang trọng. Trên các trang web hiện đại cũng vậy:

  • Một trang tin công nghệ thường sử dụng kiểu chữ thanh mảnh, hiện đại, không chân để tạo cảm giác tươi mới, gọn gàng.
  • Một trang web văn học hay lịch sử lại ưa chuộng phông chữ có chân cổ điển, mang vẻ đẹp uy nghiêm và lắng đọng. 📜✒️

💡 Thảo luận mở đầu:
Làm thế nào để các nhà thiết kế web có thể điều khiển kích thước từng cỡ chữ, màu sắc, khoảng cách dòng, độ thụt đầu dòng và căn chỉnh đều hai bên mép trang cho hàng nghìn bài viết một cách tự động và chuyên nghiệp?

Trả lời gợi ý:

  • Chúng ta sử dụng hệ thống các thuộc tính định dạng văn bản và phông chữ phong phú của CSS kết hợp với tính kế thừa (inheritance) và thứ tự ưu tiên để tạo nên giao diện đọc dễ chịu, chuẩn mực Typography trên mọi màn hình.
📖

2. Hình thành kiến thức (Knowledge)

1. Các thuộc tính CSS định dạng văn bản

a) Định dạng phông chữ (Typography)

  • font-family (Họ phông chữ): Chỉ định kiểu phông chữ hiển thị. Do mỗi máy tính người dùng cài đặt các bộ phông khác nhau, CSS cho phép liệt kê một danh sách các phông ưu tiên từ trái sang phải, kết thúc bằng một họ phông chung:

    h1 {
      font-family: Arial, "Helvetica Neue", Tahoma, sans-serif;
    }
    
    Python Script

    [!NOTE] Nếu tên phông chữ có chứa khoảng trắng, bắt buộc phải đặt trong dấu ngoặc kép (ví dụ: "Times New Roman", "Courier New").

    5 nhóm phông chữ tiêu chuẩn trong thiết kế Web:

    1. sans-serif (Không chân): Nét chữ thẳng, dứt khoát, hiện đại (Arial, Roboto, Open Sans). Dễ đọc nhất trên màn hình máy tính và điện thoại.
    2. serif (Có chân): Chân chữ có các gạch nhỏ đỡ bên dưới (Times New Roman, Georgia). Thường dùng cho sách báo in, tài liệu trang trọng.
    3. monospace (Đơn cách): Tất cả các ký tự có bề ngang bằng hệt nhau (Consolas, Courier New). Chuyên dùng hiển thị mã nguồn lập trình.
    4. cursive (Chữ viết tay): Nét uốn lượn, mềm mại (Comic Sans MS, Dancing Script). Phù hợp thiệp mời, đề từ.
    5. fantasy (Nghệ thuật/Trừu tượng): Nét chữ cách điệu trang trí (Impact, Algerian). Dùng cho bìa poster.
  • font-size (Cỡ chữ):

    • Đơn vị tuyệt đối: px (pixel màn hình), pt (point - 1/72 inch). Ví dụ: font-size: 16px;.
    • Đơn vị tương đối: em (gấp n lần cỡ chữ của phần tử cha), rem (gấp n lần cỡ chữ phần tử gốc html), %. Ví dụ: font-size: 1.2em;.
  • font-style (Kiểu dáng chữ): normal (chữ đứng thẳng bình thường) hoặc italic (chữ in nghiêng).

  • font-weight (Độ đậm của chữ): normal (nét thường 400), bold (in đậm 700), hoặc các giá trị số từ 100 đến 900.


b) Định dạng màu chữ (color)

Thuộc tính color xác định màu sắc của ký tự văn bản. Ta có thể khai báo bằng tên tiếng Anh cơ bản (red, blue, green, purple, black, white,...) hoặc mã màu Hex/RGB.


c) Định dạng dòng văn bản (Text Formatting)

  • line-height (Khoảng cách dòng): Khoảng cách giữa các đường cơ sở (baseline) của hai dòng văn bản liền kề. Giúp văn bản thoáng đãng, không bị dí sát nhau gây mỏi mắt:
    p {
      line-height: 1.6; /* Chiều cao dòng gấp 1.6 lần cỡ chữ */
    }
    
    Python Script
  • text-align (Căn lề khối chữ): Nhận 4 giá trị: left (căn trái), center (căn giữa), right (căn phải), justify (căn đều hai biên mép).
  • text-decoration (Đường kẻ trang trí):
    • underline: Đường gạch chân dưới chữ.
    • overline: Đường gạch ngang trên đỉnh đầu chữ.
    • line-through: Đường gạch xuyên qua giữa chữ (dùng cho giá cũ gạch đi khi giảm giá).
    • none: Bỏ đường gạch mặc định (rất hay dùng để xóa gạch chân của thẻ <a>).
  • text-indent (Thụt lề dòng đầu): Thụt lề ký tự đầu tiên của đoạn văn. Ví dụ: text-indent: 2em; hoặc text-indent: 20px;.

2. Tính kế thừa và Quy tắc ưu tiên trong CSS

a) Tính kế thừa (Inheritance)

Trong mô hình phân cấp cây DOM của HTML, các phần tử con nằm bên trong sẽ tự động kế thừa các định dạng chữ từ phần tử cha bao bọc nó:

body {
  color: #334155;
  font-family: Arial, sans-serif;
}
Python Script

Toàn bộ tiêu đề <h1>, đoạn văn <p>, thẻ <li> nằm trong <body> sẽ tự động hiển thị với phông Arial và màu xám đậm mà không cần phải viết CSS lặp lại cho từng thẻ!

b) Thứ tự ưu tiên theo vị trí xuất hiện (Cascading)

Nếu một phần tử HTML nhận hai quy tắc CSS cùng áp dụng lên một thuộc tính từ cùng cấp độ chọn, quy tắc nào được viết sau cùng (ở vị trí dưới) sẽ ghi đè lên quy tắc viết phía trước:

h1 {
  text-align: center;
  color: red;
}
h1 {
  text-align: left; /* Quy tắc này nằm dưới -> h1 sẽ căn trái */
}
Python Script

c) Bộ chọn toàn cục * và Từ khóa !important

  • Bộ chọn * (Universal Selector): Tác động lên mọi phần tử HTML trong trang web nhưng có mức độ ưu tiên thấp nhất. Bất kỳ quy tắc cụ thể nào khác cũng sẽ ghi đè lên nó.
  • Từ khóa !important: Đặt ngay sau giá trị thuộc tính. Khi được gắn !important, thuộc tính đó sẽ được trao quyền ưu tiên tuyệt đối cao nhất, bất chấp vị trí xuất hiện hay cấp độ ưu tiên của các quy tắc khác:
    h1 {
      color: red !important; /* Luôn luôn có màu đỏ */
    }
    h1 {
      color: blue; /* Bị vô hiệu hóa bởi !important phía trên */
    }
    
    Python Script
🧩

3. Luyện tập thực hành (Practice)

Nhiệm vụ 1: Thiết lập định dạng bài viết "Kĩ thuật chia để trị" (Trang 81 SGK)

Yêu cầu:

  • Các tiêu đề: Căn lề trái, cỡ chữ 16px, chữ màu đỏ (red), phông chữ không chân (sans-serif).
  • Các dòng văn bản: Thụt lề dòng đầu 2em, căn lề trái (left), phông chữ có chân (serif).
<!DOCTYPE html>
<html lang="vi">
<head>
  <meta charset="UTF-8">
  <title>Nhiệm vụ 1: Thuật toán chia để trị</title>
  <style>
    h1, h2 {
      font-family: sans-serif;
      font-size: 16px;
      color: red;
      text-align: left;
    }
    p {
      font-family: serif;
      text-align: left;
      text-indent: 2em;
      line-height: 1.6;
    }
  </style>
</head>
<body>
  <h1>Kĩ thuật chia để trị</h1>
  <p>
    Chia để trị (Divide and Conquer) là một kĩ thuật thiết kế thuật toán và chương trình rất quan trọng. Ý tưởng chính của kĩ thuật này nằm ở hai thao tác "chia" và "trị".
  </p>

  <h2>Ý tưởng của kĩ thuật chia để trị</h2>
  <p>
    Từ bài toán gốc ban đầu (kí hiệu P), chúng ta chia thành các bài toán nhỏ hơn về kích thước (nhưng vẫn giữ nguyên yêu cầu). Với mỗi bài toán nhỏ hơn, có thể gọi đệ quy hoặc giải trực tiếp, sau đó kết hợp lại để giải bài toán gốc (P) ban đầu.
  </p>
</body>
</html>
Python Script

Nhiệm vụ 2: Biến thể nâng cao với căn đều hai bên và chữ in đậm (Trang 82 SGK)

Yêu cầu:

  • Tiêu đề: Căn giữa (center), cỡ chữ 16px, màu xanh dương (blue), phông không chân (sans-serif).
  • Đoạn văn: Thụt đầu dòng 2em, căn đều hai bên (justify).
  • Các từ in đậm <strong> và in nghiêng <em> giữ nguyên cỡ chữ gốc (font-size: 100%).
<!DOCTYPE html>
<html lang="vi">
<head>
  <meta charset="UTF-8">
  <title>Nhiệm vụ 2: Tinh chỉnh thẩm mỹ nâng cao</title>
  <style>
    body { max-width: 700px; margin: 30px auto; padding: 20px; }
    h1, h2 {
      font-family: sans-serif;
      font-size: 16px;
      color: blue;
      text-align: center;
    }
    p {
      text-align: justify;
      text-indent: 2em;
      line-height: 1.7;
    }
    strong, em {
      font-size: 100%;
    }
  </style>
</head>
<body>
  <h1>Kĩ thuật chia để trị</h1>
  <p>
    Chia để trị <em>(Divide and Conquer)</em> là một kĩ thuật thiết kế thuật toán vô cùng quan trọng. Ý tưởng chính nằm ở hai thao tác <strong>chia</strong> và <strong>trị</strong>.
  </p>
</body>
</html>
Python Script

Phân loại các phông chữ phổ biến (Luyện tập 1 - Trang 82 SGK)

Tên phông chữThuộc nhóm họ phông (Font Family)Đặc trưng nhận diện
Times New RomanserifCó chân đỡ cổ điển, chuẩn in ấn văn kiện.
Courier NewmonospaceĐơn cách, độ rộng các ký tự bằng hệt nhau như máy đánh chữ.
Abadi / Berlin Sans FBsans-serifKhông chân, hình khối góc cạnh rõ ràng.
Bradley Hand ITCcursivePhông mô phỏng nét viết tay cá nhân.
ALGERIANfantasyPhông nghệ thuật, hoa văn đục nét viền ngoài.
Consolas / CascadiamonospacePhông lập trình hiển thị code trong VS Code / Terminal.
🌟

4. Vận dụng (Application)

Vận dụng 1 (Trang 82 SGK): Mở rộng các thuộc tính đồ họa chữ nâng cao

Bên cạnh các thuộc tính cơ bản, CSS hiện đại cung cấp nhiều công cụ kiểm soát thẩm mỹ chữ đỉnh cao:

  • letter-spacing: Khoảng cách giữa các ký tự liên tiếp (ví dụ: letter-spacing: 2px; giúp tiêu đề mở rộng khoảng thở sang trọng).
  • word-spacing: Khoảng cách giữa các từ trong câu (ví dụ: word-spacing: 4px;).
  • text-shadow: Hiệu ứng đổ bóng chữ rực rỡ theo công thức text-shadow: x y độ_nhòe màu_bóng;:
    h1 {
      text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
    }
    
    Python Script
  • font-variant: Chuyển đổi chữ in hoa nhỏ đặc biệt small-caps (biến toàn bộ ký tự thường thành chữ in hoa nhưng có chiều cao bằng chữ thường).

Vận dụng 2 (Trang 82 SGK): Trình bày bài thơ "Trời Hà Nội xanh"

<!DOCTYPE html>
<html lang="vi">
<head>
  <meta charset="UTF-8">
  <title>Trời Hà Nội xanh</title>
  <style>
    .poem-container {
      max-width: 450px;
      margin: 40px auto;
      padding: 30px;
      background: #f0fdf4;
      border: 1px dashed #22c55e;
      border-radius: 16px;
      text-align: center;
      font-family: 'Segoe UI', Tahoma, sans-serif;
    }
    .poem-title {
      font-size: 24px;
      color: #0284c7;
      font-weight: bold;
      margin-bottom: 6px;
    }
    .poem-author {
      font-style: italic;
      color: #475569;
      margin-bottom: 20px;
    }
    .poem-author span {
      color: #dc2626;
      font-weight: bold;
    }
    .poem-line {
      font-size: 18px;
      color: #1e293b;
      line-height: 1.8;
      font-style: italic;
    }
  </style>
</head>
<body>
  <div class="poem-container">
    <div class="poem-title">Trời Hà Nội xanh</div>
    <div class="poem-author">Sáng tác: <span>Văn Ký</span></div>
    <div class="poem-line">Xanh xanh thắm bầu trời xanh Hà Nội</div>
    <div class="poem-line">Hồ Gươm xanh như mái tóc em xanh</div>
  </div>
</body>
</html>
Python Script

Ghi nhớ kiến thức cốt lõi 🎯

  • 🅰️ Thuộc tính phông chữ: font-family (chỉ định phông và danh sách dự phòng kết thúc bằng họ phông serif, sans-serif, monospace), font-size (px, em, rem), font-style (italic), font-weight (bold, 400..900).
  • 📏 Định dạng dòng: line-height (chiều cao dòng tính từ đường baseline), text-align (left, center, right, justify), text-indent (thụt đầu dòng), text-decoration (none, underline, line-through).
  • 🌳 Cơ chế kế thừa (Inheritance): Các thẻ con tự động hưởng các định dạng kiểu chữ từ thẻ cha chứa nó trong cây HTML.
  • ⚖️ Thứ tự ưu tiên và !important: Cùng mức chọn, lệnh CSS viết sau sẽ ghi đè lệnh viết trước; bộ chọn toàn cục * có độ ưu tiên thấp nhất; từ khóa !important mang mức ưu tiên cao nhất.

Chúc mừng bạn đã hoàn thành bài học này! 🏆