Проблема заключается в использовании переполнения внутри .app-body
.Это немного сложно, но не должно быть никакого свойства overflow
, установленного для какого-либо элемента между элементом, у которого есть прокрутка и липкий элемент.
Вот базовый пример для иллюстрации.Прокрутка находится в области просмотра, и у нас есть оболочка с overflow:hidden
(или даже auto
), поэтому поведение прилипания не будет работать.
.container {
display:flex;
align-items:flex-start;
border:2px solid green;
}
.content {
flex:1;
height:200vh;
background:red;
margin:10px;
}
.sticky {
flex:1;
height:100px;
background:blue;
margin:10px;
position:sticky;
top:0;
}
.wrapper {
overflow:hidden;
border:2px solid red;
}
<div class="wrapper">
<div class="container">
<div class="sticky"></div>
<div class="content"></div>
</div>
</div>
Если мы удалим переполнение, оно будет работать как положено:
.container {
display:flex;
align-items:flex-start;
border:2px solid green;
}
.content {
flex:1;
height:200vh;
background:red;
margin:10px;
}
.sticky {
flex:1;
height:100px;
background:blue;
margin:10px;
position:sticky;
top:0;
}
.wrapper {
border:2px solid red;
}
<div class="wrapper">
<div class="container">
<div class="sticky"></div>
<div class="content"></div>
</div>
</div>
Если мы сохраняем overflow
в оболочке, но перемещаем прокрутку к элементу контейнера, он также будет работать, потому что нет элемента сПереполнение установлено между прокруткой и закрепленным элементом:
.container {
display:flex;
align-items:flex-start;
border:2px solid green;
max-height:200px;
overflow:auto;
}
.content {
flex:1;
height:200vh;
background:red;
margin:10px;
}
.sticky {
flex:1;
height:100px;
background:blue;
margin:10px;
position:sticky;
top:0;
}
.wrapper {
overflow:hidden;
border:2px solid red;
}
<div class="wrapper">
<div class="container">
<div class="sticky"></div>
<div class="content"></div>
</div>
</div>
Связанный: Что такое «скролл боксы»?