BEM Là Gì? Hướng Dẫn Quy Tắc Đặt Tên Class CSS Chuẩn Nhất

BEM là viết tắt của Block, Element và Modifier – phương pháp đặt tên class CSS phổ biến giúp chuẩn hóa mã nguồn Frontend, loại bỏ triệt để hiện tượng xung đột tên và nâng cao độ bền vững cho giao diện web. Phương pháp này đóng vai trò như một bộ quy tắc cốt lõi giúp các lập trình viên xây dựng hệ thống giao diện có tính mô-đun cao, dễ dàng mở rộng trong các dự án web quy mô lớn.

Để áp dụng hiệu quả quy chuẩn này, việc nắm vững cấu trúc ba thành phần nền tảng là điều kiện tiên quyết. Bài viết này sẽ phân tích chi tiết ý nghĩa của từng thành phần, các lợi ích thực tế khi triển khai, cũng như những quy tắc vàng và lỗi thường gặp để giúp bạn làm chủ hoàn toàn BEM trong lập trình Frontend.

BEM là gì và ý nghĩa của quy tắc đặt tên này trong lập trình Frontend?

BEM là hệ thống quy ước đặt tên class CSS bao gồm ba thành phần Block, Element và Modifier, được phát triển bởi Yandex nhằm chuẩn hóa cấu trúc mã nguồn trong các dự án Frontend phức tạp. Phương pháp này giải quyết triệt để bài toán xung đột tên class thường gặp khi nhiều lập trình viên cùng làm việc trên một mã nguồn chung, đồng thời tăng cường mạnh mẽ tính tái sử dụng cho các component giao diện.

Để hiểu rõ hơn về cách thức hoạt động của phương pháp này, chúng ta sẽ cùng phân tích ba thành phần cốt lõi cấu thành nên tên gọi của nó.

Block trong Block là gì?

Block là một thành phần độc lập, có ý nghĩa tự thân trên trang web, đóng vai trò là khối chứa lớn nhất đại diện cho một phần giao diện có thể tái sử dụng. Khi nhận diện và đặt tên cho một Block, bạn cần sử dụng chữ thường, phân tách các từ bằng dấu gạch ngang nếu là từ kép, chẳng hạn như .header, .menu, hoặc .button.

Một Block thể hiện một thực thể độc lập có chức năng riêng biệt trên giao diện. Ví dụ, một khối .card chứa hình ảnh, tiêu đề và nút bấm bên trong có thể được xem xét hoàn toàn tách biệt với các thành phần xung quanh. Khi đặt tên Block, bạn tuyệt đối không phụ thuộc vào vị trí hiển thị của nó trên trang, nghĩa là một .button vẫn giữ nguyên tên gọi dù được đặt ở header hay footer. Tính độc lập này giúp mã nguồn CSS trở nên rõ ràng và dễ quản lý hơn rất rất nhiều trong suốt vòng đời phát triển sản phẩm.

Element trong BEM là gì?

Element là một phần con nằm bên trong Block, phụ thuộc hoàn toàn vào Block chứa nó và không có ý nghĩa khi đứng một mình, ví dụ như .menu__item hay .button__text. Quy ước ký hiệu kết nối giữa Block và Element sử dụng dấu hai gạch dưới (__) để thể hiện rõ mối quan hệ cha con về mặt ngữ nghĩa trong cấu trúc giao diện.

Việc phân định rõ Element giúp lập trình viên nhanh chóng nhận ra thành phần này thuộc về Block nào ngay từ cái nhìn đầu tiên trên file HTML hoặc CSS. Ví dụ, trong một khối .UserProfile, các thành phần con sẽ được đặt tên là .UserProfile__avatar, .UserProfile__name và .UserProfile__bio. Những Element này không thể tách rời khỏi .UserProfile để sử dụng độc lập ở nơi khác nếu không có sự thay đổi về mặt ngữ cảnh.

BEM Là Gì? Hướng Dẫn Quy Tắc Đặt Tên Class CSS Chuẩn Nhất
BEM Là Gì? Hướng Dẫn Quy Tắc Đặt Tên Class CSS Chuẩn Nhất

Modifier trong BEM là gì?

Modifier là phần dùng để chỉnh sửa trạng thái, giao diện hoặc hành vi của Block hoặc Element, chẳng hạn như .button--disabled hay .menu__item--active. Quy ước ký hiệu kết nốiModifier với Block hoặc Element sử dụng dấu hai gạch ngang (--).

Modifier giúp bạn tránh việc phải tạo ra hàng loạt class hoàn toàn mới cho các biến thể giao diện nhỏ. Thay vào đó, bạn giữ nguyên class cơ bản của Block hoặc Element rồi gắn thêm Modifier để thay đổi màu sắc, kích thước hoặc trạng thái hoạt động. Dưới đây là bảng phân biệt nhanh các thành phần trong BEM để bạn dễ dàng nắm bắt:

Thành phầnÝ nghĩa chínhKý hiệu kết nốiVí dụ thực tế
BlockThành phần độc lập, tự thânKhông có.header, .button
ElementThành phần con phụ thuộc Block__ (hai gạch dưới).button__text, .menu__item
ModifierBiến thể trạng thái hoặc giao diện-- (hai gạch ngang).button--disabled, .menu__item--active

Bảng trên tóm tắt ba trụ cột chính giúp bạn phân loại chính xác từng thành phần khi tiến hành đặt tên class trong dự án thực tế.

Tại sao lập trình viên nên sử dụng quy tắc BEM cho dự án web?

Lập trình viên nên sử dụng quy tắc BEM vì phương pháp này mang lại cấu trúc mã nguồn CSS rõ ràng, phân cấp trực quan và cực kỳ dễ bảo trì trong các dự án web lớn. Sự minh bạch trong cách đặt tên giúp loại bỏ hoàn toàn tình trạng ghi đè nhầm lẫn và tối ưu hóa khả năng mở rộng hệ thống mã nguồn theo thời gian.

Để thấy rõ giá trị thực tiễn mà BEM mang lại, chúng ta hãy cùng xem xét hai yếu tố cốt lõi giúp cải thiện chất lượng code Frontend dưới đây.

BEM giúp cải thiện tính mô-đun và tái sử dụng code như thế nào?

BEM biến các đoạn HTML và CSS thành những component độc lập, giúp lập trình viên dễ dàng bốc tách và di chuyển qua lại giữa các dự án khác nhau mà không sợ ảnh hưởng đến phần còn lại. Việc không bị phụ thuộc quá sâu vào cấu trúc HTML cụ thể giúp giảm thiểu tối đa rủi ro vỡ giao diện khi có sự thay đổi về mặt thẻ HTML bên trong.

Khi áp dụng mô hình này, mỗi Block hoạt động như một mảnh ghép Lego hoàn chỉnh. Bạn có thể mang khối .card từ trang chủ sang trang sản phẩm mà không cần phải viết lại mã CSS hay lo lắng về việc xung đột với các quy tắc style khác. Sự cô lập này chính là chìa khóa vàng giúp các nhóm phát triển lớn duy trì tốc độ code nhanh chóng và ổn định.

BEM giải quyết vấn đề gì về độ ưu tiên (specificity) của CSS?

BEM Là Gì? Hướng Dẫn Quy Tắc Đặt Tên Class CSS Chuẩn Nhất
BEM Là Gì? Hướng Dẫn Quy Tắc Đặt Tên Class CSS Chuẩn Nhất

BEM giữ cho độ ưu tiên của các selector luôn ở mức thấp và phẳng, qua đó tránh hoàn toàn tình trạng phải dùng đến !important hoặc các selector lồng nhau quá sâu vốn cực kỳ khó ghi đè về sau. Nhờ việc sử dụng các class đơn cho mọi cấp độ thành phần, điểm số specificity của toàn bộ dự án được duy trì ở mức đồng nhất.

Trong các dự án không áp dụng BEM, lập trình viên thường phải viết các selector dài dòng như #main-content .sidebar ul li a để ép độ ưu tiên, dẫn đến mã nguồn bị phình to và khó kiểm soát. Ngược lại, BEM giải quyết triệt để vấn đề này bằng cách quy chuẩn hóa mọi selector thành một class phẳng duy nhất như .sidebar__link, giúp việc tùy biến giao diện trở nên đơn giản hơn bao giờ hết.

Những quy tắc vàng và lỗi thường gặp khi áp dụng BEM thực tế là gì?

Việc áp dụng BEM thực tế đòi hỏi sự tuân thủ nghiêm ngặt các nguyên tắc cấu trúc để tránh tình trạng lạm dụng quy ước làm tên class trở nên cồng kềnh. Việc nhận diện sớm các sai lầm phổ biến sẽ giúp đội ngũ phát triển xây dựng một hệ sinh thái CSS gọn gàng, mạch lạc và dễ duy trì.

Dưới đây là các giải đáp chi tiết cho những thắc mắc thường gặp nhất khi triển khai quy chuẩn này vào dự án mã nguồn mở hoặc doanh nghiệp.

Có nên lồng ghép các Element vào nhau trong BEM không?

Không nên tạo ra các cấp độ lồng nhau sâu như .block__elem__sub-elem bởi vì BEM khuyến cáo giữ cấu trúc tên class ở một cấp độ phẳng duy nhất giữa Block và Element. Nếu thành phần con quá phức tạp và cần phân cấp, bạn nên coi thành phần đó là một Block độc lập mới hoàn toàn.

Quy tắc này nhằm bảo vệ tính linh hoạt của component. Nếu bạn viết .menu__item__link, khi cấu trúc HTML thay đổi và bạn muốn tách .link ra thành một phần riêng, bạn sẽ phải sửa lại toàn bộ tên class ở cả file HTML lẫn CSS. Ngược lại, nếu xác định ngay từ đầu .menu-item là một Block độc lập hoặc chỉ dùng một cấp .menu__link, mã nguồn của bạn sẽ bền vững hơn rất nhiều trước những thay đổi về yêu cầu thiết kế.

Cách xử lý các từ ghép trong tên class BEM như thế nào?

Để xử lý các từ ghép trong tên class BEM, bạn cần sử dụng dấu gạch ngang (-) để phân tách các từ cấu thành nhằm đảm bảo tính nhất quán và dễ đọc cho toàn bộ đội ngũ phát triển. Ví dụ, nếu bạn có một Block mô tả menu chính với trạng thái đang hoạt động, tên class chuẩn sẽ là .main-menu__item--is-active.

BEM Là Gì? Hướng Dẫn Quy Tắc Đặt Tên Class CSS Chuẩn Nhất
BEM Là Gì? Hướng Dẫn Quy Tắc Đặt Tên Class CSS Chuẩn Nhất

Việc thống nhất quy tắc sử dụng dấu gạch ngang giúp phân biệt rõ ràng giữa các từ trong cùng một thành phần (dùng -), ranh giới giữa Block và Element (dùng __), cũng như ranh giới với Modifier (dùng --). Sự minh bạch này giúp bất kỳ thành viên nào trong team cũng có thể đọc hiểu và viết đúng chính tả tên class ngay từ lần đầu tiên tiếp cận dự án.

Các câu hỏi thường gặp xoay quanh việc áp dụng quy chuẩn BEM trong dự án

BEM có thể kết hợp với các bộ tiền xử lý như Sass hoặc SCSS như thế nào?

BEM kết hợp hoàn hảo với các bộ tiền xử lý như Sass hoặc SCSS nhờ tận dụng tính năng lồng nhau (nesting) và ký tự đại diện & để viết code ngắn gọn và trực quan hơn. Thay vì phải lặp lại tên Block nhiều lần, ký tự & sẽ tự động thay thế cho phần selector cha, giúp cấu trúc file SCSS phản ánh chính xác mối quan hệ phân cấp của component mà vẫn giữ nguyên độ phẳng của tên class đầu ra.

Khi nào thì không nên sử dụng BEM cho một dự án web?

Không nên sử dụng BEM cho các dự án quá nhỏ, trang landing page đơn trang (one-page) có phạm vi code hạn chế hoặc các ứng dụng sử dụng sẵn các thư viện UI component độc quyền mà BEM có thể gây dư thừa độ phức tạp. Đối với những dự án có quy mô siêu nhỏ, việc áp dụng nghiêm ngặt các quy tắc gạch dưới và gạch ngang dài dòng có thể làm mất thời gian mà không mang lại quá nhiều giá trị khác biệt về mặt hiệu năng hay bảo trì.

Làm thế nào để tự động hóa việc kiểm tra quy tắc BEM trong team?

Bạn có thể tự động hóa việc kiểm tra quy tắc BEM trong team bằng cách sử dụng các công cụ linter chuyên dụng như Stylelint kết hợp với các plugin kiểm tra cú pháp đặt tên class. Việc tích hợp công cụ này vào quy trình CI/CD hoặc trình soạn thảo mã nguồn sẽ giúp phát hiện ngay lập tức các lỗi vi phạm quy chuẩn trước khi code được phép merge lên repository chung của dự án.

BEM khác gì so với các phương pháp đặt tên CSS khác như OOCSS hay SMACSS?

BEM tập trung mạnh mẽ vào cấu trúc thành phần độc lập và mối quan hệ ngữ nghĩa giữa Block, Element, Modifier, trong khi OOCSS tập trung tách biệt cấu trúc khỏi giao diện trực quan (skin) và SMACSS phân loại CSS thành năm danh mục kiến trúc khác nhau. Nhờ tính cụ thể cao và khả năng chống xung đột tuyệt vời ở cấp độ component, BEM thường tỏ ra linh hoạt và dễ áp dụng hơn trong các hệ thống ứng dụng Frontend hiện đại ngày nay.

Cập Nhật Lúc Tháng 10 15, 2026 by admin