2010-02-01 32 views
48

Khi một phần tử có lề được chứa trong một phần tử khác, thì phần tử cha mẹ không liên tục bao bọc lề đó.Tại sao lề không được chứa bởi phần tử gốc?

Nhiều điều sẽ làm cho cha mẹ để quấn lề của trẻ:

  • biên giới: rắn;
  • vị trí: tuyệt đối;
  • display: inline-block;
  • overflow: auto

(. Và điều này chỉ từ thử nghiệm nhỏ, không có nghi ngờ có nhiều)

tôi sẽ giả định này đã làm với biên độ sụp đổ, nhưng:

  1. Trang thông số W3C không có mô tả về hành vi đó.
  2. Không có chênh lệch chồng chéo nào ở đây.
  3. Hành vi của tất cả các trình duyệt có vẻ nhất quán với vấn đề này.
  4. Các hành vi bị ảnh hưởng bởi trigger mà không liên quan đến lề

logic mà một yếu tố mà mặc định là tràn là gì: tự động nên chứa tài liệu khác so với một nơi tràn được thiết lập để tự động .

Tại sao mọi thứ nhưng hành vi mặc định của div thông thường giả định rằng lề được chứa bởi phụ huynh - và tại sao mặc định thông thường không bao gồm ký quỹ?

EDIT: Câu trả lời cuối cùng là W3C thực sự xác định hành vi này, nhưng điều đó

  • Các thông số kỹ thuật không thực sự có ý nghĩa gì.
  • The specs mix, without any word of explanation:
    • 'lề miễn phí' (lợi nhuận đó sẽ chạm vào đầu hoặc cuối của cha mẹ của họ không được chứa bởi công ty mẹ) và
    • 'sụp đổ lề' (lề liền kề được phép chồng chéo lên nhau).

Demo:

<!doctype html> 
<html> 
<head> 
<title>Margins overextending themselves</title> 
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" > 
<style type="text/css"> 
    body{ 
     margin:0; 
    } 
    div.b{ 
     background-color:green; 
    } 
    div.ib{ 
     display:inline-block; 
     background-color:red; 
    } 
    div.pa{ 
     background-color:yellow; 
     position:absolute; 
     bottom:0; right:0; 
    } 
    div.oa{ 
     background-color:magenta; 
     overflow:auto; 
    } 
    div.brdr{ 
     background-color:pink; 
     border:solid; 
    } 

    h1{margin:100px; width:250px; border:solid;} 
</style> 
</head> 
<body> 
<div class="b"> 
    <h1>Is the margin contained?</h1> 
</div> 
<div class="ib"> 
    <h1>Is the margin contained?</h1> 
</div> 
<div class="pa"> 
    <h1>Is the margin contained?</h1> 
</div> 
<div class="oa"> 
    <h1>Is the margin contained?</h1> 
</div> 
<div class="brdr"> 
    <h1>Is the margin contained?</h1> 
</div> 
</body> 
</html>` 
+0

Tôi không hiểu bạn đang hỏi gì. Bạn có hỏi tại sao các phần tử h1 hiển thị bên trong các phần tử vùng chứa không? Hãy rõ ràng hơn với câu hỏi của bạn. –

Trả lời

26

Đây là cách CSS làm việc according to W3C:

Trong đặc tả này, khái niệm sụp đổ lề có nghĩa là lợi nhuận liền kề (không có nội dung không trống, padding, hoặc các khu vực biên giới, hoặc giải phóng mặt bằng tách chúng) của hai hoặc nhiều hộp (có thể được cạnh nhau hoặc lồng nhau) kết hợp để tạo thành một lề duy nhất.

More cụ thể đối với trường hợp của bạn của div top:

Nếu bên lề trên và dưới của hộp được liền kề, sau đó nó có thể cho lợi nhuận sụp đổ qua nó. Trong trường hợp này, vị trí của phần tử phụ thuộc vào mối quan hệ của nó với các phần tử khác có lề bị sụp đổ.

  • Nếu lề của phần tử bị sập với lề trên cùng của phụ huynh, cạnh viền trên cùng của hộp được xác định giống như của cha mẹ.
  • Nếu không, cha mẹ của phần tử không tham gia vào việc thu hẹp ký quỹ hoặc chỉ có lợi nhuận dưới cùng của phụ huynh có liên quan. Vị trí của cạnh biên giới trên cùng của phần tử là giống như nó đã có nếu phần tử có một đường viền dưới không khác.

Điều tốt nhất tôi có thể làm là chỉ cho bạn trên "Collapsing Margins" on sitepoint(Tommy Olsson và Paul O'Brien). Họ thực hiện giải thích chi tiết rất với các ví dụ cho bạn thấy chính xác hành vi bạn đã giới thiệu trong mã ví dụ câu hỏi.

+0

Theo bài viết đó, hành vi nhìn thấy là không chính xác.
Về câu trả lời của bạn: "các khoản thu hẹp có nghĩa là các lề liền kề ... kết hợp". Vì không có lề liền kề ở đây nên đây không thể là một biên độ thu hẹp. Cụ thể, "Nếu lợi nhuận của phần tử bị thu hẹp với lề trên của cha mẹ" - không thể, vì cha mẹ không có lề trên. Trong câu hỏi tôi xử lý với các khoản thu hẹp. Trong cả hai trường hợp, tuy nhiên, điều này sẽ không giải thích lý do tại sao hành vi nên thay đổi khi hiển thị là khối nội tuyến hoặc tràn được đặt thành tự động (điều này giống như mặc định). – SamGoody

+0

Chỉnh sửa: Trong bài viết đó, nó liệt kê một số trình kích hoạt của tôi + những người khác. Cũng giống như các bộ kích hoạt này ngăn cản các lề chồng chéo bị sụp đổ, chúng ngăn cản các biên lề thường xuyên bị sụp đổ. Hai câu hỏi: 1) Hành vi này có ý nghĩa gì? 2) Tại sao tôi nghĩ rằng tôi có một biên độ chồng chéo? – SamGoody

+1

@samgoody - 1) Tôi đồng ý nó không có ý nghĩa nhiều, ngoại trừ nếu bạn đến từ một nền in, mà chủ yếu là những gì web là khi spec được viết. Xem ở đây cho rằng xem: http://complexspiral.com/publications/uncollapsing-margins/ 2) Đó là một điều cha/con trong trường hợp của bạn ... sự sụp đổ từ cha/con là cho 'div.b' 100px lề thẳng đứng, đó là lý do tại sao nền trắng thay vì màu xanh lá cây. Tôi nghĩ rằng vấn đề là spec là không rõ ràng về ** WHICH ** margin thắng trong một sự sụp đổ trong trường hợp này, có vẻ như với trình duyệt hiện tại, phụ huynh nhận được nó. –

Các vấn đề liên quan