Skip to content

Commit 0b5e4ab

Browse files
committed
fix(navbar): fixed issue with large navbar scroll-hide on insufficient page scroll
1 parent 90c9a85 commit 0b5e4ab

File tree

1 file changed

+20
-8
lines changed

1 file changed

+20
-8
lines changed

src/core/components/navbar/navbar.js

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,14 @@ const Navbar = {
371371
const touchSnapTimeout = 70;
372372
const desktopSnapTimeout = 300;
373373

374+
function calcScrollableDistance() {
375+
console.log('calcScrollableDistance');
376+
$pageEl.find('.page-content').each((pageContentEl) => {
377+
pageContentEl.f7ScrollableDistance =
378+
pageContentEl.scrollHeight - pageContentEl.offsetHeight;
379+
});
380+
}
381+
374382
function snapLargeNavbar() {
375383
const inSearchbarExpanded = $navbarEl.hasClass('with-searchbar-expandable-enabled');
376384
if (inSearchbarExpanded) return;
@@ -450,7 +458,7 @@ const Navbar = {
450458

451459
let previousCollapseProgress = null;
452460
let collapseProgress = null;
453-
function handleLargeNavbarCollapse() {
461+
function handleLargeNavbarCollapse(pageContentEl) {
454462
const isHidden =
455463
$navbarEl.hasClass('navbar-hidden') ||
456464
$navbarEl.parent('.navbars').hasClass('navbar-hidden');
@@ -459,7 +467,11 @@ const Navbar = {
459467
$navbarEl.hasClass('navbar-large-transparent') ||
460468
($navbarEl.hasClass('navbar-large') && $navbarEl.hasClass('navbar-transparent'));
461469
previousCollapseProgress = collapseProgress;
462-
collapseProgress = Math.min(Math.max(currentScrollTop / navbarTitleLargeHeight, 0), 1);
470+
const scrollableDistance = Math.min(
471+
navbarTitleLargeHeight,
472+
pageContentEl.f7ScrollableDistance || navbarTitleLargeHeight,
473+
);
474+
collapseProgress = Math.min(Math.max(currentScrollTop / scrollableDistance, 0), 1);
463475
const previousCollapseWasInMiddle =
464476
previousCollapseProgress > 0 && previousCollapseProgress < 1;
465477
const inSearchbarExpanded = $navbarEl.hasClass('with-searchbar-expandable-enabled');
@@ -569,7 +581,7 @@ const Navbar = {
569581
currentScrollTop = scrollContent.scrollTop;
570582
scrollChanged = currentScrollTop;
571583
if (needCollapse) {
572-
handleLargeNavbarCollapse();
584+
handleLargeNavbarCollapse(scrollContent);
573585
} else if (needTransparent) {
574586
handleNavbarTransparent();
575587
}
@@ -597,6 +609,7 @@ const Navbar = {
597609
}, touchSnapTimeout);
598610
}
599611
$pageEl.on('scroll', '.page-content', handleScroll, true);
612+
600613
if (
601614
support.touch &&
602615
((needCollapse && snapPageScrollToLargeTitle) ||
@@ -605,16 +618,15 @@ const Navbar = {
605618
app.on('touchstart:passive', handeTouchStart);
606619
app.on('touchend:passive', handleTouchEnd);
607620
}
608-
if (needCollapse) {
609-
$pageEl.find('.page-content').each((pageContentEl) => {
610-
if (pageContentEl.scrollTop > 0) handleScroll.call(pageContentEl);
611-
});
612-
} else if (needTransparent) {
621+
calcScrollableDistance();
622+
if (needCollapse || needTransparent) {
613623
$pageEl.find('.page-content').each((pageContentEl) => {
614624
if (pageContentEl.scrollTop > 0) handleScroll.call(pageContentEl);
615625
});
616626
}
627+
app.on('resize', calcScrollableDistance);
617628
$pageEl[0].f7DetachNavbarScrollHandlers = function f7DetachNavbarScrollHandlers() {
629+
app.off('resize', calcScrollableDistance);
618630
delete $pageEl[0].f7DetachNavbarScrollHandlers;
619631
$pageEl.off('scroll', '.page-content', handleScroll, true);
620632
if (

0 commit comments

Comments
 (0)