BEM – A Front end Methodology là gì?
BEM là gì?
Để ngắn gọn, xúc tích và dễ hiểu nhất thì mình định nghĩa BEM với 1 vài gạch đầu dòng như sau:
- BEM là 1 phương thức viết tên class trong HTML, CSS
- BEM được tạo bởi 1 team của Yandex.
- BEM là viết tắt của từ Block, Element, Modifier
- Mục đích của BEM là đem lại cách viết hiệu quả tên class trong HTML theo hướng module, cũng như là viết CSS theo 1 cách có tổ chức và hiệu quả.
Tại sao lại dùng BEM?
- Khi đọc tên class trong HTML ta cũng có thể hiểu ngay class đó sẽ là gì? làm gì? bình thường nếu 1 class có tên .item thì nhìn vào sẽ chưa hiểu ngay được item này của block nào, phải nhìn ngược ra thành phần ngoài mới xác định được, đối với 1 block HTML lồng nhiều cấp thì tìm rất tốn thời gian. Nhưng nếu như ta đặt tên là .social__item thì khi đó nhìn vào sẽ hiểu ngay rằng đây là item của block social.
- Khi áp dụng BEM thì code CSS sẽ không phải lồng selector nhiều cấp nữa.
=> Không phải là
1
2
3
4
5
|
. menu { . . . }
. menu . item { . . . }
. menu . item . active { . . . }
|
1
2
3
|
= > Mà sẽ là
|
1
2
3
4
5
|
. menu { . . . }
. menu_ _item { . . . }
. menu__item -- active { . . . }
|
Ai đang dùng BEM?
Cùng điểm qua 1 vài website và xem cách họ áp dụng BEM vào tên class trong HTML, CSS.
Airbnb
Material Design Lite
CSS Wizardry
Jetbrains
BEM sử dụng như thế nào?
Everything is a class and nothing is nested
Phương châm hoạt động của BEM là ở HTML tất cả nên là class (không nên dùng id) và trong CSS không có thứ gì phải lồng vào.
Hãy xem qua ví dụ dưới đây để hiểu cách áp dụng BEM vào HTML, CSS và SASS:
Cách HTML đặt tên class
1
2
3
4
5
6
|
< a class = "btn btn--orange" href = "#" >
< span class = "btn__price" > $ 9.99 < / span >
< span class = "btn__text" > Subscribe < / span >
< / a >
|
Cách CSS style
1
2
3
4
5
6
7
|
/* Block */
. btn { . . . }
. btn_ _price { . . . }
. btn_ _text { . . . }
. btn -- orange { . . . }
|
Cách SASS style
1
2
3
4
5
6
7
8
|
. btn {
. . .
& __price { . . . }
& __text { . . . }
& -- orange { . . . }
}
|
Với đặc trưng kiểu đặt tên cho class của BEM như vậy thì khi viết Sass, viết như thế nào để đạt hiểu quả, trong phần 2 này chúng ta sẽ cùng đi tìm giải pháp cho việc này
Chúng ta hoàn toàn có thể viết như thế này:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
. menu {
. . .
& __item {
. . .
}
& -- fixed {
. . .
}
}
|
Kết quả render ra css tên class sẽ là:
1
2
3
4
5
|
. menu { . . . }
. menu_ _item { . . . }
. menu -- fixed { . . . }
|
Nhưng khi cấu trúc của block lớn lên thì cách viết trên sẽ trở nên khó để dễ nhìn, vậy thì hãy cải thiện với mixin:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
/// Block Element
@ mixin element ( $ element ) {
& __ #{$element} {
@ content ;
}
}
/// Block Modifier
@ mixin modifier ( $ modifier ) {
& -- #{$modifier} {
@ content ;
}
}
/// Rewriting our previous example with our brand new mixins
. menu {
. . .
@ include element ( 'item' ) {
. . .
}
@ include modifier ( 'fixed' ) {
. . .
}
}
|
Kết quả render ra css nhận được là như nhau, nhưng cách viết đã được cải thiện bằng mixin nên rõ ràng là dễ nhìn hơn
Tuy là code đã dễ đọc hơn nhưng cách đặt tên mixin làm chúng ta phải gõ nhiều ký tự hơn, vậy thì thử đổi tên mixin thành kiểu alias cho ngắn gọn: element -> e, ‘modifier’ -> m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
/// @alias element
@ mixin e ( $ element ) {
& __ #{$element} {
@ content ;
}
}
/// @alias modifier
@ mixin m ( $ modifier ) {
& -- #{$modifier} {
@ content ;
}
}
/// Rewriting our previous example with our brand new mixins alias
. menu {
. . .
@ include e ( 'item' ) {
. . .
}
@ include m ( 'fixed' ) {
. . .
}
}
|
Tên mixin vẫn ngữ nghĩa để đọc là hiểu, vừa đảm bảo không phải gõ nhiều ký tự của tên mixin.
Kết luận
Với cách viết tên class của BEM tuy hơi dài nhưng ngữ nghĩa, hướng module, dễ hiểu, đặc biệt đối với dự án lớn.
- Sách hay về khởi nghiệp và cuộc sống
- Điều gì đang thay đổi mobile-first index trên Google
- Microsoft thừa nhận tablet và mobile đang chiếm ưu thế hơn destop và laptop
- Thiết kế trải nghiệm người dùng (UX) tốt thì kinh doanh tốt?
- Trang bị smartphone và tablet cho binh lính
- Mobile 3D Graphics with OpenGL ES and M3G
- Hướng dẫn viết module cho SugarCRM
- Người dùng Android không thực sự cần lo về mã độc
- tắt VinaphoneWifi trong modem wifi của bạn
- BYOD là gì ?
- Khắc phục lỗi đăng nhập Windows 10, không thể login vào Windows 10
- Không cho trình duyệt firefox tự động update
* Viết ứng dụng cho smartphone và máy tính bảng: iPhone, iPad , Android, Tablet, Windows Phone, Blackberry, Uber app, Grab app, mạng xã hội, vận tải thông minh, thực tế ảo, game mobile,...
* Viết ứng dụng tìm và đặt xe, các hệ thống theo mô hình kinh tế chia sẻ, uber for x, ứng dụng giúp việc,...
* Xây dựng các giải pháp quản lý vận tải, quản lý xe công vụ, quản lý xe doanh nghiệp, phần mềm và ứng dụng logistics, kho vận, vé xe điện tử,...
* Tư vấn và xây dựng mạng xã hội, tư vấn giải pháp CNTT cho doanh nghiệp, startup, ...
Quý khách xem Hồ sơ năng lực của DVMS tại đây >>
Quý khách gửi yêu cầu tư vấn và báo giá tại đây >>