2013-09-05 46 views
6

Tôi có một hoặc nhiều thành phần vị trí cố định trên một trang hiển thị xếp chồng lên nhau (có nghĩa là, phần trên cùng của phần thứ hai là đặt phần cuối của phần đầu tiên - không có xếp hạng z-index của các phần tử đó). Bên trong phần tử vị trí cố định đầu tiên, có một phần tử được định vị hoàn toàn cao hơn so với phần tử cố định của nó, do đó nó mở rộng ra ngoài phần dưới cùng của bố mẹ cố định đó.Chỉ số Z không hoạt động như mong đợi với định vị tuyệt đối bên trong một phần tử vị trí cố định

Sự cố là phần tử vị trí cố định tiếp theo được hiển thị trên đầu phần tử được định vị hoàn toàn. Tôi đã có giá trị z-index cao hơn được đặt trên phần tử được định vị hoàn toàn hơn so với các phần tử cố định vị trí, nhưng nó bị bỏ qua hoàn toàn.

Để giúp làm sáng tỏ vấn đề, tôi đặt lại với nhau ví dụ này:

HTML

<div class="fixed first"> 
    <p>This is a fixed element</p> 
    <p class="abs"> 
     I should be displayed above both fixed position elements 
    </p> 
</div> 
<div class="fixed second"> 
    <p>This is a fixed element</p> 
</div> 

CSS

.fixed { 
    font-size: 16px; 
    background: #eee; 
    border-bottom: 1px solid #ccc; 
    position: fixed; 
    height: 3em; 
    width: 100%; 
    z-index: 1; 
} 

.abs { 
    position: absolute; 
    background: #acc; 
    height: 6em; 
    top: 0; 
    left: 25%; 
    width: 50%; 
    z-index: 2; 
} 

.second { 
    top: 3.0625em; 
} 

Dưới đây là ví dụ làm việc trên JSFiddle:

http://jsfiddle.net/GS4E4/8/

Tôi là loại bối rối bởi điều này. Có ai có một lời giải thích là tại sao điều này đang xảy ra, và một cách để làm việc xung quanh nó?

+2

[điều này có giải thích tốt về cách hoạt động của chỉ mục z] (http://coding.smashingmagazine.com/2009/09/15/the-z-index-css-property-a-comprehensive-look/) , vì bạn sẽ thấy tất cả các phần tử trên cùng cấp có chỉ mục z sẽ được ưu tiên hơn so với chỉ mục z-index của lớp con. Với điều này trong tâm trí của bạn fiddle trên là làm việc như mong đợi – Pete

+0

Tất nhiên! Tôi quên rằng mỗi phần tử định vị tạo ra bối cảnh xếp chồng của riêng nó. Bởi vì mỗi phần tử vị trí cố định trong ví dụ có cùng giá trị z-index, thứ tự nguồn đi vào hoạt động. Cảm ơn vì lời nhắc nhở, Pete. –

Trả lời

5

Như bình luận của Pete, tất cả đều đi vào bối cảnh xếp chồng. Trong trường hợp này, cả hai yếu tố .fixed đều tạo ra bối cảnh xếp chồng của riêng mình nhờ vào việc là position: fixed;. Con của phần tử .fixed đầu tiên tạo ngữ cảnh xếp chồng lồng nhau trong phần tử gốc. Bởi vì nó được lồng trong một bối cảnh xếp chồng hiện có, nó không bao giờ có thể thoát ra và ngăn xếp bất kỳ thứ gì cao hơn; chỉ số z của nó là tương đối so với chỉ mục của nó ngay bây giờ.

Thông số này thực sự có phần hữu ích với các chi tiết cụ thể: http://www.w3.org/TR/CSS2/visuren.html#z-index. Bạn có thể nhìn thấy thông qua danh sách được đánh số mà các bối cảnh xếp chồng con được sơn chết cuối cùng.

Vì vậy, trong trường hợp của bạn, yếu tố .fixed.first của bạn sẽ cần phải có chỉ mục z là 2 để con mình có thể xếp chồng trên đỉnh .fixed.second.

+0

Cảm ơn Adam! Tôi đã hoàn toàn quên về bối cảnh xếp chồng cá nhân của các yếu tố cha mẹ được định vị. Với ý nghĩ đó, tôi đã cập nhật fiddle với một bản sửa lỗi phản ánh điều này: http://jsfiddle.net/GS4E4/13/ –

1

Di chuyển .abs bên ngoài cả hai div.

<div class="fixed first"> 
    <p>This is a fixed element</p> 
</div> 
<div class="fixed second"> 
    <p>This is a fixed element</p> 
</div> 
<p class="abs"> 
     I should be displayed above both fixed position elements 
    </p> 

Xem http://jsfiddle.net/GS4E4/9/ Cách bạn có nó bây giờ .abs là vị trí tương đối so với .first vì vậy nó sẽ ngồi trên .first nhưng không phải trên .second, fiddle của bạn được giải thích một cách chính xác.

+0

Cảm ơn Irwin. Tôi nhận ra đó là một lựa chọn, và trong ví dụ đơn giản này, đó là một điều dễ dàng để làm.Trong bối cảnh của ứng dụng mà tôi đang làm việc về nơi vấn đề này được hiển thị, tuy nhiên, đó là một lựa chọn khó khăn hơn, vì cách bố trí phức tạp hơn rất nhiều. Tôi sẽ xem xét điều này nếu không có bất kỳ giải pháp hợp lý nào khác. –