Mặc dù overflow: hidden là một "công cụ thô sơ" hầu như luôn cắt nội dung một cách nghiêm ngặt tại hộp khoảng đệm, nhưng overflow: clip kết hợp với overflow-clip-margin sẽ cung cấp "dao mổ" để kiểm soát bố cục chi tiết trên các vùng chứa khối.
Chỉ định chính xác vị trí cắt bằng overflow: clip và overflow-clip-margin. Bạn có thể căn chỉnh ranh giới chính xác với các cạnh mô hình hộp bên trong hoặc mở rộng ranh giới cắt ra ngoài hộp của phần tử theo một độ lệch được chỉ định (biên độ an toàn). Phương pháp hiện đại này có hiệu suất cao và loại bỏ yêu cầu cũ về việc thêm các vùng chứa trình bao bọc bổ sung có khoảng đệm tuỳ chỉnh và lề âm chỉ để cho phép các hiệu ứng hình ảnh (như bóng phần tử con nổi bật) hiển thị mà không bị cắt bớt.
Các phần tử được thay thế (<img>, <video>, <canvas>, v.v.) mặc định là overflow: clip và overflow-clip-margin: content-box, giúp bạn kiểm soát để chứa hình ảnh sử dụng object-fit hoặc border-radius một cách rõ ràng.
Cách triển khai
- Áp dụng
overflow: clip: Đảm bảo phần tử mục tiêu đã bậtoverflow: clip. Bạn bắt buộc phải đặtoverflow: cliptrên vùng chứa bố cục khối đểoverflow-clip-margincó hiệu lực. Nếu bạn đặtoverflowthànhhidden,autohoặcscroll, thì trình duyệt sẽ bỏ qua thuộc tínhoverflow-clip-margin.overflow: clipngăn chặn mọi thao tác cuộn (cả do người dùng thực hiện và có lập trình thông qua JavaScript). - Căn chỉnh theo cạnh hộp: Sử dụng từ khoá để căn chỉnh chính xác ranh giới cắt theo các cạnh của mô hình hộp bên trong:
content-box: Cắt nội dung chính xác tại nơi vùng nội dung bắt đầu, để lại vùng khoảng đệm hoàn toàn trống. Nội dung dừng ngay tại cạnh của khoảng đệm. Rất phù hợp với các mô-đun bố cục lồng nhau.padding-box(Mặc định): Cắt nội dung ở cạnh trong của đường viền.border-box: Cắt nội dung ở cạnh ngoài của đường viền, cho phép nội dung nằm dưới hoặc chồng lên một phần đường viền mờ.
- Xác định độ lệch cụ thể (Phần lề): Cung cấp giá trị độ dài (ví dụ:
15pxhoặc5px) để tạo vùng an toàn trước khi cắt pixel. Điều này cho phép các bóng phần tử con nổi bật hiển thị mà không bị cắt bớt qua cạnh ranh giới mà không cần mở rộng hình học bố cục. - Kết hợp Box-Edge và Offset: Chỉ định đồng thời cả cạnh hộp và độ lệch chiều dài (ví dụ:
content-box 15px) để bù trừ từ một cạnh hộp cụ thể.
Mã ví dụ
Các ví dụ sau đây minh hoạ các chế độ kiểm soát bố cục vùng chứa động, cho thấy khung lồng nhau của đường cong nội dung bên trong tự động và tính năng bảo vệ bóng của phần tử con cùng với các phương án dự phòng cải tiến tăng dần.
Vùng chứa khối: Đường cong bo tròn lồng nhau
- Áp dụng
overflow-clip-margin: content-boxcho vùng chứa mẹ có các góc bo tròn và khoảng đệm tuỳ chỉnh. - Áp dụng các góc bo tròn tương tự trên các thành phần chân trang và nội dung nghe nhìn con bên trong dọc theo ranh giới hộp nội dung bên trong đồng tâm, giải quyết các đường cong lồng ghép khó xử mà không cần logic
calc()tuỳ chỉnh.
<div class="nested-curve-parent">
<img src="avatar.jpg" alt="Nested Curve Demo">
<div class="nested-curve-footer">Card Footer</div>
</div>
/**
* Standard block layout container with outer corner radii and padding.
* Keeps base level 1 fallback clipping roughly at the inner padding box.
*/
.nested-curve-parent {
/* Level 1 Fallback: clips child roughly at the padding box */
overflow: hidden;
}
/* Inner footer component with 12px rounded to visually demonstrate automatic concentric corner clipping */
.nested-curve-footer {
background: #111;
color: #fff;
}
@supports (overflow-clip-margin: content-box) {
.nested-curve-parent {
/* MANDATORY: overflow: clip is required on non-replaced elements */
overflow: clip;
/* Automatically curves clipping edge to match inner content-box radius */
overflow-clip-margin: content-box;
}
}
Vùng chứa khối: Bóng của phần tử con bị tràn ra ngoài
- Áp dụng
overflow: clipvà xác định độ lệch chiều dàioverflow-clip-marginmở rộng để tạo vùng an toàn hiển thị, cho phép bóng của phần tử con hiển thị mà không bị cắt bớt bên ngoài vùng chứa mẹ mà không làm thay đổi hình dạng bố cục. Nếu không có thuộc tính này, bóng của thành phần con sẽ bị cắt bớt ở ranh giới của thành phần mẹ.
<div class="safety-zone-parent">
<h4>Clipped Container</h4>
<p>Inner content boundaries safely contained.</p>
<!-- Child button element positioned inside with a prominent shadow -->
<button class="demo-glowing-btn">Submit</button>
</div>
/**
* Standard block layout container clipping inner content.
* Base fallback uses overflow: hidden, which abruptly slices child element shadows.
*/
.safety-zone-parent {
/* Level 1 Fallback: clips overflowing content but truncates child shadows */
overflow: hidden;
}
/* Child button element positioned inside with an expanded shadow */
.demo-glowing-btn {
display: block;
box-shadow: 0 8px 13px rgba(229, 46, 113, 0.7);
}
@supports (overflow-clip-margin: 15px) {
.safety-zone-parent {
overflow: clip;
/* Establishes a visible safety zone allowing child element shadows to render safely outside */
overflow-clip-margin: 15px;
}
}
Triển khai chiến lược và các phương pháp hay nhất
- NÊN áp dụng
overflow: clipcho các phần tử mục tiêu khi sử dụngoverflow-clip-margin, vì việc đặtoverflowthànhcliplà bắt buộc trên các vùng chứa bố cục khối tiêu chuẩn để kích hoạt lề cắt cong bên trong hoặc tuỳ chỉnh. - NÊN đặt
overflow-clip-margin: content-boxtrên các vùng chứa có khoảng đệm và góc bo tròn để tự động cắt các phần tử con bên trong không bo tròn thành các đường cong đường viền lồng nhau hoàn hảo về mặt toán học mà không cần logic trừ khoảng đệm thủ công. - NÊN định cấu hình
overflow-clip-marginvới độ lệch chiều dài được chỉ định khi áp dụng hiệu ứng hình ảnh bên ngoài (nhưfilter: drop-shadow()) để ngăn chặn việc cắt bớt hộp giới hạn sắc nét mà không làm thay đổi hoặc mở rộng hình dạng bố cục. - KHÔNG áp dụng
overflow: clipnếu vùng chứa yêu cầu thao tác cuộn có lập trình thông qua JavaScript hoặc đóng vai trò là bối cảnh bố cục tức thì cho các phần tửposition: sticky, vìclipsẽ tắt hoàn toàn tính năng cuộn.
Chiến lược dự phòng
Đối với những môi trường mục tiêu thiếu tính năng hỗ trợ gốc cho overflow: clip hoặc overflow-clip-margin, chiến lược dự phòng cải tiến tăng dần phụ thuộc trực tiếp vào ý định hình ảnh:
- Dự phòng cho
overflow: hiddenlàm trải nghiệm cơ bản để đảm bảo duy trì các ranh giới cốt lõi. - Dự phòng cho
overflow: visibletrên các phần tử không được cắt bớt bóng đổ hoặc huy hiệu góc bên ngoài.
Hoàn tất việc triển khai phương án dự phòng cho chiến lược Cải tiến tăng dần
<!-- 1. Nested rounded edges fallback -->
<div class="demo-container-fallback">
<img src="example.jpg" alt="Nested Curve Fallback">
<div class="demo-footer-fallback">Footer</div>
</div>
<!-- 2. Child element shadow bleed fallback -->
<div class="demo-safety-parent">
<h4>Container</h4>
<p>Inner boundaries contained.</p>
<button class="demo-glowing-btn">Submit</button>
</div>
/**
* 1. Block Container Nested Curves Fallback
* Keeps base level 1 fallback clipping roughly at the inner padding box.
*/
.demo-container-fallback {
/* Level 1 Fallback: clip child roughly at padding box */
overflow: hidden;
}
.demo-container-fallback img {
object-fit: cover;
display: block;
}
@supports (overflow-clip-margin: content-box) {
.demo-container-fallback {
overflow: clip;
overflow-clip-margin: content-box;
}
}
/**
* 2. Child Element Shadow Bleed Fallback
* Base fallback clips content using overflow: hidden, abruptly truncating child element shadows.
*/
.demo-safety-parent {
/* Level 1 Fallback */
overflow: hidden;
}
.demo-glowing-btn {
display: block;
width: 100%;
padding: 6px 12px;
background: #e52e71;
box-shadow: 0 8px 13px rgba(229, 46, 113, 0.65);
}
@supports (overflow-clip-margin: 15px) {
.demo-safety-parent {
overflow: clip;
overflow-clip-margin: 15px;
}
}