Cách viết rút gọn border
border vẽ một đường quanh phần tử, nằm giữa padding và margin. Cách viết rút gọn nhận ba phần theo thứ tự bất kỳ: độ dày, kiểu và màu.
| Phần | Thuộc tính đầy đủ | Giá trị | Mặc định |
|---|---|---|---|
| Độ dày | border-width | 1px, 0.2em, thin, medium, thick | medium |
| Kiểu | border-style | solid, dashed, dotted, double và nhiều kiểu khác | none |
| Màu | border-color | Màu bất kỳ | currentColor (màu chữ) |
Kiểu viền là phần bạn không thể bỏ qua. Mặc định của nó là none, nên border: 2px #2563eb; không vẽ gì cả. Nếu bỏ màu, đường viền lấy màu chữ của phần tử.
Các kiểu viền
double cần ít nhất 3px mới hiện được hai đường. groove, ridge, inset và outset đổ bóng màu để trông như 3D và hơi khác nhau giữa các trình duyệt. hidden trông giống none; hai giá trị này chỉ khác nhau trong bảng có viền gộp (collapsed), nội dung có trong trang viền bảng HTML.
Từng cạnh một
Mỗi cạnh có cách viết rút gọn riêng (border-top, border-right, border-bottom, border-left), và mỗi phần có thuộc tính đầy đủ theo cạnh như border-top-color. Các phiên bản logic, border-inline-start và border-block-end, đi theo hướng của chữ:
border-color, border-width và border-style nhận từ một đến bốn giá trị theo cùng thứ tự chiều kim đồng hồ như padding: trên, phải, dưới, trái.
Bo góc với border-radius
border-radius bo tròn góc của đường viền và của nền, nên dùng được cả với phần tử không có viền.
| Giá trị | Kết quả |
|---|---|
border-radius: 8px | Bo tròn mọi góc 8px |
border-radius: 50% | Hình tròn trên phần tử vuông, hình elip trên hình chữ nhật |
border-radius: 999px | Hình viên thuốc: hai cạnh ngắn thành nửa hình tròn |
border-radius: 8px 0 | Góc trên trái và dưới phải 8px, hai góc còn lại vuông |
border-top-left-radius: 12px | Chỉ một góc |
border-radius: 50% / 25% | Góc elip: bán kính ngang / bán kính dọc |
Phần tử con có nền có thể lòi ra ngoài góc bo tròn của phần tử cha. overflow: hidden trên phần tử cha sẽ cắt nó theo đường cong.
Border và outline
Outline trông giống border nhưng được vẽ bên ngoài và không chiếm chỗ, nên thêm outline không bao giờ làm xê dịch thứ gì. Vì vậy trình duyệt dùng outline cho vòng focus.
| Border | Outline | |
|---|---|---|
| Chiếm chỗ | Có, là một phần kích thước hộp | Không |
| Theo từng cạnh | Có (border-top, ...) | Không, bao quanh toàn bộ |
Theo border-radius | Có | Có, trên các trình duyệt hiện nay |
| Cách xa hộp | Không | Có, outline-offset |
| Cách dùng thường gặp | Thiết kế | Chỉ báo focus, gỡ lỗi |
Lỗi thường gặp
- Không có kiểu viền.
border: 1px #111827;vàborder-color: red;không vẽ gì. Hãy thêmsolid(hoặc kiểu khác). - Viền làm bố cục nhảy khi hover. Hãy giữ chỗ bằng một viền trong suốt, hoặc dùng outline hay
box-shadow. - Quên tính viền vào chiều rộng. Phần tử
width: 100%có viền sẽ tràn khỏi phần tử chứa khi dùngcontent-box. Hãy dùngbox-sizing: border-box. border-radiusmà phần tử con lòi ra ở góc. Thêmoverflow: hiddencho phần tử cha được bo góc.- Xóa outline focus bằng
outline: none. Người dùng bàn phím cần nó; hãy định dạng lại outline thay vì xóa đi.
Câu hỏi thường gặp
Làm sao thêm đường viền trong CSS?
Dùng cách viết rút gọn với độ dày, kiểu và màu: border: 2px solid #2563eb;. Kiểu viền là phần quan trọng nhất: nếu thiếu, kiểu viền là none và không có đường viền nào được vẽ.
Vì sao border CSS của tôi không hiện?
Gần như luôn là vì chưa đặt kiểu viền. Chỉ border: 2px #2563eb; hay border-color: red; thì không vẽ gì, vì border-style mặc định là none. Hãy thêm solid, dashed hoặc một kiểu khác.
Làm sao bo góc trong CSS?
Dùng border-radius: border-radius: 8px; bo tròn cả bốn góc. border-radius: 50%; trên một hình vuông tạo ra hình tròn, còn giá trị lớn như 999px tạo hình viên thuốc. Thuộc tính này bo cả nền, kể cả khi không có đường viền.
Làm sao thêm viền cho một cạnh duy nhất?
Dùng thuộc tính theo cạnh: border-bottom: 2px solid #e5e7eb;, hoặc border-inline-start cho cạnh nơi chữ bắt đầu, cách này cũng đúng với ngôn ngữ viết từ phải sang trái.
border và outline khác nhau thế nào?
Border là một phần của hộp: nó chiếm chỗ và làm thay đổi kích thước phần tử. Outline được vẽ bên ngoài border mà không chiếm chỗ, không đặt riêng được cho từng cạnh, và là thứ trình duyệt dùng cho vòng focus. Cả hai đều theo border-radius trên các trình duyệt hiện nay.