Giải pháp chỉ gọn gàng CSS
Sử dụng mã sau đây để thêm một đứa con đầu tiên không có nội dung vào div di chuyển không chủ ý:
.parent:before
{content: '';position: relative;height: 0px;width: 0px;overflow: hidden;white-space: pre;}
Ưu điểm của phương pháp này là bạn không cần thay đổi CSS của bất kỳ yếu tố hiện có nào và do đó có tác động tối thiểu đến thiết kế. Bên cạnh đó, phần tử được thêm vào là phần tử giả, không có trong cây DOM.
Hỗ trợ cho các phần tử giả được phổ biến rộng rãi: Firefox 3+, Safari 3+, Chrome 3+, Opera 10+ và IE 8+. Điều này sẽ hoạt động trong bất kỳ trình duyệt hiện đại nào (hãy cẩn thận với trình duyệt mới hơn ::before
, không được hỗ trợ trong IE8).
Bối cảnh
Nếu con đầu tiên của một phần tử có a margin-top
, cha mẹ sẽ điều chỉnh vị trí của nó như một cách thu gọn các lề dư thừa. Tại sao? Chỉ như vậy thôi.
Đưa ra vấn đề sau:
<style type="text/css">
div {position: relative;}
.parent {background-color: #ccc;}
.child {margin-top: 40px;}
</style>
<div class="parent"><!--This div moves 40px too-->
<div class="child">Hello world!</div>
</div>
Bạn có thể sửa nó bằng cách thêm một đứa trẻ có nội dung, chẳng hạn như một không gian đơn giản. Nhưng tất cả chúng ta đều ghét thêm không gian cho vấn đề chỉ thiết kế. Do đó, sử dụng white-space
tài sản để nội dung giả mạo.
<style type="text/css">
div {position: relative;}
.parent {background-color: #ccc;}
.child {margin-top: 40px;}
.fix {position: relative;white-space: pre;height: 0px;width: 0px;overflow: hidden;}
</style>
<div class="parent"><!--This div won't move anymore-->
<div class="fix"></div>
<div class="child">Hello world!</div>
</div>
Trường hợp position: relative;
đảm bảo định vị chính xác của sửa chữa. Và white-space: pre;
làm cho bạn không phải thêm bất kỳ nội dung nào - như khoảng trắng - vào bản sửa lỗi. Và height: 0px;width: 0px;overflow: hidden;
chắc chắn rằng bạn sẽ không bao giờ thấy sửa chữa.
Bạn có thể cần thêm line-height: 0px;
hoặc max-height: 0px;
để đảm bảo chiều cao thực sự bằng không trong các trình duyệt IE cổ (tôi không chắc chắn). Và tùy chọn bạn có thể thêm <!--dummy-->
nó vào các trình duyệt IE cũ, nếu nó không hoạt động.
Nói tóm lại, bạn có thể thực hiện tất cả điều này chỉ với CSS (loại bỏ nhu cầu thêm một đứa trẻ thực sự vào cây DOM DOM):
<style type="text/css">
div {position: relative;}
.parent {background-color: #ccc;}
.child {margin-top: 40px;}
.parent:before {content: '';position: relative;height: 0px;width: 0px;overflow: hidden;white-space: pre;}
</style>
<div class="parent"><!--This div won't move anymore-->
<div class="child">Hello world!</div>
</div>