← Назад к вопросам

Как заставить элемент уйти на задний план?

1.2 Junior🔥 231 комментариев
#HTML и CSS

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое z-index и стеклование

В веб-разработке элементы отображаются в трёхмерном пространстве: на оси Z. По умолчанию элементы, которые идут позже в HTML-коде, находятся впереди. Свойство z-index позволяет контролировать порядок расположения элементов по глубине.

Z-index — основной метод

Свойство z-index определяет, какой элемент находится впереди, а какой сзади. Меньшее значение = дальше (задний план), большее значение = ближе (передний план).

.modal {
  position: relative; /* или absolute, fixed */
  z-index: 1000;
}

.background {
  position: relative;
  z-index: 1;
}

Отрицательные значения отправляют элемент ещё дальше назад.

Практические примеры

Модальное окно с фоном

<div class="overlay"></div>
<div class="modal">
  <h1>Форма входа</h1>
</div>
.overlay {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.5);
  z-index: 100; /* фон позади модали */
}

.modal {
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  background: white;
  padding: 2rem;
  border-radius: 8px;
  z-index: 101; /* модаль впереди фона */
}

Випадающее меню

function Dropdown() {
  const [isOpen, setIsOpen] = useState(false);

  return (
    <div className="dropdown">
      <button 
        onClick={() => setIsOpen(!isOpen)}
        className="dropdown-trigger"
      >
        Меню
      </button>
      {isOpen && (
        <div className="dropdown-menu">
          <a href="/profile">Профиль</a>
          <a href="/settings">Настройки</a>
          <a href="/logout">Выход</a>
        </div>
      )}
    </div>
  );
}
.dropdown {
  position: relative;
}

.dropdown-trigger {
  position: relative;
  z-index: 10;
}

.dropdown-menu {
  position: absolute;
  top: 100%;
  left: 0;
  background: white;
  border: 1px solid #ccc;
  border-radius: 4px;
  z-index: 9; /* позади кнопки, но впереди остального контента */
  box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}

Прилипающий header

.header {
  position: sticky;
  top: 0;
  z-index: 50;
  background: white;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}

.content {
  position: relative;
  z-index: 1;
}

Отправка элемента на задний план (отрицательное значение)

.watermark {
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%) rotate(-45deg);
  font-size: 4rem;
  color: rgba(0, 0, 0, 0.1);
  z-index: -1; /* Позади всех элементов */
  pointer-events: none;
}

Контекст стеклования (Stacking Context)

Важно понимать, что z-index работает внутри контекста стеклования. Элемент с z-index: 9999 внутри контейнера с z-index: 1 будет позади элемента с z-index: 2 в другом контейнере!

<div class="container-a">
  <div class="child-a">z-index: 9999</div>
</div>
<div class="container-b">
  <div class="child-b">z-index: 1</div>
</div>
.container-a {
  position: relative;
  z-index: 1; /* Контекст стеклования */
}

.container-b {
  position: relative;
  z-index: 2; /* Этот контейнер впереди, поэтому его дети впереди */
}

.child-a {
  position: relative;
  z-index: 9999; /* Не спасёт! */
}

.child-b {
  position: relative;
  z-index: 1;
}

Все способы отправить элемент на задний план

1. Отрицательный z-index

.background {
  position: relative;
  z-index: -1;
}

2. Порядок в HTML

<!-- Элемент, идущий раньше, находится сзади (по умолчанию) -->
<div class="background"></div>
<div class="foreground"></div>

3. CSS order в Flexbox

.container {
  display: flex;
}

.background {
  order: 1; /* Ранее в порядке отображения */
}

.foreground {
  order: 2; /* Позже в порядке отображения */
}

4. CSS grid-row и grid-column

.grid {
  display: grid;
  grid-template-rows: repeat(2, 1fr);
  grid-template-columns: repeat(2, 1fr);
}

.background {
  grid-row: 1 / 3;
  grid-column: 1 / 3;
  z-index: -1;
}

5. opacity и visibility

Похоже отправляет элемент на задний план, но он остаётся интерактивным:

.dim {
  opacity: 0.3; /* Прозрачнее = кажется дальше */
}

Лучшие практики

Используй стратегию с шагами z-index

const zIndex = {
  BACKGROUND: 0,
  DROPDOWN: 10,
  MODAL: 100,
  NOTIFICATION: 200,
  TOOLTIP: 300
};
.dropdown-menu { z-index: var(--z-dropdown); }
.modal { z-index: var(--z-modal); }

Избегай вложенных позиционированных элементов

// ❌ Плохо
function ModalWithDropdown() {
  return (
    <div style={{position: 'relative'}}>
      <Modal style={{position: 'relative', zIndex: 100}} />
    </div>
  );
}

// ✅ Хорошо - используй Portal
import { createPortal } from 'react-dom';

function Modal() {
  return createPortal(
    <div className="modal">...</div>,
    document.body
  );
}

Выводы

Задний план можно отправить несколькими способами: отрицательный z-index, порядок в HTML, CSS Flexbox order, grid, opacity. Но главное помнить про контекст стеклования: z-index работает только внутри одного контекста. Для сложных структур используй Portal в React, чтобы избежать проблем с z-index. Всегда планируй стратегию z-index с шагами (0, 10, 100, 200) для избежания конфликтов.