В Модуль позиционированного макета CSS, уровень 3 (рабочий проект) в главе 6.2. Липкое позиционирование у нас есть это определение: (выделено мной)
A stickily positioned box is positioned similarly to a relatively positioned box, but the offset is computed with reference to the nearest ancestor with a scrolling box, or the viewport if no ancestor has a scrolling box.
Далее в документе есть проблема с термином scrolling boxes
Issue 6 Sticky positioning should really be defined in terms of the nearest scrollable ancestor, but there is currently no such term defined elsewhere in CSS. CSSOM View refers to "scrolling boxes." CSS Overflow has yet to pull in the relevant text from CSS Box, and CSS Box has an old, confusing definition of "flow root" which is almost (but probably not quite) what we want here. This spec refers to "flow root," since that’s the closest thing currently specced somewhere, but this is not optimal.
Кто-нибудь знает, где я могу найти дополнительную информацию (это черновик от мая 2016 года)? Я особенно хочу включить или выключить, является ли поле прокруткой или нет.
Как сказал @alex, поле прокрутки — это поле, в котором для значения переполнения установлено значение, отличное от visible
(значение по умолчанию). Я не могу подтвердить, но я пришел к этому выводу на основе этого предыдущий ответ, где переполнение создает некоторые проблемы с липким элементом.
Как я объяснил там, если у вас есть элемент с overflow:hidden
в качестве предка position:sticky
, этот элемент перестанет работать, потому что его смещение будет рассчитываться на основе этого поля (с overflow:hidden
), потому что это ближайший предок с прокруткой. Поскольку мы использовали hidden
, мы не можем прокручивать это поле, поэтому мы не можем видеть липкое поведение.
Вот простой пример:
.wrapper {
height:200vh;
border:2px solid;
}
.wrapper >div {
position:sticky;
top:0;
height:20px;
background:red;
}
<div class = "wrapper">
<div></div>
</div>
В приведенном ниже примере область просмотра будет использоваться для ссылки, потому что у нас нет поля прокрутки. Теперь давайте добавим переполнение в оболочку:
.wrapper {
height:200vh;
border:2px solid;
overflow:scroll;
}
.wrapper >div {
position:sticky;
top:0;
height:20px;
background:red;
}
<div class = "wrapper">
<div></div>
</div>
Теперь наш липкий элемент будет рассматривать оболочку для ссылки, но, поскольку у нас нет переполнения, у нас не будет прокрутки, поэтому нет никакого способа вызвать липкое поведение. Также прокрутка области просмотра ничего не даст.
Если вы добавите переполнение, добавив еще один элемент внутри, мы можем вызвать липкое поведение:
.wrapper {
height:200vh;
border:2px solid;
overflow:scroll;
position:relative;
}
.wrapper >div {
position:sticky;
top:0;
height:20px;
background:red;
}
.wrapper > span {
position:absolute;
top:100%;
height:50px;
left:0;
right:0;
background:blue;
}
<div class = "wrapper">
<div></div>
<span></span>
</div>
Мы можем ясно видеть, как прокрутка обертки управляет липким элементом, а прокрутка области просмотра ничего не делает, поэтому мы можем сделать вывод, что наша обертка — это ближайший предок с прокруткой.
Учитывая последнюю проблему в спецификации, мы также можем прочитать, что:
Sticky positioning should really be defined in terms of the nearest scrollable ancestor, but there is currently no such term defined elsewhere in CSS. CSSOM View refers to "scrolling boxes."
Так что, вероятно, прокручиваемый предок совпадает с предок с прокруткой.
Я немного повозился с overflow
родительского элемента sticky
элемента и родительского элемента этого родителя. Вы можете видеть здесь: codepen.io/HerrSerker/pen/MRJamY, что только visible
и другие значения (unset
, initial
), которые эффективно приводят к visible
переполнению, приводят к предполагаемому поведению. Только если у прародителя есть overflow:scroll
или auto
а также, height
ограничено, мы получаем липкое поведение против поля прокрутки прародителя.
Поле прокрутки, я бы предположил, что-то с
overflow: auto
(или связанным) и имеет содержимое, выходящее за его границы, поэтому вызывает полосы прокрутки.