Как сделать так, чтобы оверлей не перекрывал определенный элемент на странице?

У меня есть вопрос о работе с контекстом наложения в CSS. Предположим, у меня есть div с z-index = 0, который создает свой <a href="https://developer.mozilla.org/ru/docs/Web/CSS/CSS_positioned_layout/Understanding_z-index/Stacking_context" rel="nofollow">контекст наложения</a>. Внутри этого div находится кнопка. Над этим div расположен полупрозрачный оверлей (div с position: fixed и z-index: 10), который полностью перекрывает содержимое. 

Как можно сделать так, чтобы оверлей не перекрывал кнопку? Я понимаю, что установка большого z-index для кнопки не работает из-за вышеупомянутого контекста наложения. 

Я привожу <a href="https://codesandbox.io/p/sandbox/r99pgv?file=%2Findex.html%3A19%2C22" rel="nofollow">ссылку</a> на песочницу, где можно посмотреть и поэкспериментировать с этим кодом. 

Существуют ли какие-либо <b>значимые</b> решения для этой проблемы, <b>используя только CSS</b>? На данный момент мой "план Б" заключается в создании клона кнопки и размещении его поверх оверлея, при этом нужно следить за движением кнопки, чтобы обновлять позицию клона.
  • 12 февраля 2025 г. 10:54
Ответы на вопрос 2
Чтобы оверлей не перекрывал определенный элемент (в данном случае кнопку) на странице, нужно будет немного изменить структуру вашего HTML и CSS, чтобы избежать контекста наложения, который создается элементом с `z-index`.

Вот одно из решений, которое можно использовать, чтобы кнопка оставалась доступной, при этом не создав дополнительный клон кнопки:

1. Измените структуру HTML так, чтобы оверлей не находился внутри контекста наложения, создаваемого `div` с `z-index: 0`. Например, переместите оверлей на уровень выше в DOM, если это возможно.

2. Если перемещение оверлея невозможно, вы можете изменить подход к наложению, используя более высокие значения `z-index` для оверлея и кнопки. Но учтите, что это может не всегда помочь.

Вот пример, как это можно сделать:

```html
<div class="container">
  <button class="button">Кнопка</button>
  <div class="overlay"></div>
</div>
```

```css
.container {
  position: relative;
  z-index: 0;
}

.button {
  position: relative;
  z-index: 1; /* Задаем z-index выше, чтобы кнопка была выше оверлея */
}

.overlay {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.5);
  z-index: 10; /* Задаем z-index выше, чтобы оверлей был сверху */
  pointer-events: none; /* Оверлей не будет перехватывать события, благодаря этому кнопка будет кликабельна */
}
```

Обратите внимание на следующее:
- `pointer-events: none;` на оверлее позволяет не блокировать взаимодействие с кнопкой. Это значит, что клики будут проходить через оверлей и будут направлены на элемент под ним (в данном случае на кнопку).
- Убедитесь, что оверлей добавлен в нужное место в иерархии DOM, чтобы он мог корректно накладываться на контент, но не блокировать доступ к интерактивным элементам.

Если вы не можете изменить структуру HTML и оверлей обязательно должен оставаться в рамках контекста наложения, скорее всего, вам придется использовать JavaScript для создания логики отключения событий на оверлее, что может немного усложнить решение.
Без костылей вряд ли получится. 
Но можно закостылить на css, без javascript

overlay - z-index: 1;
div - z-index: 2;

то есть оверлей будет под блоком

внутри дива свой отдельный оверлей и у кнопки z-index большего этого внутреннего оверлея.
Похожие вопросы