Функция scrollHash()
, приведенная ниже, предназначена для прокрутки до целевого якоря при настройке положения для отображения как фиксированного меню, так и требуемого margin-top
.
Функция работает правильно в Chrome, однако она работает только в Firefox, если событие mouseout
происходит до завершения функции (учитывая функции duration
и setTimeout()
). В противном случае, если мышь продолжает зависать над ссылкой в Firefox на протяжении всего выполнения функции, функция не может завершить второй шаг корректировки позиции (вычитая фиксированную высоту меню из offset().top
).
Это стоитотмечая, что проблема не присутствует в JSFiddle + Firefox (используя идентичный код и версию jQuery, 1.9.1), и я использую Firefox версии 69.0.3 (64-разрядная версия). Скрипка доступна здесь: https://jsfiddle.net/chayanyc/otkLa90x/
Фрагменты кода
CSS:
body {margin: 0; padding: 0; height: 100%; overflow-x: hidden;}
* {box-sizing: border-box;}
.header_container {height: var(--targetPosition); width: 100vw; margin: 0; padding: 0; position: fixed; top: 0; display: block;}
.main {margin-top: var(--topWrapper); width: 100%;}
.Section {padding: var(--sectPadding) 0; width: 100%;}
@media (max-width: 600px) {
:root {
--sectPadding: 5rem;
}
}
@media (min-width: 600px) {
:root {
--sectPadding: 9.5rem;
--targetPosition: 9.3rem;
}
}
JavaScript:
// SCROLL HASH FUNCTIONS //
window.onhashchange = scrollHash;
function scrollHash() {
menuHeight = document.getElementById('header').offsetHeight;
$('.TargetMark').removeClass('TargetMark')
if (window.location.hash) {
$(window.location.hash).addClass('TargetMark')
$('html, body').animate({
scrollTop: $('.TargetMark').offset().top - menuHeight
}, 100);
}
}
// SET MARGIN TOP //
var headerHeight;
function setTarget() {
headerHeight = document.getElementById('header').offsetHeight;
headerHeight = headerHeight + "px";
document.documentElement.style.setProperty('--topWrapper', headerHeight);
}
$(document).ready(function () {
setTarget();
});
$(window).resize(function () {
setTarget();
});
вывод console.log
// SAME OUTPUT IN CHROME VS. FIREFOX
var offset = $('.TargetMark').offset();
console.log( (offset.top - topHeight) );
// DIFFERING OUTPUT IN CHROME VS. FIREFOX
var $window = $(window);
$(window).on('scroll', function () {
$topOffset = $(this).scrollTop();
console.log($topOffset);
});