Я разрабатываю веб-интерфейс, который включает в себя много прокрутки, используя липкое позиционирование, которое прекрасно работает, за исключением одной маленькой детали. Ниже приведен минималистский пример. Вы можете попробовать его на CodePen , чтобы увидеть, как работают стикеры при горизонтальной и вертикальной прокрутке.
<header>
<nav>
<ul id=menu class=flex><li><a href="#">Menu bar item</a></li></ul>
</nav>
<div class=flex>
<div id=button>Button</div>
<div id=bar>Bar wider than the window</div>
</div>
</header>
<main class=flex>
<div id=leftbar></div>
<div id=content></div>
</main>
* {line-height: 2em; background-position: center center}
body {margin: 0; padding: 0}
body, a {color: #fff}
ul,li {margin: 0; padding: 0; list-style-type: none}
.flex {display: flex}
.flex > * {flex: 0 0 auto}
header {display: block; position: sticky; top: 0; left: 0; z-index: 1;
width: min-content; min-width: 100%; background: #000066}
#menu {flex-wrap: wrap; position: sticky; left: 0; width: 100vw;
background: #006600}
#button {position: sticky; left: 0; width: 4em; background: #000066}
#bar {width: 150vw}
main {min-height: 100vh} /* Ensure scrollbar */
#leftbar {position: sticky; left: 0; width: 4em; background: #444444}
#content {width: 150vw}
/* Background grid to visualize scrolling parts */
#bar, #leftbar, #content {
background-image: url(data:image/gif;base64,R0lGODlhEAAQAIABAO7u7v///yH5BAEKAAEA
LAAAAAAQABAAAAIdhI9pwe0PnnRxzmphlniz7oGbmJGWeXmU2qAcyxQAOw==)}
Проблема в верхней строке меню, которая всегда должна оставаться на месте, как фиксированный заголовок, но должна быть липкой. Ширина 100vw работает идеально до прокрутки до упора вправо. В этот момент крайняя левая часть строки меню прокручивается вне поля зрения, вероятно, из-за того, что вертикальная полоса прокрутки не учитывается в 100 В *.
Об фиксированном позиционировании не может быть и речи, потому что высота строки меню будет меняться, так что потребуется куча очень уродливых JS, читающих offsetHeight
и перемещающих элементы ниже после каждого изменения DOM - гадость!
Конечно, есть способ исправить эту крошечную проблему в чистом CSS или с помощью изменения структуры документа?
Редактировать: Я вижу, что решения JS начинают добавляться, поэтому давайте положим конец этому с этими 3 линиями JS, которые легко решают проблему. Я бы просто предпочел решение CSS / HTML, чтобы избежать проблем с поддержкой кода в будущем.
var f=function() {document.getElementById('menu').style.width=document.body.clientWidth+'px';};
window.addEventListener('DOMContentLoaded',f);
window.addEventListener('resize',f);