У меня есть страница, на которой используется следующее:
- Headroom.js для заголовка, который «скользит вне поля зрения при прокрутке вниз и снова скользит при прокрутке вверх»
- HTML
<a>
ссылки на внутренние разделы - Плавная прокрутка
Я хочу убедиться, что при прокрутке страницы до определенного якоря (будь то при нажатии на ссылку нана странице, например, #bottom
, либо вручную добавив фрагмент хеша в URL, либо после перенаправления), заголовок не мешает привязке.
Вы можете воспроизвести проблемное поведение Iя говорю во фрагменте ниже.Нажмите на якорь, чтобы перейти к нижней части страницы, а затем нажмите на ссылку, чтобы вернуться наверх.
Обратите внимание, что заголовок закрывает содержимое, к которому прокрутился браузер.
Как я могу надежным образом обеспечить, чтобы любые прокрутки, связанные с переходом к элементу привязки, были смещены на высоту заголовка (если он виден), чтобы содержимое отображалось в нужном месте?
Один из подходов, с которыми я экспериментировал, заключается в откреплении заголовка, как только обнаружен хэш-обмен, например:
$(window).on('hashchange',function(){
setTimeout(() => {
headroom.unpin();
}, 0);
});
Но для плавной прокрутки событие hashchange срабатывает до прокрутка закончилась.следовательно, заголовок просто сразу переписывается.Я также не вижу способа определить, когда плавная прокрутка закончилась.
Добавление прослушивателя щелчков на элементах <a>
является не надежным, поскольку оно не работает для пользователейпопадание на страницу с хеш-фрагментом уже в URL.Он также не работает при изменении JavaScript на window.location.hash
.Аналогично, прослушивание события hashchange также ненадежно, поскольку оно не срабатывает, если пользователь щелкает привязку, прокручивает и затем снова нажимает эту привязку.
document.addEventListener("DOMContentLoaded", function(e) {
var headroom = new Headroom(document.querySelector(".header"), {
"offset": 205,
"tolerance": 5,
"classes": {
"initial": "animated",
"pinned": "slideDown",
"unpinned": "slideUp"
}
});
headroom.init();
});
html {
scroll-behavior: smooth;
}
.header {
position: fixed;
z-index: 10;
right: 0;
left: 0;
top: 0;
background-color: #292f36;
color: white;
text-align: center;
padding: 2rem 0;
}
p:nth-of-type(1) {
margin-top: 7rem;
}
body {
font-family: sans-serif;
}
.header {
animation-duration: 0.5s;
animation-fill-mode: both;
will-change: transform, opacity;
}
@keyframes slideDown {
0% {
transform: translateY(-100%)
}
100% {
transform: translateY(0)
}
}
.slideDown {
animation-name: slideDown;
}
@keyframes slideUp {
0% {
transform: translateY(0);
}
100% {
transform: translateY(-100%);
}
}
.slideUp {
animation-name: slideUp;
}
<script src="https://npmcdn.com/headroom.js/dist/headroom.min.js"></script>
<div class="header">Here is my header</div>
<p id="top">Here is some text. Click to <a href="#bottom">jump</a> to the bottom of the page.</p>
<ul>
<li>Morbi in sem quis dui placerat ornare. Pellentesque odio nisi, euismod in, pharetra a, ultricies in, diam. Sed arcu. Cras consequat.</li>
<li>Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus.</li>
<li>Phasellus ultrices nulla quis nibh. Quisque a lectus. Donec consectetuer ligula vulputate sem tristique cursus. Nam nulla quam, gravida non, commodo a, sodales sit amet, nisi.</li>
<li>Pellentesque fermentum dolor. Aliquam quam lectus, facilisis auctor, ultrices ut, elementum vulputate, nunc.</li>
</ul>
<ul>
<li>Morbi in sem quis dui placerat ornare. Pellentesque odio nisi, euismod in, pharetra a, ultricies in, diam. Sed arcu. Cras consequat.</li>
<li>Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus.</li>
<li>Phasellus ultrices nulla quis nibh. Quisque a lectus. Donec consectetuer ligula vulputate sem tristique cursus. Nam nulla quam, gravida non, commodo a, sodales sit amet, nisi.</li>
<li>Pellentesque fermentum dolor. Aliquam quam lectus, facilisis auctor, ultrices ut, elementum vulputate, nunc.</li>
</ul>
<ul>
<li>Morbi in sem quis dui placerat ornare. Pellentesque odio nisi, euismod in, pharetra a, ultricies in, diam. Sed arcu. Cras consequat.</li>
<li>Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus.</li>
<li>Phasellus ultrices nulla quis nibh. Quisque a lectus. Donec consectetuer ligula vulputate sem tristique cursus. Nam nulla quam, gravida non, commodo a, sodales sit amet, nisi.</li>
<li>Pellentesque fermentum dolor. Aliquam quam lectus, facilisis auctor, ultrices ut, elementum vulputate, nunc.</li>
</ul>
<ul>
<li>Morbi in sem quis dui placerat ornare. Pellentesque odio nisi, euismod in, pharetra a, ultricies in, diam. Sed arcu. Cras consequat.</li>
<li>Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus.</li>
<li>Phasellus ultrices nulla quis nibh. Quisque a lectus. Donec consectetuer ligula vulputate sem tristique cursus. Nam nulla quam, gravida non, commodo a, sodales sit amet, nisi.</li>
<li>Pellentesque fermentum dolor. Aliquam quam lectus, facilisis auctor, ultrices ut, elementum vulputate, nunc.</li>
</ul>
<ul>
<li>Morbi in sem quis dui placerat ornare. Pellentesque odio nisi, euismod in, pharetra a, ultricies in, diam. Sed arcu. Cras consequat.</li>
<li>Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus.</li>
<li>Phasellus ultrices nulla quis nibh. Quisque a lectus. Donec consectetuer ligula vulputate sem tristique cursus. Nam nulla quam, gravida non, commodo a, sodales sit amet, nisi.</li>
<li>Pellentesque fermentum dolor. Aliquam quam lectus, facilisis auctor, ultrices ut, elementum vulputate, nunc.</li>
</ul>
<ul>
<li>Morbi in sem quis dui placerat ornare. Pellentesque odio nisi, euismod in, pharetra a, ultricies in, diam. Sed arcu. Cras consequat.</li>
<li>Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus.</li>
<li>Phasellus ultrices nulla quis nibh. Quisque a lectus. Donec consectetuer ligula vulputate sem tristique cursus. Nam nulla quam, gravida non, commodo a, sodales sit amet, nisi.</li>
<li>Pellentesque fermentum dolor. Aliquam quam lectus, facilisis auctor, ultrices ut, elementum vulputate, nunc.</li>
</ul>
<p id="bottom">Here is some more text. Click to <a href="#top">jump</a> to the top of the page.</p>