درک مفهوم زنده‌وگشت یا z-index در CSS

understanding z index css
20 آبان 1403

سلام دوستان! امروز می‌خواهیم درباره یک مفهوم جالب و پراستفاده در دنیای CSS حرف بزنیم: z-index. حتماً براتون پیش اومده که بخواهید چند لایه مختلف از محتوا روی هم قرار بگیرن و سوالتون این بوده که چطوری می‌تونم این ترتیب لایه‌بندی رو تغییر بدم؟ خب، اینجاست که z-index به کارمون میاد.

چیزی که باید بدونید اینه که z-index در واقع یه عددیه که به عنصرهای HTML نسبت داده می‌شه و مشخص می‌کنه که هر عنصر نسبت به دیگران در چه لایه‌ای قرار داره. یعنی هرچی مقدار z-index یک عنصر بالاتر باشه، اون عنصر روی دیگر عناصر قرار می‌گیره.

اما یادتون باشه که z-index فقط روی عناصر position شده کاربرد داره. یعنی عناصری که position شون به صورت relative، absolute یا fixed تعریف شده. برای اینکه بتونیم از z-index استفاده کنیم، باید حتماً مقدار position رو برای عنصر تعریف کرده باشیم.

یه نکته کوچک اما مهم دیگه اینه که مکان و نحوه تعریف z-index باید با دقت انجام بشه. اگر بخواهیم دو عنصری که در یک سطح نیستن (مثلاً یکی درون یک والد و دیگری در یک والد دیگه) رو با z-index مرتب کنیم، ممکنه به نتایج غیرمنتظره برخورد کنیم.

مثال کد z-index


<!-- HTML Structure -->
<div class="container">
  <div class="box1">Box 1</div>
  <div class="box2">Box 2</div>
</div>

<!-- CSS Code -->
.container {
  position: relative;
  width: 200px;
  height: 200px;
}
.box1, .box2 {
  position: absolute;
  width: 100px;
  height: 100px;
}
.box1 {
  background-color: red;
  z-index: 1;
  top: 0;
  left: 0;
}
.box2 {
  background-color: blue;
  z-index: 2;
  top: 50px;
  left: 50px;
}

توضیح خط به خط کد

<div class="container">
این عنصر بعنوان والد برای دو عنصر بعدی عمل می‌کنه و یک context ایجاد می‌کنه.
<div class="box1">Box 1</div>
این یک عنصر با کلاس box1 و رنگ پس‌زمینه قرمزه.
<div class="box2">Box 2</div>
عنصر با کلاس box2 و رنگ پس‌زمینه آبیه که بالاتر از box1 قرار می‌گیره.
.container { position: relative; }
موقعیت دهی والد رو به relative تنظیم می‌کنه که اجازه می‌ده بچه‌های داخلش از z-index استفاده کنن.
.box1, .box2 { position: absolute; }
هر دو عنصر کودک رو position می‌کنه که از z-index سود ببرن.
.box1 { z-index: 1; }
z-index رو برای box1 به 1 تنظیم می‌کنه که پایینتر از box2 قرار بگیره.
.box2 { z-index: 2; }
z-index رو برای box2 به 2 تنظیم می‌کنه که بالاتر از box1 باشه.

سوالات متداول

؟

چرا z-index گاهی کار نمی‌کند؟

؟

چگونه می‌توانم از تهی کردن stacking context جلوگیری کنم؟