chỉ số z không hoạt động với định vị cố định


422

Tôi có một divđịnh vị mặc định (nghĩa là position:static) và một divvới một fixedvị trí.

Nếu tôi đặt chỉ mục z của các phần tử, có vẻ như không thể làm cho phần tử cố định đi sau phần tử tĩnh.

    #over {
      width: 600px;
      z-index: 10;
    }
    
    #under {
      position: fixed;
      top: 5px;
      width: 420px;
      left: 20px;
      border: 1px solid;
      height: 10%;
      background: #fff;
      z-index: 1;
    }
    <!DOCTYPE html>
    <html>
       <body>
          <div id="over">
             Hello Hello HelloHelloHelloHelloHello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello
          </div>  
          <div id="under">
          </div>
       </body>
    </html>

Hoặc trên jsfiddle tại đây: http://jsfiddle.net/mhFxf/

Tôi có thể giải quyết vấn đề này bằng cách sử dụng position:absolute phần tử tĩnh, nhưng ai đó có thể cho tôi biết tại sao điều này xảy ra không?

(Có vẻ là một câu hỏi tương tự như thế này, ( Cố định vị bẻ z-index ) nhưng nó doesnt có một câu trả lời thỏa đáng, vì thế tôi yêu cầu này ở đây với mã ví dụ của tôi)

Câu trả lời:


146

Câu hỏi này có thể được giải quyết bằng nhiều cách, nhưng thực sự, việc biết các quy tắc xếp chồng cho phép bạn tìm ra câu trả lời tốt nhất phù hợp với bạn.

Các giải pháp

Phần <html>tử là bối cảnh xếp chồng duy nhất của bạn, vì vậy chỉ cần tuân theo các quy tắc xếp chồng bên trong bối cảnh xếp chồng và bạn sẽ thấy các phần tử được xếp chồng lên nhau theo thứ tự này

  1. Phần tử gốc của bối cảnh xếp chồng ( <html>phần tử trong trường hợp này)
  2. Các phần tử được định vị (và con của chúng) với các giá trị chỉ số z âm (các giá trị cao hơn được xếp chồng lên trước các giá trị thấp hơn; các phần tử có cùng giá trị được xếp chồng lên nhau theo ngoại hình trong HTML)
  3. Các yếu tố không định vị (được sắp xếp theo sự xuất hiện trong HTML)
  4. Các phần tử được định vị (và con cái của chúng) có giá trị tự động chỉ mục z (được sắp xếp theo ngoại hình trong HTML)
  5. Các phần tử được định vị (và con của chúng) có giá trị chỉ số z dương (giá trị cao hơn được xếp chồng lên trước giá trị thấp hơn; các phần tử có cùng giá trị được xếp chồng lên nhau theo ngoại hình trong HTML)

Vì vậy bạn có thể

  1. đặt chỉ số z là -1, cho #underchỉ mục z có vị trí xuất hiện phía sau #overphần tử không định vị
  2. đặt vị trí của #overđể relativequy tắc 5 áp dụng cho nó

Vấn đề thực sự

Các nhà phát triển nên biết những điều sau đây trước khi cố gắng thay đổi thứ tự sắp xếp các yếu tố.

  1. Khi bối cảnh xếp chồng được hình thành
    • Theo mặc định, <html>phần tử là phần tử gốc và là bối cảnh xếp chồng đầu tiên
  2. Thứ tự sắp xếp trong bối cảnh xếp chồng

Thứ tự xếp chồng và quy tắc ngữ cảnh xếp chồng bên dưới là từ liên kết này

Khi bối cảnh xếp chồng được hình thành

  • Khi một phần tử là phần tử gốc của tài liệu ( <html>phần tử)
  • Khi một phần tử có giá trị vị trí khác với giá trị tĩnh và giá trị chỉ mục z khác với tự động
  • Khi một phần tử có giá trị độ mờ nhỏ hơn 1
  • Một số thuộc tính CSS mới hơn cũng tạo ra bối cảnh xếp chồng. Chúng bao gồm: biến đổi, bộ lọc, vùng css, phương tiện phân trang và có thể các phương tiện khác. https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Pocationing/Under Hiểu_z_index / The_stacking_context
  • Theo nguyên tắc chung, dường như nếu một thuộc tính CSS yêu cầu hiển thị trong bối cảnh ngoài màn hình, thì nó phải tạo bối cảnh xếp chồng mới.

Thứ tự xếp chồng trong bối cảnh xếp chồng

Thứ tự của các yếu tố:

  1. Phần tử gốc của bối cảnh xếp chồng ( <html>phần tử là bối cảnh xếp chồng duy nhất theo mặc định, nhưng bất kỳ phần tử nào cũng có thể là phần tử gốc cho bối cảnh xếp chồng, xem quy tắc ở trên)
    • Bạn không thể đặt phần tử con phía sau phần tử bối cảnh xếp chồng gốc
  2. Các phần tử được định vị (và con của chúng) với các giá trị chỉ số z âm (các giá trị cao hơn được xếp chồng lên trước các giá trị thấp hơn; các phần tử có cùng giá trị được xếp chồng lên nhau theo ngoại hình trong HTML)
  3. Các yếu tố không định vị (được sắp xếp theo sự xuất hiện trong HTML)
  4. Các phần tử được định vị (và con cái của chúng) có giá trị tự động chỉ mục z (được sắp xếp theo ngoại hình trong HTML)
  5. Các phần tử được định vị (và con của chúng) có giá trị chỉ số z dương (giá trị cao hơn được xếp chồng lên trước giá trị thấp hơn; các phần tử có cùng giá trị được xếp chồng lên nhau theo ngoại hình trong HTML)

3
Một số người cũng có thể thấy điều này hữu ích: Điều mà không ai nói với bạn về Z-Index
Mentalist

450

Thêm position: relative;vào #over

    #over {
      width: 600px;
      z-index: 10;
      position: relative;    
    }
    
    #under {
      position: fixed;
      top: 5px;
      width: 420px;
      left: 20px;
      border: 1px solid;
      height: 10%;
      background: #fff;
      z-index: 1;
    }
    <!DOCTYPE html>
    <html>
    <body>
    	<div id="over">
    		Hello Hello HelloHelloHelloHelloHello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello
    	</div>  
    
    	<div id="under"></div>
    </body>
    </html>

Vĩ cầm


14
Updates.html5rocks.com/2012/09/ trên là một tài liệu tham khảo tuyệt vời về cách vị trí cố định, tuyệt đối và tương đối với chỉ số z.
Đã làm

@marflar Niềm vui của tôi. Btw, hãy nhìn vào fiddle của bạn. cuối cùng có một thẻ phụ </body>và một thẻ phụ </html>.
Michel Ayres

2
Dưới đây là một fiddle thể hiện bối cảnh xếp chồng. Nó được giải thích ở đây .
kdbanman

Loại bỏ position: relativekhỏi phần tử thực sự đã khắc phục vấn đề của tôi.
Alex G

thankssssss <3
Karl Anthony Baluyot

32

chỉ mục z chỉ hoạt động trong một bối cảnh cụ thể relative, fixedhoặc absolutevị trí.

chỉ số z cho một div tương đối không liên quan gì đến z-indexdiv hoàn toàn hoặc cố định.

EDIT Đây là một câu trả lời không đầy đủ. Câu trả lời này cung cấp thông tin sai lệch. Vui lòng xem lại nhận xét và ví dụ của @ Dansingerman bên dưới.


3
Bạn có thể mở rộng về cách z-index hoạt động trong một bối cảnh cụ thể và / hoặc cung cấp một tài liệu tham khảo không?
DanSingerman

13
chỉ số z ảnh hưởng đến thứ tự của hai div ngay cả khi một là vị trí tương đối và cái kia là tuyệt đối.
Raffael

65
Câu trả lời này là sai. Dưới đây là một câu đố thể hiện bối cảnh xếp chồng như được giải thích ở đây . @Dansingerman.
kdbanman

1
Cảm ơn jsFiddle @kbdanman của bạn, nó đã giúp tôi hiểu bối cảnh xếp chồng với một hình ảnh.
dhruvpatel

8
@JoeMorano, z cao hơn gần với đỉnh hơn, bất kể vị trí tuyệt đối hay tương đối. Điều quan trọng là mức độ trong cây tài liệu. Div 4, 5, 6 là con của div 3, trong khi div 1 và 2 là anh em của div 3. Div 1 có z cao hơn div 3, vì vậy div 1 nằm trên div 3 và tất cả con của nó. Div 2 có z thấp hơn div 3, vì vậy div 3 và tất cả các con của nó đều nằm trên div 2
kdbanman

31

overdiv của bạn không có định vị, chỉ số z không biết vị trí và vị trí của nó (và liên quan đến cái gì?). Chỉ cần thay đổi vị trí trên div của bạn thành tương đối, do đó không có tác dụng phụ trên div đó và sau đó div dưới sẽ tuân theo ý muốn của bạn.

đây là ví dụ của bạn trên jsfiddle: Fiddle

chỉnh sửa : Tôi thấy ai đó đã đề cập câu trả lời này!


18

Cho #undermột tiêu cực z-index, ví dụ-1

Điều này xảy ra bởi vì thuộc z-indextính được bỏ qua position: static;, đó là giá trị mặc định; như vậy trong mã CSS bạn đã viết, z-index1cho cả hai yếu tố bất kể có bao cao, bạn đặt nó trong #over.

Bằng cách đưa ra #undermột giá trị âm, nó sẽ đứng sau bất kỳ z-index: 1;yếu tố nào , tức là #over.


Tôi cũng gặp vấn đề này - cài đặt div 'dưới' thành 0 làm việc cho tôi.
Mick Sear

5

Tôi đang xây dựng một menu hải quân. Tôi có overflow: hiddentrong css nav của tôi mà giấu tất cả mọi thứ. Tôi nghĩ rằng đó là một vấn đề chỉ số z, nhưng thực sự tôi đã che giấu mọi thứ bên ngoài điều hướng của tôi.



0

hành vi của các phần tử cố định (và các phần tử tuyệt đối) như được định nghĩa trong CSS Spec:

Chúng cư xử khi chúng được tách ra khỏi tài liệu và được đặt ở vị trí cố định / tuyệt đối gần nhất. (không phải là một từ từng trích dẫn)

Điều này làm cho phép tính zindex hơi phức tạp, tôi đã giải quyết vấn đề của mình (tình huống tương tự) bằng cách tự động tạo một thùng chứa trong phần tử cơ thể và di chuyển tất cả các phần tử như vậy (có dạng lớp là "cái tôi cố định" bên trong phần tử mức cơ thể đó )

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.