2012-04-07 41 views
31

Với cấu trúc đơn giản này:Khi một phần tử con tràn qua chiều ngang, tại sao phần đệm phải của phụ huynh bị bỏ qua?

<div id="parent"> 
    <div id="child">Lorem ipsum</div> 
</div> 

với CSS này:

#parent { 
    width: 200px; 
    height: 200px; 
    padding: 20px; 
    overflow-x: scroll; 
} 

#child { 
    width: 500px;  
} 

Live Demo:http://jsfiddle.net/523me/5/

ý rằng phụ huynh có đệm 20px và rằng đứa trẻ tràn theo chiều ngang (bởi vì nó rộng hơn). Nếu bạn di chuyển cha mẹ tất cả các con đường bên phải, bạn sẽ thấy rằng đứa trẻ chạm vào cạnh phải của phụ huynh.

Vì vậy, cha mẹ phải có đệm đúng, nhưng nó bị bỏ qua. Dường như khi trẻ có chiều rộng cố định, phần đệm bên phải của bố mẹ không áp dụng. (Điều này có được chỉ định bởi một tiêu chuẩn không? Tôi rất muốn biết. Vui lòng cho tôi biết nếu bạn tìm thấy bất kỳ điều gì!)

Có cách nào để ép buộc phải áp dụng trong trường hợp này mà không cần của các yếu tố từ dòng chảy (bằng cách thả nổi hoặc định vị)?

enter image description here

Ảnh chụp màn hình 1 - Đệm phải được bỏ qua. Đây là cách tất cả các trình duyệt hiện hành xử lý.

Ảnh chụp màn hình 2 - Áp dụng đệm phù hợp. Đây là những gì tôi đang cố gắng hoàn thành. (Btw, ảnh chụp màn hình là từ IE7, đó là trình duyệt duy nhất mà không bỏ qua các đệm bên phải.)

Trả lời

18

Bạn đang bị this vấn đề.

tôi sẽ giải quyết nó bằng cách đưa ra một biên độ cho đứa trẻ (và không phải là một đệm để công ty mẹ):

#parent { 
    width: 200px; 
    height: 200px; 
    overflow-x: scroll; 
    background: gray; 
} 

#child { 
    width: 500px; 
    background: yellow; 
    display: inline-block; 
    margin: 20px; 
} 

Demo: jsFiddle

+5

Điều thú vị là nó cần 'inline-block' để làm việc, như' block' [không làm điều đó] (http: // jsfiddle. net/fwTAS/1 /), nhưng người ta sẽ nghĩ rằng nó sẽ. +1 cho liên kết hiển thị nghiên cứu. – ScottS

+1

@ScottS Vâng, đó là trình duyệt chết tiệt, tất cả đều có cách diễn giải riêng của họ về đặc tả CSS, nhiều như họ cố gắng duy trì nó (ngoại trừ mớ hỗn độn không chuẩn là IE). 'block' và bạn bè' inline-block' của nó nên chia sẻ tất cả các tính năng kiểu hộp của chúng và phân biệt theo cách của khối nội tuyến không cản trở luồng trang và trộn lẫn với các công cụ nội tuyến. Tôi chắc chắn muốn tìm hiểu thêm về hành vi cụ thể này. –

+1

@Jota 'hiển thị: inline-block' rủi ro có hai trẻ em với nội dung nhỏ xuất hiện side-by-side: http://jsfiddle.net/523me/20/ +1 từ tôi cũng cho liên kết. –

1

Dunno nhưng nói thêm:

#child{ 
    display: inline-block; 
} 

vẻ để sửa chữa nó: http://jsfiddle.net/523me/6/

tôi chỉ được thử nghiệm trong Chrome mới nhất, có thể không phải là trình duyệt chéo

+0

đó làm việc trong Chrome và IE, nhưng không phải trong Firefox ' : (' –

+0

Nếu tôi không nhầm, inline-block được sử dụng để đặt các phần tử khối trực tiếp/nội tuyến với văn bản (hoặc các phần tử nội tuyến), xen vào nó. Vì vậy, khối cha có thể giải quyết nó như nó sẽ * văn bản thông thường *, Và tương đối so với nó, bố mẹ đệm đi 20px rõ ràng xung quanh nó Nhưng đây là một hack, đó là lý do tại sao nó không hoạt động trong Firefox. l trường hợp bố trí như vậy là thích hợp hơn. –

0

Bạn có thể thay đổi phần đệm thành đường viền.

padding: 20px; 

để

border: 20px solid gray; 
+3

Đường viền bao bọc thanh cuộn trông không đẹp: http://jsfiddle.net/523me/17/ –

+0

Tôi đồng ý, tôi không thấy ảnh chụp màn hình của bạn cho đến sau khi tôi nói ... –

2

Không, đệm không được bỏ qua, nhưng nó vẫn còn bên cha mẹ.

Xem updated jsFiddle, nơi bạn có thể thấy rằng phần đệm không di chuyển từ vị trí ban đầu của nó.

Chỉnh sửa: Hm, có một số bất thường. Nếu bạn cho div bên trong một lề phải, điều đó cũng bị bỏ qua. Hm. Upvoting câu hỏi của bạn.

+0

Tôi hiểu bạn nghĩa là. Vâng, nó là những gì nó được, nhưng tôi không thích nó. Tôi sẽ hạnh phúc hơn nếu phần đệm của bố mẹ được quấn quanh đứa con rộng nhất, thay vì chỉ áp dụng cho những đứa trẻ không có chiều rộng cố định. –

0

Áp dụng padding-right để tự tràn phần tử và di chuyển nền tới phần tử con trực tiếp của nó.

<div id="parent"> 
    <div id="child"><div>Lorem ipsum...</div></div> 
</div> 

<style> 
#parent {padding-right: 0; } 
#child {padding-right: 20px; } 
#child > DIV {background: yellow; } 
</style> 

http://jsfiddle.net/523me/9/

+0

Tôi muốn tránh phải quấn mỗi đứa trẻ trong một DIV ... –

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