Отслеживание положения элемента со значением absolute

Есть вот такой элементарный пример функциональной задачи. Два блока, потомок имеет абсолютное позиционирование относительно родителя и размеры большие чем у него. Вылазит за края.

body {
  margin: 0;
  height: 100vh;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
}

.block {
  position: relative;
  width: 300px;
  height: 300px;
  border: 1px solid #000;
}

.absolute {
  position: absolute;
  left: -20px;
  top: -20px;
  width: calc(100% + 40px);
  height: calc(100% + 40px);
  z-index: -1;
  background-color: pink;
}
<div class="block">
  <div class="absolute"></div>
</div>

Вопрос - Как отслеживать что б потомок никогда не вылазил из области видимости экрана? ограничитель

Как написать обработчик (а возможно и кто-то знает решение на CSS) которое б гарантировало, что при ресайзе окна браузера потомок (розовый блок) не уходил бы за область видимости. То есть как только область видимости приближается к блоку с 'position:absolute;' смещаться начинал его родитель и только когда область просмотра становилась бы меньше width: calc(100% + 40px); отображение б ломалось.

Ещё один пример для наглядности

body {
  margin: 0;
  height: 100vh;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
}

.block {
  position: relative;
  width: 300px;
  height: 300px;
  border: 1px solid #000;
}

.absolute {
  position: absolute;
  left: -20px;
  top: -20px;
  width: calc(100% + 40px);
  height: calc(100% + 40px);
  z-index: -1;
  background-color: pink;
}
<div class="block">
  <img class="absolute" src="https://placehold.co/340x340?text=Hello+World" alt="image">
</div>

При ресайзе области видимости браузер ориентируеться по родительскому элементу и масштабирует именно элемент .block меня же интересует как привязаться на дочерний элемент с position:absolute;


Ответы (2 шт):

Автор решения: Grundy

Компенсировать место можно с помощью margin у контейнера, со значением, которым внутренний элемент выходит за границы

body {
  margin: 0;
  height: 100vh;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
}

.block {
  position: relative;
  width: 300px;
  height: 300px;
  border: 1px solid #000;
  
  margin: 20px;
}

.absolute {
  position: absolute;
  left: -20px;
  top: -20px;
  width: calc(100% + 40px);
  height: calc(100% + 40px);
  z-index: -1;
  background-color: pink;
}
<div class="block">
  <img class="absolute" src="https://placehold.co/340x340?text=Hello+World" alt="image">
</div>

→ Ссылка
Автор решения: Andrei Fedorov

Я все еще не уверен, что правильно понял задачу. Ориентируюсь на картинку, добавленную автором. Мой способ предполагает, что мы знаем позицию блока на уровне CSS.

@property --block-left {
  syntax: "<length>";
  initial-value: 0px;
  inherits: true;
}

@property --block-top {
  syntax: "<length>";
  initial-value: 0px;
  inherits: true;
}

@property --toggler {
  syntax: "<integer>";
  initial-value: 0;
  inherits: true;
}

body {
  margin: 0;
  position: relative;
  --block-left: 0px;
  --block-top: 0px;
}

.block {
  position: relative;
  margin-left: var(--block-left);
  margin-top: var(--block-top);
  width: 100px;
  height: 100px;
  border: 1px solid #000;
  box-sizing: border-box;
  animation: anim 3s ease-in-out alternate infinite;
}

.absolute {
  position: absolute;
/*
    left: max(-20px, calc(-1 * var(--block-left)));
    top: max(-20px, calc(-1 * var(--block-top)));

    left: min(calc((100vw - 340px) - var(--block-left)), -20px);
    top: min(calc((100dvh - 340px) - var(--block-top)), -20px);
*/
  left: calc( (1 - var(--toggler)) * max(-20px, calc(-1 * var(--block-left))) + var(--toggler) * min(calc((100vw - 140px) - var(--block-left)), -20px));
  top: calc( (1 - var(--toggler)) * max(-20px, calc(-1 * var(--block-top))) + var(--toggler) * min(calc((100dvh - 140px) - var(--block-top)), -20px));
  width: calc(100% + 40px);
  height: calc(100% + 40px);
  z-index: -1;
}

@keyframes anim {
  from {
    --block-left: 0px;
    --block-top: 0px;
    --toggler: 0;
  }
  to {
    --block-left: calc(100vw - 100px);
    --block-top: calc(100dvh - 100px);
    --toggler: 1;
  }
}
<div class="block">
  <img class="absolute" src="https://placehold.co/140x140?text=Hello+World" alt="image">
</div>

→ Ссылка