Как настроить элемент в контейнере для прокрутки как фиксированный элемент?

Я разделил одну веб-страницу на три раздела, используя теги разделов HTML. Я создал два div в первом разделе: родительский и дочерний. Я не создавал никаких разделов во втором или третьем разделе. Родительский элемент содержит скрытый прямоугольный элемент, вложенный в центр родительского контейнера, который сам находится в центре первой секции. Каждый из трех разделов отображается в полноэкранном режиме.

Когда пользователь прокручивает первый раздел, появляется прямоугольник. Как только пользователь прокручивает до середины второго раздела, прямоугольник масштабируется в 4 раза по сравнению с исходным размером (или увеличивается) и заполняет второй раздел.

Проблема в том, что я использовал CSS, «position: fixed», чтобы центрировать скрытый элемент прямоугольника в первом разделе, но я не могу заставить прямоугольник после его масштабирования во втором разделе прокручиваться вверх и вниз со вторым разделом, когда пользователь прокручивает до третьего раздела. Прямоугольник кажется привязанным к области просмотра, а не к контейнеру второй секции. Я хочу, чтобы он был привязан к контейнеру второго раздела, а не к области просмотра. Я попробовал «position: sticky» и «position: relative», чтобы связать прямоугольный элемент с его контейнером, чтобы он прокручивался вместе со вторым разделом, но по какой-то причине это останавливает функцию масштабирования моего прямоугольного элемента во втором разделе. Пожалуйста помоги!

myID = document.getElementById("myID");

var myScrollFunc = function() {
  var y = window.scrollY;
  if (y >= 1) {
    myID.className = "child show"
  } else {
    myID.className = "child hide"
  }
};

window.addEventListener("scroll", myScrollFunc);

myID = document.getElementById("myID");

var myScrollFunc = function() {
  var y = window.scrollY;
  if (y >= 729) {
    myID.className = "child scale"
  }
};

window.addEventListener("scroll", myScrollFunc);
* {
  padding: 0;
  margin: 0;
}

section {
  height: 100vh;
  overflow: hidden;
}

.one {
  background-color: greenyellow;
}

.two {
  background-color: orangered;
}

.three {
  background-color: aqua;
}

.parent {
  width: 100vw;
  height: 100vh;
  display: flex;
  justify-content: center;
  align-items: center;
}

.child {
  width: 274px;
  height: 154px;
  position: fixed;
  background: plum;
  z-index: 1;
  transition: all .5s;
}

.hide {
  opacity: 0;
}

.show {
  opacity: 1;
}

.scale {
  transform: scale(4);
}
<section class = "one">
  <div class = "parent">
    <div id = "myID" class = "child hide scale"></div>
  </div>
</section>
<section class = "two">
</section>
<section class = "three">
</section>

🤔 А знаете ли вы, что...
JavaScript поддерживает модульную структуру, что способствует организации кода на больших проектах.


65
1

Ответ:

Решено
  • Переместите родительский DIV за пределы первого раздела, чтобы он мог находиться над первыми двумя разделами.
  • Используйте position:sticky для дочернего DIV
  • Переключение классов CSS дочернего элемента на событие scroll

window.addEventListener('scroll', () => {
  const child = document.querySelector('.child');
  child.classList.toggle('visible', window.scrollY > 0);
  child.classList.toggle('expanded', window.scrollY > window.innerHeight * 0.7);
});
* {
  padding: 0;
  margin: 0;
}

section {
  height: 100vh;
  overflow: hidden;
}

.one {
  background-color: greenyellow;
}

.two {
  background-color: orangered;
}

.three {
  background-color: aqua;
}

.parent {
  position: absolute;
  height: 200vh;
  width: 100%;
}

.child.expanded {
  top: 100vh;
  transform: scale(1);
}

.child .content{
  position: absolute;
  inset: 30px;
  background: plum;
}

.child {
  transform: scale(.25);
  top: 0;
  opacity: 0;
  height: 100vh;
  position: sticky;
  transition: transform .5s, opacity .5s;
}
.child.visible {
  opacity: 1;
}
<div class = "parent">
  <div class = "child">
    <div id = "myID" class = "content"></div>
  </div>
</div>
<section class = "one">
</section>
<section class = "two">
</section>
<section class = "three">
</section>