เหตุใด z-index จึงไม่ทำงาน


182

ดังนั้นถ้าฉันเข้าใจz-indexอย่างถูกต้องมันจะสมบูรณ์แบบในสถานการณ์นี้:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันต้องการที่จะวางภาพด้านล่าง (แท็ก / บัตร) ด้านล่าง div ข้างต้นนั้น ดังนั้นคุณจะไม่เห็นขอบคม ฉันจะทำสิ่งนี้ได้อย่างไร

z-index:-1 // on the image tag/card

หรือ

z-index:100 // on the div above

ไม่ทำงานเช่นกัน ไม่มีการรวมกันของสิ่งใดเช่นนี้ มาทำไม

คำตอบ:


435

z-indexคุณสมบัติทำงานเฉพาะในองค์ประกอบที่มีpositionค่าอื่นที่ไม่ใช่static(เช่นposition: absolute;, position: relative;หรือposition: fixed)

นอกจากนี้ยังposition: sticky;มีการสนับสนุนใน Firefox นำหน้าด้วย Safari ทำงานใน Chrome เวอร์ชันเก่าภายใต้การตั้งค่าสถานะที่กำหนดเองและ Microsoft อยู่ระหว่างการพิจารณาเพื่อเพิ่มเบราว์เซอร์ Edge ของตน

สิ่งสำคัญ
สำหรับการวางตำแหน่งปกติอย่าลืมใส่position: relativeองค์ประกอบที่คุณตั้งไว้z-indexด้วย มิฉะนั้นจะไม่มีผล



3
การเพิ่มคำตอบนี้โครเมี่ยมและเบราว์เซอร์อื่น ๆ ที่น่าจะเป็นของการเขียนนี้จำเป็นต้องให้คุณอย่างชัดเจนรัฐposition: relativeสำหรับดัชนี z ในการทำงานแม้จะมีองค์ประกอบของพฤติกรรมในรูปแบบอื่น ๆ ที่เกี่ยวข้องโดยค่าเริ่มต้น
benipsen

staticองค์ประกอบคงที่และไม่สามารถเคลื่อนที่ไปx, y or z planesมาได้ พวกเขาไม่สามารถย้ายเข้าอยู่x plane (left or right)หรือเช่นเมื่อเราทำงานร่วมกับy plane (top or bottom) และมิได้พวกเขาสามารถย้ายในposition: absolute z plane i.e. with z-index
Akash

คุณรู้ปัญหาเกี่ยวกับการใช้งานz-indexในองค์ประกอบกริดหรือไม่?
oldboy

60

หากคุณตำแหน่งตั้งค่าอื่นที่ไม่ใช่staticแต่องค์ประกอบของคุณz-indexยังไม่ได้ดูเหมือนจะทำงานก็อาจเป็นได้ว่าบางองค์ประกอบหลักมีz-indexชุด

บริบทการสแต็กมีลำดับชั้นและแต่ละบริบทการสแต็กถูกพิจารณาในลำดับการสแต็กของบริบทสแต็กของพาเรนต์

ดังนั้นด้วย html ต่อไปนี้

div { border: 2px solid #000; width: 100px; height: 30px; margin: 10px; position: relative; background-color: #FFF; }
#el3 { background-color: #F0F; width: 100px; height: 60px; top: -50px; }
<div id="el1" style="z-index: 5"></div>
<div id="el2" style="z-index: 3">
  <div id="el3" style="z-index: 8"></div>
</div>

ไม่ว่าใหญ่z-indexของel3จะเป็นชุดก็มักจะอยู่ภายใต้el1เพราะผู้ปกครองมีบริบทซ้อนต่ำ คุณสามารถจินตนาการซ้อนเพื่อเป็นระดับที่ซ้อนคำสั่งของel3เป็นจริง3.8ซึ่งต่ำกว่า5

หากคุณต้องการตรวจสอบบริบทการซ้อนขององค์ประกอบหลักคุณสามารถใช้สิ่งนี้:

var el = document.getElementById("#yourElement"); // or use $0 in chrome;
do {
    var styles = window.getComputedStyle(el);
    console.log(styles.zIndex, el);
} while(el.parentElement && (el = el.parentElement));

มีบทความที่ดีเกี่ยวกับการซ้อนบริบทบน MDN


จะแก้ไขได้อย่างไร?
SM Pat

3
ตั้งค่าดัชนี z ที่เหมาะสมขององค์ประกอบหลัก
Buksy

รักสคริปต์นั้น
Matoeil

31

องค์ประกอบของคุณต้องมีpositionแอตทริบิวต์ (เช่นabsolute, relative, fixed) หรือz-indexจะไม่ทำงาน


26

ในหลายกรณีองค์ประกอบต้องถูกจัดตำแหน่งเพื่อz-indexให้ทำงานได้

แน่นอนการใช้position: relativeองค์ประกอบในคำถามน่าจะแก้ปัญหาได้ (แต่มีรหัสไม่เพียงพอที่จะรู้ได้อย่างแน่นอน)

อันที่จริงposition: fixed, position: absoluteและposition: stickyยังจะช่วยให้z-indexแต่ค่าเหล่านั้นยังเปลี่ยนรูปแบบ ด้วยposition: relativeรูปแบบจะไม่ถูกรบกวน

เป็นหลักตราบใดที่องค์ประกอบไม่ได้position: static(การตั้งค่าเริ่มต้น) จะถูกพิจารณาว่าอยู่ในตำแหน่งและใช้z-indexงานได้


คำตอบมากมายสำหรับ"ทำไม z-index จึงไม่ทำงาน" คำถามยืนยันว่าz-index ใช้งานได้กับองค์ประกอบที่มีตำแหน่งเท่านั้น ในฐานะของ CSS3 สิ่งนี้ไม่เป็นความจริงอีกต่อไป

องค์ประกอบที่เป็นรายการดิ้นหรือรายการตารางสามารถใช้z-indexแม้ในขณะที่เป็นpositionstatic

จากรายละเอียด:

4.3 Flex Item Z- การสั่งซื้อ

รายการ Flex สีเหมือนกับบล็อกแบบอินไลน์ยกเว้นการสั่งซื้อเอกสารที่สั่งการแก้ไขถูกนำมาใช้ในสถานที่ของการสั่งซื้อเอกสารดิบและz-indexค่าอื่น ๆ กว่าautoสร้างบริบทซ้อนแม้ว่ามีpositionstatic

5.4 การสั่งซื้อแกน Z: z-indexคุณสมบัติ

การสั่งซื้อภาพวาดของรายการตารางเป็นเหมือนกับบล็อกแบบอินไลน์ยกเว้นการสั่งซื้อเอกสารเพื่อแก้ไขที่ใช้ในสถานที่ของการสั่งซื้อเอกสารดิบและz-indexค่าอื่น ๆ กว่าautoสร้างบริบทซ้อนแม้ว่า มีpositionstatic

นี่คือตัวอย่างของz-indexการทำงานกับไอเท็มเฟล็กซ์ที่ไม่มีตำแหน่ง: https://jsfiddle.net/m0wddwxs/


3
"องค์ประกอบที่เป็นรายการที่ยืดหยุ่นหรือรายการกริดสามารถใช้ดัชนี z ได้แม้ว่าตำแหน่งจะเป็นแบบคงที่" ใช่แล้วข้อมูลจำเพาะบอกว่าจะปฏิบัติposition: staticเช่นเดียวกันกับที่ทำกับposition: relativeรายการเฟล็กซ์และกริดเนื่องจากธรรมชาติของวิธีการจัดวาง ดังนั้นฉันอาจจะบอกว่าไม่ใช่ว่ามันจะไม่เป็นความจริงอีกต่อไปใน CSS3 ที่องค์ประกอบจะต้องมีการวางตำแหน่ง แต่ CSS3 จะจัดการกับรายการ flex และกริดเหมือนว่าพวกเขาอยู่ในตำแหน่งโดยไม่คำนึงถึง เพียงแค่มองสองวิธีในสิ่งเดียวกัน
TylerH

@TylerH เราควรให้ความสนใจกับส่วนหนึ่งของสเป็คนั้นเพราะเราควรจะจัดการกับสถิตเหมือนกับญาติเฉพาะเมื่อจัดการกับดัชนี z และไม่ทั่วไป คุณไม่สามารถเช่นเปลี่ยนรายการดิ้นใช้ซ้าย / บน / ล่าง / ขวาจนกว่าคุณจะ explicitely position:relativespeficy ลูกหลานของไอเท็มเฟล็กซ์ที่มีตำแหน่งสัมบูรณ์จะไม่พิจารณาว่าไอเท็มเฟล็กต์เป็นบล็อกที่มีเนื่องจากไม่ได้วางตำแหน่งไอเท็ม ( jsfiddle.net/0yo7utfL/2 )
Temani Afif

ฉันพบข้อผิดพลาด "แปลก" กับ css ด้วยเหตุผลบางอย่างทำให้overflow-y: scrollไม่สามารถoverflow-x: visibleทำงานได้ ... คุณช่วยดูหน่อยได้ไหม
oldboy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.