Tôi biết đây là một vấn đề cũ, tôi đã gặp nó nhiều lần. Vấn đề là tất cả các bản sửa lỗi ở đây là các bản hack có khả năng gây ra hậu quả không lường trước được.
Trước hết, có một lời giải thích dễ dàng cho vấn đề gốc. Do cách thức thu gọn lề hoạt động, nếu phần tử đầu tiên bên trong một container có lề trên, thì lề trên đó được áp dụng hiệu quả cho chính vùng chứa chính. Bạn có thể tự kiểm tra điều này bằng cách làm như sau:
<div>
<h1>Test</h1>
</div>
Trong trình gỡ lỗi, mở cái này lên và di chuyển div. Bạn sẽ nhận thấy rằng chính div thực sự được đặt ở nơi lề trên của phần tử H1 dừng lại . Hành vi này được dự định bởi trình duyệt.
Vì vậy, có một cách khắc phục dễ dàng cho vấn đề này mà không cần phải dùng đến các bản hack lạ, vì hầu hết các bài đăng ở đây đều làm (không có ý xúc phạm, đó chỉ là sự thật) - chỉ cần quay lại giải thích ban đầu - ...if the first element inside a container has a top margin...
- Theo đó, bạn sẽ cần phần tử đầu tiên trong một thùng chứa KHÔNG có lề trên. Được rồi, nhưng làm thế nào để bạn làm điều đó mà không thêm các yếu tố không can thiệp vào ngữ nghĩa với tài liệu của bạn?
Dễ dàng! Yếu tố giả! Bạn có thể làm điều này thông qua một lớp hoặc một mixin được xác định trước. Thêm một :before
yếu tố giả:
CSS thông qua một lớp:
.top-margin-fix:before {
content: ' ';
display: block;
width: 100%;
height: .0000001em;
}
Với điều này, theo ví dụ đánh dấu ở trên, bạn sẽ sửa đổi div của mình như sau:
<div class="top-margin-fix">
<h1>Test</h1>
</div>
Tại sao điều này làm việc?
Phần tử đầu tiên trong một thùng chứa, nếu nó không có lề trên, đặt vị trí bắt đầu của lề trên của phần tử tiếp theo. Bằng cách thêm một :before
yếu tố giả, trình duyệt thực sự thêm một yếu tố phi ngữ nghĩa (nói cách khác là tốt cho SEO) vào thùng chứa cha trước đó phần tử đầu tiên của bạn.
Q. Tại sao chiều cao: .0000001em?
A. Cần có chiều cao để trình duyệt đẩy phần tử lề xuống. Chiều cao này thực sự bằng không, nhưng nó vẫn sẽ cho phép bạn thêm phần đệm vào chính vùng chứa chính. Vì nó thực sự bằng không, nên nó cũng không ảnh hưởng đến cách bố trí của container. Xinh đẹp.
Bây giờ bạn có thể thêm một lớp (hoặc tốt hơn, trong SASS / LESS, mixin!) Để khắc phục sự cố này thay vì thêm các kiểu hiển thị lạ sẽ gây ra hậu quả không mong muốn khi bạn muốn làm những việc khác với các phần tử của mình, cố tình loại bỏ lề trên các phần tử và / hoặc thay thế nó bằng phần đệm, hoặc các kiểu vị trí / hình nổi lạ thực sự không có ý định giải quyết vấn đề này.
overflow:hidden
là tốt hơn cho 90% các trường hợp.