Неожиданная проблема с прокруткой в ​​браузере при изменении высоты ребенка - PullRequest
0 голосов
/ 06 февраля 2020

demo

С футляром-оберткой

Смотри изображение выше, у меня есть контейнер с оберткой, обертывающий 6 предметов, зеленого цвета и высотой 500 пикселей. Сначала я позволил контейнеру прокрутиться до 1000, это третий элемент прокрутки к вершине области просмотра.

Затем я нажимаю кнопку small, каждый щелчок уменьшает высоту элемента. Он начинается с первого, затем со второго.

В результате при первом нажатии small третий элемент 3 все еще остается наверху. Я регистрирую scrollTop из container , это 600;

Но при втором щелчке small третий элемент 3 переместится вверх, и 4-й элемент отобразится в окне просмотра. scrollTop из container - это подоконник 600;

В этом случае контейнер можно прокручивать, оборачивая предметы. Код прилагается.

<!DOCTYPE html>
<html lang="en">
<head>

  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<style>
  .container {
    overflow: scroll;
    height: 200px;
  }
  .item {
    height: 500px;
    background: lime;
  }
  .small {
    height: 100px;
    background: lightblue;
  }
  .wrapper {
    border: 1px solid red;
    height: fit-content;
  }
</style>
<body>
  <div class="container">
    <div class="wrapper">
      <div class="item">1</div>
      <div class="item">2</div>
      <div class="item">3</div>
      <div class="item">4</div>
      <div class="item">5</div>
      <div class="item">6</div>
    </div>
  </div> 
  <button id="insert">insert</button>
  <button id="add">append</button>
  <button id="remove">remove</button>
  <button id="shift">shift</button>
  <button id="shrike">shrike</button>
  <button id="small">small</button>

  <script>
    let count = 100;
    document.getElementsByClassName('container')[0].scrollTop = 1000
    document.getElementById('add').addEventListener('click',function() {
     const node =  document.createElement('div')
     node.className = 'item'
     node.innerText = count++;
     document.getElementsByClassName('wrapper')[0].appendChild(node)
    showScroll();
    })
    document.getElementById('insert').addEventListener('click',function() {
     const node =  document.createElement('div')
     node.className = 'item'
     node.innerText = count++;
      const firstEle = document.getElementsByClassName('item')[0];
     firstEle.parentNode.insertBefore(node, firstEle)
    showScroll();
    })
    document.getElementById('remove').addEventListener('click',function() {
     const node =  document.createElement('div')
     node.className = 'item'
     node.innerText = count++;
      const items = document.getElementsByClassName('item');
     document.getElementsByClassName('wrapper')[0].removeChild(items[items.length-1]);
    showScroll();
    })
    document.getElementById('shift').addEventListener('click',function() {
     const node =  document.createElement('div')
     node.className = 'item'
     node.innerText = count++;
     document.getElementsByClassName('wrapper')[0].removeChild(document.getElementsByClassName('item')[0]);
    showScroll();
    })
    document.getElementById('shrike').addEventListener('click',function() {
     const items = document.getElementsByClassName('item');
     Array.from(items).forEach(item => {
       item.classList.add('small')
     })
    showScroll();
    })

    document.getElementById('small').addEventListener('click',function() {
     const items = document.getElementsByClassName('item');
      items[0].classList = 'small'
    showScroll();
    })

    function showScroll() {
      console.log(document.getElementsByClassName('container')[0].scrollTop)
    }
  </script>

</body>
</html>

Без чехла

Затем я попытался удалить упаковку:

 <div class="container">
    <div class="wrapper">
      <div class="item">1</div>
      <div class="item">2</div>
      <div class="item">3</div>
      <div class="item">4</div>
      <div class="item">5</div>
      <div class="item">6</div>
    </div>
  </div> 

изменить на

 <div class="container">
      <div class="item">1</div>
      <div class="item">2</div>
      <div class="item">3</div>
      <div class="item">4</div>
      <div class="item">5</div>
      <div class="item">6</div>
  </div> 

И на этот раз результат таков: первый щелчок small, третий элемент 3 удерживается сверху. Я записываю scrollTop из container, это 600;

Но второй щелчок small третий пункт 3 все еще держится наверху. scrollTop из container - это 200;

Меня беспокоит вопрос: в чем разница? Любые подсказки будут оценены. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...