Рустам Байназаров, увы, не оно. Я понимаю, что это далеко не самый очевидный способ и вариант на нескольких дивах я давно сделала, но вот хочется через псевдо это как-то слепить.
Ragtime_Kitty, т. е. вы хотите менять z-index, если у вас прозрачность меньше единицы? У вас на картинке :after то под блоком, то над ним.
Вам не к CSS тогда, если хотите автоматики, ибо в нём нет условной логики как таковой.
Так что только вручную ставить нужный z-index псевдоэлементу. Или писать скрипт, который будет искать в нужных элементах свойство opacity, проверять, меньше ли оно единицы, а если меньше, выставить класс, который будет менять z-index псевдоэлементу.
Афтер всегда под дивом (картинка №1), на картинках просто крутится камера.
Но если диву задать прозрачность меньше единицы, то афтер окажется над дивом, несмотря на z-index: -1 (картинка №2);
Никак, потому что псевдоэлементы принадлежат блоку.
Обход такой. Если нужно дать какой-то фон, дать его для :after с z-index: 1.
Для :before – z-index по умолчанию (он будет под :after).
Таким образом имитируем что-то под фоном блока.
Для контента блока z-index: 2 (если там будет контент).,
Ну и не забываем играть с position, чтобы все это расставить по местам.