Box Model
- October 8, 2008
- 13 comments
Bất cứ thành phần nào bạn tạo ra trong code XHTML đều được bao quanh bởi một hộp kể cả dòng chữ bạn gõ ra cũng có một hộp bao quanh nó. Ở giá trị mặc định đường viền cũng như màu sắc của hộp là trong suốt do vậy bạn không thấy được. Nhưng với CSS bạn có thể cho hiển thị đường viền cũng như màu nền của bất cứ đối tượng nào trong trang mà bạn muốn. Ở ví dụ dưới đây tôi cho hiển thị đường viền của thẻ p và thẻ h1 và màu nền là màu #EEE để bạn thấy được khái niệm hộp bao quanh đối tượng.
p {border: solid 1px red; background-color:#bbeeff;}
h1 {border: solid 1px red; background-color:#bbeeff;}
Dòng chữ với đường viền và màu nền
Nhưng với CSS bạn có thể cho hiển thị đường viền cũng như màu nền của bất cứ đối tượng nào trong trang mà bạn muốn. Ở ví dụ dưới đây tôi cho hiển thị đường viền của thẻ
Box Model
Box Model là khái niệm rất cơ bản và cũng là quan trọng nhất của CSS. Bởi vì nó quyết định các thành phần trên trang web sẽ được xuất hiện như thế nào và chúng tương tác với nhau ra làm sao. Dưới đây là hình minh hoạ cho bạn thấy rõ được những thành phần của hộp và chúng ta có thể tác động đến nó như thế nào
Padding: là vùng nằm giữa đường viền và nội dung. Padding thường được sử dụng để tạo ra khoảng trống giữa đường biên và chữ như 2 ví dụ dưới đây.
Đoạn văn này có đường viền mà không có padding
Đoạn văn này có đường viền và giá trị padding là 5px.
Rõ ràng bạn thấy ở đoạn văn thứ 2 dễ đọc hơn và nhìn nó cũng “dễ thở” hơn. Ở đoạn văn thứ 2 khi giá trị border-style được khai báo, nó sẽ tạo ra một đường viền bao quanh lấy vùng padding.
Border
Khi khai báo đường viền, bạn nên nhớ luôn phải khai báo giá trị border-style. Nếu giá trị này không được khai báo, tất cả những giá trị như màu sắc, độ dày sẽ không được hiển thị. Đơn giản là vì khi giá trị border-style không được khai báo, trình duyệt sẽ cho rằng nó bằng 0. Một khi đã bằng 0 rồi thì màu sắc cũng như độ dày không được xuất hiện là điều tất nhiên. Ở ví dụ dưới đây bạn thấy các thành phần sẽ được hiển thị như thế nào khi bạn tác động đến đường viền của nó
Hiển thị đường viền với giá trị là solid
Hiển thị đường viền với giá trị là dotted
Hiển thị đường viền với giá trị là dashed
Hiển thị đường viền với giá trị là double
Hiển thị đường viền với giá trị là groove
Hiển thị đường viền với giá trị là ridge
Hiển thị đường viền với giá trị là inset
Hiển thị đường viền với giá trị là outset
Ở những ví dụ trên mỗi một loại đều có 3 giá trị tương ứng và theo thứ tự là: border-style, border-width và border-color. Bạn có thể khai báo chúng riêng biệt như sau:
p {border-style: dashed; border-width: 3px; border-color: yellow;}
hoặc gộp chung vào một như sau
p {border: 3px dashed yellow;}
Margin
Bên ngoài border là margin, nó được dùng để tạo khoảng cách giữa các thành phần. Các thành phần margin, border và padding đều được mặc định là 0. Nhưng mỗi trình duyệt lại mặc định một kiểu, do vậy khi viết code CSS bạn nên luôn reset các giá trị này lại thành 0 để tránh phiền phức sau này.
* {margin: 0; padding: 0;}
Tính bù của Margin
Tính năng cuối cùng của Margin mà bạn cần biết là tính bù của nó. Ví dụ ở hình dưới đây tôi có ba đoạn văn bản và đều có margin-top: 50px và margin-bottom: 30px được xếp chồng lên nhau. Có thể bạn nghĩ vì margin-bottom của đoạn văn bản trên là 30px và margin-top của đoạn văn bản kế tiếp là 50px thì tổng cộng 2 đoạn văn này sẽ phải cách nhau một khoảng là 80 px. Nhưng trong thực tế lại không phải vậy. Khi có hai giá trị margin được thiết lập, thì margin lớn sẽ “nuốt” margin bé hay nó bù vào nhau. Do vậy ở ví dụ dưới, nó chỉ cách nhau 50 px và khoảng cách giữa chúng là khoảng cách của margin được thiết lập lớn hơn.
Đoạn văn thứ nhất
Đoạn văn thứ hai
Đoạn văn thứ ba
Code CSS
p {border: 1px solid red; margin: 50px 0px 30px 0px;}
Cách viết rút gọn
Trong ví dụ trên bạn thấy tôi dùng {margin: 50px 0px 30px 0px;} đây chính là cách viết tắt trong CSS khi bạn phải làm việc với Border, Padding và Margin. Thứ tự của nó luôn theo chiều kim đồng hồ Top, Right, Bottom và Left. Bạn có thể nhớ như kiểu 12 giờ, 3 giờ, 6 giờ và 9 giờ.
Ví dụ khi bạn muốn tác động đến Margin của một thành phần bất kỳ bạn có thể viết đầy đủ là:
{margin-top: 5px; margin-right: 10px; margin-bottom: 15px; margin-left: 20px;}
hoặc bạn có thể giản lược nó đơn giản như sau để tiết kiệm thời gian và công sức, bạn chỉ cần dấu cách giữa các giá trị:
{margin:5px 10px 15px 20px;}
Bạn không cần phải viết hết toàn bộ 4 giá trị, nếu một trong 4 giá trị ở trên bị thiếu, thì nó sẽ lấy giá trị của cạnh đối diện với nó.
{margin:12px 10px 6px;}
Trong ví dụ này, bởi vì cạnh bên trái không có do vậy giá trị của cạnh bên phải được sử dụng và nó có độ dày là 10 px. Còn nếu như chỉ có duy nhất một giá trị như sau
{margin:12px;}
Thì cả 4 cạnh sẽ có độ dày là 12px. Chính vì thế bạn không thể bỏ trống giá trị nào cả. Nếu bạn muốn một cạnh nào đó không hiển thị, bạn phải khai báo nó với giá trị là 0. Tuy nhiên, khi giá trị đó là 0 bạn không cần phải khai báo đơn vị.
{border:0px 0px 2px 4px;}
Nếu bạn khai báo giá trị bằng 0, bạn không bắt buộc phải thêm đơn vị đo vào đằng sau. Nhưng để tránh nhầm lẫn và sau này có phải chỉnh sửa sẽ tiết kiệm thời gian hơn.
Hi, mình vừa gặp một rắc rối với margin, và phát hiện ra tính Bù của Margin, bài viết này rất chính xác nhưng vẫn thiếu, tính Bù của Margin chỉ có cho Margin Trên và Dưới, còn Trái Phải thì không, các margin Trái hay Phải sẽ cộng dồn vào nhau để tạo ra khoảng cách của 2 margin bằng tổng Margin Right của Div 1 và Margin Left của Div 2.
đọc xong mình hiểu ý về css bài viết này.thank chia sẽ
đọc bài viết mình hiểu sơ khái niệm css này
theo mình hiểu thì “MARGIN” để căn lề (top,right,bottom,left) của cái phần border với không gian chứa nó.Còn “PADDING” là căn lề (top,right,bottom,left) nội dung bên trong Border với cái boder đó
anh oi giup e cai nay voi !
e moi hoc ve web . em moi thiet kiet mot tran sao no cu ra tum lum het .
anh giup em nha !
anh DW ơi ! anh có thể làm một tutorial vể Margin và Padding không . em mới học CSS nên hơi bị dở về phần này ?em cứ lộn giữa hai thuộc tính này không ah ? hy vọng anh sẽ làm . thanks anh rất nhiều . ah quên , trang WEB của anh hay lắm đó ?hi
Chào anh DW.
Em có một thắc mắc đó là tại sao lại để margin-top: 50px và margin-bottom: 30px, dù đã biết được tính bù của nó khi chúng chọn cái giá trị lớn nhất áp dụng vào thẻ html. Theo tính bù của margin thì chọn giá trị là 50px, vậy còn giá trị 30px khi nào thì áp dụng vào hả anh? nó có ảnh hưởng ntn? có cần thiết để giá trị margin-bottom: 30px hay là margin-bottom: 0px;
Có vẻ bạn chưa hiểu về giá trị Margin. Hệ thống margin bao gồm 4 kiểu.
margin-top : Khoảng cách phía trên.
margin-bottom : Khoảng cách phía dưới.
margin-left : Khoảng cách bên trái.
margin-right : Khoảng cách bên phải.
Các giá trị trên sẽ độc lập với nhau, nếu bạn chỉ muốn box của mình có khoảng cách phía trên mà thôi, còn lại các khoảng cách khác thì không thay đổi thì bạn chỉ sử dụng mỗi margin-top.
- Trường hợp bạn muốn khoảng cách đều thì chỉ sử dụng giá trị margin mà thôi, không cần các giá trị top, bottom…
anh ơi cho em hỏi padding:inherit là sao ạ?
em không hiểu inherit là sao hết.
khá hay và chi tiết
Đơn giản không chạy là do sai cú pháp nếu là class thì `
__abENT__#46;` còn id thì `#`VD `
__abENT__#46;tieude {margin: 20px 0px;}`Kiểm tra lại hen
Thuộc tính margin đâu cần phải sử dụng class em? nếu em muốn thành phần nào có margin thì em sử dụng selector để chọn nó thôi.
Ví dụ em muốn tieude có margin thì em làm thế này
`
tieude {margin: 20px 0px;}`Nên sử dụng cách viết tắt trong CSS cho tiết kiệm thời gian em.
Em gặp rắc rối với margin, ở dưới đây, em cho margin vào 1 class, rồi trong file html em đã chèn class đó vào thì margin không chạy. Em thật sự không hiểu sai ở đâu, đây là CSS của em :
`
@charset __abENT__quot;utf-8__abENT__quot;;__abENT__#8260;* CSS Document *__abENT__#8260;
tieude, cth1, date, time, match {font-family:Tahoma, Geneva, sans-serif; }
tieude {font-size:36px; color:#F00; border-style:solid; border-width:thin; border-color:#F00; padding:5px; }
cth1 {font-size:14px; color:#9C9; }
date {font-size:24px; color:#C66; }
time {font-size:18px; color:#F96; }
match {font-size:30px; color:#red; }
__abENT__#46;margin {margin-top:100px; margin-bottom:100px; margin-right:50px; margin-left:50px; }`