You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: README.md
+61-61Lines changed: 61 additions & 61 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,34 +1,34 @@
1
1
# Airbnb CSS / Sass Styleguide
2
2
3
-
*Một cách tiếp cận hợp lý nhất với CSS và SASS*
3
+
*Cách tiếp cận CSS và Sass hợp lý nhất*
4
4
5
5
## Mục lục
6
6
7
7
1.[Thuật ngữ](#terminology)
8
8
-[Khai báo](#khai-báo)
9
-
-[Selectors](#selectors)
9
+
-[Selector](#selectors)
10
10
-[Thuộc tính](#thuộc-tính)
11
11
1.[CSS](#css)
12
12
-[Quy cách](#quy-cách)
13
13
-[Chú thích](#chú-thích)
14
14
-[OOCSS và BEM](#oocss-và-bem)
15
-
-[ID Selectors](#id-selectors)
16
-
-[JavaScript hooks](#javascript-hooks)
15
+
-[ID Selector](#id-selectors)
16
+
-[JavaScript hook](#javascript-hooks)
17
17
-[Đường viền](#đường-viền)
18
18
1.[Sass](#sass)
19
19
-[Cú pháp](#cú-pháp)
20
20
-[Thứ tự](#sắp-xếp-các-khai-báo-thuộc-tính)
21
21
-[Biến](#biến)
22
22
-[Mixins](#mixins)
23
23
-[Mở rộng directive](#extend-directive)
24
-
-[Selectors lồng nhau](#selectors-lồng-nhau)
24
+
-[Selector lồng nhau](#selectors-lồng-nhau)
25
25
1.[Translation](#translation)
26
26
27
27
## Thuật ngữ
28
28
29
29
### Khai báo
30
30
31
-
Một "khai báo" là tên gọi của một selector (hoặc một nhóm các selectors) với một nhóm các thuộc tính. Dưới đây là ví dụ:
31
+
Một “khai báo” là tên gọi của một selector (hoặc một nhóm các selector) với một nhóm các thuộc tính. Dưới đây là ví dụ:
32
32
33
33
```css
34
34
.listing {
@@ -37,9 +37,9 @@ Một "khai báo" là tên gọi của một selector (hoặc một nhóm các s
37
37
}
38
38
```
39
39
40
-
### Selectors
40
+
### Selector
41
41
42
-
Trong một khai báo, "selectors" là phần sẽ xác định xem phần tử nào trong DOM sẽ được style bởi các thuộc tính xác định. Selectors có thể tương ứng với các phần tử HTML, cũng như class hay ID của phần tử, hoặc bất kì thuộc tính nào của nó. Dưới đây là ví dụ về selectors:
42
+
Trong một khai báo, “selector” là phần sẽ xác định xem phần tử nào trong DOM sẽ được style bởi các thuộc tính xác định. Selector có thể tương ứng với các phần tử HTML, cũng như class hay ID của phần tử, hoặc bất kì thuộc tính nào của nó. Dưới đây là ví dụ về selector:
43
43
44
44
```css
45
45
.my-element-class {
@@ -66,17 +66,17 @@ Thuộc tính là một cặp khóa-giá trị, và một khai báo có thể ch
66
66
67
67
### Quy cách
68
68
69
-
* Sử dụng soft tabs (2 dấu cách) cho khoảng cách thụt vào (indentation)
69
+
* Sử dụng soft tab (2 dấu cách) cho khoảng cách thụt vào (indentation)
70
70
* Nên sử dụng dấu gạch ngang trong camelCasing của tên class.
71
-
- Dấu gạch dưới và PascalCasing sẽ không sao nếu bạn sử dụng BEM (xem [OOCSS and BEM](#oocss-and-bem)dưới đây).
72
-
* Không sử dụng ID Selectors.
73
-
* Khi sử dụng nhiều selector trong một khai báo, đặt mỗi selector trên một dòng kẻ.
71
+
- Dấu gạch dưới và PascalCasing áp dụng được nếu bạn sử dụng BEM (xem [OOCSS and BEM](#oocss-and-bem)bên dưới).
72
+
* Không sử dụng ID Selector.
73
+
* Khi sử dụng nhiều selector trong một khai báo, viết mỗi selector trên một dòng riêng.
74
74
* Trước dấu ngoặc nhọn `{` phải có một dấu cách trong khai báo.
75
75
* Trong thuộc tính, đặt một dấu cách đứng sau dấu hai chấm `:` .
76
-
* Đặt dấu đóng ngoặc nhọn `}` của một khai báo trên một dòng kẻ mới.
77
-
* Đặt một dòng kẻ trống giữa các khai báo.
76
+
* Đặt dấu đóng ngoặc nhọn `}` của một khai báo trên một dòng mới.
77
+
* Đặt một dòng trống giữa các khai báo.
78
78
79
-
**Không tốt**
79
+
**Không nên**
80
80
81
81
```css
82
82
.avatar{
@@ -90,7 +90,7 @@ Thuộc tính là một cặp khóa-giá trị, và một khai báo có thể ch
90
90
}
91
91
```
92
92
93
-
**Tốt**
93
+
**Nên**
94
94
95
95
```css
96
96
.avatar {
@@ -108,31 +108,31 @@ Thuộc tính là một cặp khóa-giá trị, và một khai báo có thể ch
108
108
### Chú thích
109
109
110
110
* Nên dùng hai gạch (`//`) để đặt chú thích.
111
-
* Nên đặt chú thích trên một dòng kẻ riêng, không đặt ở cuối dòng kẻ.
111
+
* Nên đặt chú thích trên một dòng riêng, không đặt ở cuối dòng.
112
112
* Viết chú thích chi tiết cho những dòng code mà không thể hiện được ý nghĩa rõ ràng khi đọc, ví dụ:
113
113
- Sử dụng z-index
114
-
- Khả năng tương thích và trình duyệt.
114
+
- Khả năng tương thích và trình duyệt
115
115
116
116
### OOCSS và BEM
117
117
118
-
Chúng tôi khuyến khích một số sự kết hợp giữa OOCSS và BEM cho những lý do sau:
118
+
Chúng tôi khuyến khích một số cách kết hợp giữa OOCSS và BEM cho những lý do sau:
119
119
120
-
*Nó giúp tạo ra mối quan hệ chặt chẽ rõ ràng giữa CSS và HTML
121
-
*Nó giúp tạo ra những thành phần có thể tái sử dụng.
122
-
*Nó cho phép ít lồng nhau (nested) và giảm sự riêng biệt
123
-
*Nó giúp xây dựng stylesheets có khả năng mở rộng
120
+
*Giúp tạo ra mối quan hệ chặt chẽ rõ ràng giữa CSS và HTML
121
+
*Giúp tạo ra những thành phần có thể tái sử dụng.
122
+
*Cho phép ít lồng nhau (nested) và giảm sự riêng biệt
123
+
*Giúp xây dựng stylesheet có khả năng mở rộng
124
124
125
-
**OOCSS**, hay "CSS hướng đối tượng", là một phương pháp để viết code CSS mà khuyến khích bạn định hình stylesheets như một sự tập hợp của nhiều "đối tượng" (object): có thể tái sử dụng, có thể lặp lại độc lập xuyên suốt toàn bộ một trang web.
125
+
**OOCSS**, hay “CSS hướng đối tượng”, là một phương pháp để viết CSS mà khuyến khích bạn định hình stylesheet như một sự tập hợp của nhiều “đối tượng” (object): có thể tái sử dụng, có thể lặp lại độc lập xuyên suốt toàn bộ một trang web.
*Smashing Magazine's [Giới thiệu về OOCSS](http://www.smashingmagazine.com/2011/12/12/an-introduction-to-object-oriented-css-oocss/)
127
+
*[OOCSS wiki](https://github.com/stubbornella/oocss/wiki) của Nicole Sullivan
128
+
*[Giới thiệu về OOCSS](http://www.smashingmagazine.com/2011/12/12/an-introduction-to-object-oriented-css-oocss/) trên Smashing Magazine
129
129
130
-
**BEM**, hay "Block-Element-Modifier", là một quy ước đặt tên cho classes trong HTML và CSS. Ban đầu nó được phát triển bởi Yandex với codebases lớn, có khả năng mở rộng, và có thể coi như một tập hợp của các hướng dẫn cho việc thực hiện OOCSS.
130
+
**BEM**, hay “Block-Element-Modifier”, là một quy ước đặt tên cho class trong HTML và CSS. Ban đầu nó được phát triển bởi Yandex với codebase lớn, có khả năng mở rộng, và có thể coi như một tập hợp của các hướng dẫn cho việc thực hiện OOCSS.
*Harry Roberts' [Giới thiệt về BEM](http://csswizardry.com/2013/01/mindbemding-getting-your-head-round-bem-syntax/)
132
+
*[BEM 101](https://css-tricks.com/bem-101/) trên CSS Tricks
133
+
*[Giới thiệu về BEM](http://csswizardry.com/2013/01/mindbemding-getting-your-head-round-bem-syntax/) của Harry Roberts
134
134
135
-
Chúng tôi khuyến nghị sử dụng một biến thể của BEM với PascalCased "blocks", mà làm việc riêng biệt khá hiệu quả với các thành phần (components) (e.g. React). Dấu gạch dưới và gạch ngang vẫn được sử dụng cho thành phần modifiers và thành phần con.
135
+
Chúng tôi khuyến khích sử dụng một biến thể của BEM với “block” PascalCase, mà nó hoạt động riêng biệt khá hiệu quả với các thành phần (component) (vd: React). Dấu gạch dưới và gạch ngang vẫn được sử dụng cho thành phần Modifier và thành phần con.
136
136
137
137
**Ví dụ**
138
138
@@ -161,21 +161,21 @@ function ListingCard() {
161
161
.ListingCard__content { }
162
162
```
163
163
164
-
*`.ListingCard` là một "block" và đại diện cho thành phần cao hơn
165
-
*`.ListingCard__title` là một "phần tử" and biểu diễn như là một phần tử con của `.ListingCard` để tạo thành "block".
166
-
*`.ListingCard--featured` là một "modifier" và đại diện cho các trạng thái khác nhau hay các biến thể của `.ListingCard` block.
164
+
*`.ListingCard` là một “block” và đại diện cho thành phần cao hơn
165
+
*`.ListingCard__title` là một “phần tử” và biểu diễn như là một phần tử con của `.ListingCard` để tạo thành “block”.
166
+
*`.ListingCard--featured` là một “modifier” và đại diện cho các trạng thái khác nhau hay các biến thể của block `.ListingCard`.
167
167
168
-
### ID Selectors
168
+
### ID Selector
169
169
170
-
Trong khi có thể chọn các phần tử theo ID trong CSS, nó vẫn không nên được sử dụng. ID selectors giới thiệu một sự riêng biệt [sự riêng biệt](https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity) không cần thiết cho các khai báo của bạn và không thể tái sử dụng lại được.
170
+
Việc chọn những phần tử bằng ID trong CSS vẫn khả thi, nhưng nhìn chung vẫn không nên được áp dụng. ID selector tạo ra nên [tính đặc trưng](https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity) không cần thiết cho các khai báo của bạn và không thể tái sử dụng lại được.
171
171
172
-
Để biết thêm về chủ đề này, đọc [CSS Wizardry's article](http://csswizardry.com/2014/07/hacks-for-dealing-with-specificity/)on dealing with specificity.
172
+
Để biết thêm về chủ đề này, đọc [bài viết của CSS Wizardry](http://csswizardry.com/2014/07/hacks-for-dealing-with-specificity/)về cách để giải quyết vấn tính đặc trưng trong CSS.
173
173
174
-
### JavaScript hooks
174
+
### JavaScript hook
175
175
176
-
Tránh việc binding cùng một class trong CSS và JavaScript. Việc làm đó có thể gây lãng phí thời gian ở mức nhẹ nhất khi lập trình viên phải kiểm tra chéo mỗi class khi thay đổi. Và trong trường hợp xấu nhất, lập trình viên có thể sẽ phải đối mặt với việc phá vỡ sự hoạt động của function.
176
+
Tránh việc gắn kết cùng một class trong CSS và JavaScript. Kết hợp cả hai ít nhất có thể gây lãng phí thời gian trong suốt quá trình tái cấu trúc mã nguồn khi lập trình viên phải kiểm tra chéo mỗi class khi thay đổi, và trong trường hợp xấu nhất, lập trình viên có thể sẽ phải đối mặt với việc phá vỡ một chức năng nào đó.
177
177
178
-
Chúng tôi khuyến nghị tạo ra các class riêng cho JavaScript để bind, tiền tố bắt đầu với `.js-`:
178
+
Chúng tôi khuyến khích tạo ra các class riêng cho JavaScript để gắn kết, tiền tố bắt đầu với `.js-`:
179
179
180
180
```html
181
181
<buttonclass="btn btn-primary js-request-to-book">Request to Book</button>
@@ -185,15 +185,15 @@ Chúng tôi khuyến nghị tạo ra các class riêng cho JavaScript để bind
185
185
186
186
Sử dụng `0` thay vì `none` để xác định rằng đối tượng này không có đường viền.
187
187
188
-
**Bad**
188
+
**Không nên**
189
189
190
190
```css
191
191
.foo {
192
192
border: none;
193
193
}
194
194
```
195
195
196
-
**Good**
196
+
**Nên**
197
197
198
198
```css
199
199
.foo {
@@ -205,14 +205,14 @@ Sử dụng `0` thay vì `none` để xác định rằng đối tượng này k
205
205
206
206
### Cú pháp
207
207
208
-
* Sử dụng `.scss` cú pháp, không bao giờ nên sử dụng cú pháp gốc của`.sass`
209
-
* Sắp xếp CSS và `@include` theo một logic (xem ở dưới)
208
+
* Sử dụng cú pháp `.scss`, không bao giờ sử dụng cú pháp gốc `.sass`
209
+
* Sắp xếp CSS và `@include` theo một logic (xem bên dưới)
210
210
211
211
### Sắp xếp các khai báo thuộc tính
212
212
213
213
1. Khai báo thuộc tính
214
214
215
-
Khai báo toàn bộ thuộc tính cơ bản trước, những gì không phải là `@include` hay khai báo lồng (nested) selector.
215
+
Khai báo toàn bộ thuộc tính cơ bản trước, những gì không phải là `@include` hay selector lồng nhau (nested).
216
216
217
217
```scss
218
218
.btn-green {
@@ -224,7 +224,7 @@ Sử dụng `0` thay vì `none` để xác định rằng đối tượng này k
224
224
225
225
2. Khai báo `@include`
226
226
227
-
Nhóm `@include` ở cuối cùng để dễ dàng đọc toàn bộ selector.
227
+
Nhóm những `@include` ở cuối cùng để làm cho việc đọc toàn bộ selector dễ dàng hơn.
228
228
229
229
```scss
230
230
.btn-green {
@@ -235,9 +235,9 @@ Sử dụng `0` thay vì `none` để xác định rằng đối tượng này k
235
235
}
236
236
```
237
237
238
-
3. Selectors lồng nhau
238
+
3. Selector lồng nhau
239
239
240
-
Selectors lồng nhau, _nếu cần thiết_, đặt ở cuối cùng, và không có gì viết sau nó nữa. Thêm khoảng trắng giữa khai báo và selector lồng nhau, cũng như giữa các phần tử con. Áp dụng toàn bộ hướng dẫn ở trên cho selector lồng nhau.
240
+
Selector lồng nhau, _nếu cần thiết_, đặt ở cuối cùng, và không có gì viết sau nó nữa. Thêm khoảng trắng giữa khai báo và selector lồng nhau, cũng như giữa các phần tử lồng nhau liền kề. Áp dụng tương tự hướng dẫn như trên cho selector lồng nhau.
241
241
242
242
```scss
243
243
.btn {
@@ -253,19 +253,19 @@ Sử dụng `0` thay vì `none` để xác định rằng đối tượng này k
253
253
254
254
### Biến
255
255
256
-
Nên dùng gạch ngang giữa tên biến (e.g. `$my-variable`) thay vì camelCased or snake_cased. Nó cũng được phép dùng để đặt tiền tố cho tên biến nếu có ý định sử dụng trong cùng một file với dấu gạch dưới (e.g. `$_my-variable`).
256
+
Nên dùng gạch ngang giữa tên biến (e.g. `$my-variable`) thay vì camelCase or snake_case. Nó cũng được chấp nhận để đặt tiền tố cho tên biến nếu có ý định sử dụng trong cùng một tập tin với dấu gạch dưới (vd: `$_my-variable`).
257
257
258
-
### Mixins
258
+
### Mixin
259
259
260
-
Mixins nên được sử dụng để không lặp lại các đoạn code giống nhau với phương châm (DRY - Don't-Repeat-Yourself) trong code của bạn, thêm sự rõ ràng, hoặc tách sự phức tạp - theo cách tương tự mà function được đặt tên. Mixins cho phépkhông có đối số có thể hữu ích cho việc này, nhưng chú ý rằng nếu bạn không nén lại (e.g. gzip), nó có thể đóng góp vào việc trùng lặpcode không cần thiết.
260
+
Mixin nên được sử dụng để không lặp lại các đoạn code giống nhau với phương châm (DRY - Don't-Repeat-Yourself) trong code của bạn, thêm sự rõ ràng, hoặc tách sự phức tạp--theo cách tương tự mà chức năng được đặt tên. Mixin không có đối số có thể hữu ích cho việc này, nhưng chú ý rằng nếu bạn không nén lại (vd: gzip), nó có thể tạo ra sự trùng lặpmã nguồn không cần thiết.
261
261
262
-
### Extend directive
262
+
### Mở rộng directive
263
263
264
-
Nên tránh sử dụng `@extend` vì nó có một hành vi nguy hiểm tiềm tàng, đặc biệt khi sử dụng các selectors lồng nhau. Thậm chí mở rộng top-levelplaceholder selectors có thể gây ra vấn đề nếu thứ tự của selector kết thúc thay đổi sau đó (e.g. nếu họ đang ở một tệp tin khác, và thứ tự của các tệp tin được tải thay đổi.). Bạn có thể không lặp lạiđoạn code của mình vớimixins.
264
+
Nên tránh sử dụng `@extend` vì nó có một hành vi nguy hiểm tiềm tàng, đặc biệt khi sử dụng các selector lồng nhau. Thậm chí mở rộng placeholder selector cấp cao nhất có thể gây ra vấn đề nếu thứ tự của selector thay đổi sau đó (vd: nếu chúng đang ở một tập tin khác, và thứ tự của các tập tin được tải sẽ thay đổi). Gzip nên được sử dụng để thực hiện việc nén mà bạn có thể làm được với `@extend`, và bạn có thể DRY đoạn code của mình một cách đẹp đẽ vớimixin.
265
265
266
-
### Selectors lồng nhau
266
+
### Selector lồng nhau
267
267
268
-
**ĐỪNG selectors lồng hơn 3 cấp độ!**
268
+
**ĐỪNG lồng selector hơn 3 cấp!**
269
269
270
270
```scss
271
271
.page-container {
@@ -277,20 +277,20 @@ Nên tránh sử dụng `@extend` vì nó có một hành vi nguy hiểm tiềm
277
277
}
278
278
```
279
279
280
-
Khi selectors trở nên như vậy, bạn có thể đã viết CSS theo:
280
+
Khi selector trở nên như vậy, bạn có thể đã viết CSS theo:
281
281
282
-
* Liên kết chặt vớiHTML (dễ đổ vỡ) *hoặc*
283
-
* Quá cụ thể (powerful) *—hoặc—*
282
+
* Liên kết chặt vớiHTML (đặc trưng thấp) *—hoặc—*
283
+
* Quá cụ thể (đặc trưng quá cao) *—hoặc—*
284
284
* Không tái sử dụng
285
285
286
286
287
-
Lặp lại: **không bao giờ được lồng ID selectors!**
287
+
Lặp lại: **không bao giờ được lồng ID selector!**
288
288
289
-
Nếu bạn phải sử dụng ID selector ngay từ đầu (và bạn thực sự không nên làm thế), nó không bảo giờ nên được lồng nhau. Nếu bạn thấymình làm điều này, bạn cần phải xem xét lạicodeHTML, hoặc tìm hiểu tại sao lại cần cụ thể đến như vậy. Nếu bạn đang viết HTML và CSS tốt, bạn **không bao giờ nên** cần phải làm điều này.
289
+
Nếu bạn phải sử dụng ID selector ngay từ đầu (và bạn thực sự không nên làm thế), thì chúng không bao giờ nên được lồng nhau. Nếu bạn nhận ra mình đang làm điều này, bạn cần phải xem xét lạimãHTML, hoặc tìm hiểu tại sao lại cần tính đặc trưng cao đến như vậy. Nếu bạn đang viết HTML và CSS tốt, bạn **không bao giờ nên** cần phải làm điều này.
290
290
291
-
## Dịch
291
+
## Bản dịch
292
292
293
-
Styleguide này cũng có sẵn trong các ngôn ngữ khác:
0 commit comments