У меня есть простой заголовок во всю ширину вверху моей страницы с нефиксированным фоновым изображением (то есть background-attachment: scroll) и небольшим количеством текста заголовка поверх него. Все выглядит нормально, но когда пользователь «прокручивает» вверх, «переполнение» становится белым. Чтобы решить эту проблему, я хочу исправить положение фона, когда пользователь это делает, чтобы контент перемещался вниз, но фон оставался.
index.html<div class = "masthead">
</div class = "container">
<h1>Hello, World</h1>
<p>Lorem ipsum dolor</p>
</div>
</div>
main.scss/*...*/
.masthead {
display: block;
text-align: center;
color: white;
background-image: url('http://via.placeholder.com/1900x1250/ff6666/000000');
background-repeat: no-repeat;
background-attachment: scroll;
background-position: center center;
background-size: cover;
}
/*...*/
overscroll-behavior-y: none не подходитВо-первых, эта функция еще не поддерживается Safari / WebKit, но я также считаю, что это довольно агрессивно. Мне очень нравится ощущение чрезмерной прокрутки, и я хотел бы сохранить его, сохраняя при этом чистый пользовательский интерфейс.
Когда я попытался сделать это сам, я обнаружил, что добавление свойства background-attachment: fixed немного изменило положение изображения. Кроме того, даже если фон зафиксирован, шапка не выходит за пределы переполнения, и поэтому его фон остается белым.
SCSSjQuerybootstrap@Queder спасибо, только что обновился.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы пытаетесь исправить шапку, в то время как прокручивающееся тело создает эффект резинки. Мне пришлось протестировать это на iPhone 5C, потому что браузеры настольных компьютеров не прокручиваются, если вы не используете OSX, поэтому имейте в виду, что эти результаты ограничены более старой версией iOS (10.something). Вот мои выводы:
Вы можете добавить прослушиватель событий к событию прокрутки окна и исправить положение шапки, когда пользователь прокручивает сверху (т.е., когда свойство window.scrollY отрицательное):
body {
margin: 0;
padding: 0;
}
.masthead {
overflow: auto;
/* move this div to a gpu-processed layer */
-webkit-transform: translate3d(0, 0, 0); /* for iOS <8.1 */
transform: translate3d(0, 0, 0);
}
.fixed-top {
position: fixed;
top: 0;
width: 100%;
}
var masthead = document.querySelector(".masthead");
var mastheadHeight = masthead.clientHeight;
var topContentMargin = 16;
mastheadHeight += topContentMargin;
window.addEventListener("scroll", function(e) {
fixMastheadOnOverscroll();
});
function fixMastheadOnOverscroll() {
let overscrollingTop = window.scrollY < 0;
if (overscrollingTop) {
masthead.classList.add("fixed-top");
document.body.style.marginTop = mastheadHeight + "px";
} else {
masthead.classList.remove("fixed-top");
document.body.style.marginTop = "0px";
}
}
Как вы можете догадаться, этот код просто фиксирует верхний заголовок вверху, когда пользователь выполняет прокрутку сверху вниз. Несколько придирчивых мелочей точки:
overflow: auto на шапке - исправляет обрушение полей при отсутствии прокрутки;transform - это известный прием для продвижения элемента на его собственный уровень и его рендеринга с помощью графического процессора. Ускоряет ли это позиционирование шапки при прокрутке? Понятия не имею, это просто предложение, над которым нужно работать.Насколько мне известно, запуск функции изменения DOM при прокрутке стоит дорого. От собственной команды разработчиков Twitter:
It’s a very, very, bad idea to attach handlers to the window scroll event.
Слушатель событий почти постоянно запускает функцию. Также могло быть какое-то странное поведение на iOS из-за того, что инженеры Apple запускают обратный вызов только в конце события прокрутки (я думаю).
¯ \ (ツ) / ¯
Честно говоря, я понятия не имею, как это сделать без использования overscroll-behaviour-y. Вы можете использовать уродливый взлом, описанный выше, на iOS, только обнаружив браузер. Есть несколько улучшений производительности, которые вы можете сделать:
margin-top в другом классе CSS и используйте это имя класса в теле вместо непосредственного изменения стиля тела, но это дает вам меньше гибкости.
Спасибо за хорошо сформулированный вопрос. Не могли бы вы добавить немного кода, чтобы мы могли видеть структуру вашего документа и SCSS?