如何知道底部导航栏何时在移动浏览器中可见?
How to know when bottom nav-bar is visible in mobile safari?
所以我遇到了这个问题,点击页面底部的固定按钮会使页面向上滑动,显示移动 safari 中的底部导航栏,需要再次点击该按钮才能工作。向按钮添加 margin-bottom: 50px;
可以解决此问题,但是当页面滚动时,边距有点多,因为导航栏向下滑动。
使用 safe-area-inset
作为边距并不能解决问题。使用它作为填充修复它,但它也将元素一直延伸到屏幕底部
我还尝试了以下代码,这应该可以防止导航栏隐藏。这行得通,但它扰乱了 window 滚动计算和固定位置元素,因此它不能解决我的问题。
html,body{
height: 100%;
overflow-y: scroll;
-webkit-overflow-scrolling: touch;
}
在移动 safari 中使用 javascript 或 jquery 是否有任何方法可以知道底部导航栏何时为 visible/hidden 或解决此问题的任何解决方法?
经过大量的反复试验,我终于找到了解决问题的方法。我在一个类似的网站上工作,页面底部有一个 header 而不是按钮,但概念相似。
header 在页面滚动时动画进出并在 2.5 秒不活动后淡入,
当导航栏淡入或淡出时,触发 window resize
。如果正在使用移动 safari,那么每次 header 淡入并且它没有正确的 margin-bottom
时,就会添加边距。当导航栏出现时,边距被移除,因此 header 保持在导航栏顶部,没有任何额外的边距。
观看它工作的视频:https://streamable.com/sc20h
代码如下:
var initial = 0;
var animateHeader = false;
//check if using mobile safari [returns true is mobile safari] =====
var ua = window.navigator.userAgent;
var iOS = !!ua.match(/iPad/i) || !!ua.match(/iPhone/i);
var webkit = !!ua.match(/WebKit/i);
var iOSSafari = iOS && webkit && !ua.match(/CriOS/i);
//===================================================
//This fades the header in and out on scroll, this can be ignored if working on a button===
function headerAnimate() {
var lastScrollTop = 0;
var delta = 200;
$(window).off("scroll").on("scroll", function (event) {
if (!$(".box").hasClass("showing")) {
var st = $(this).scrollTop();
if (Math.abs(lastScrollTop - st) <= delta)
return;
if (st > lastScrollTop) {
$("header, #profilepopup, .search2 div").fadeOut("fast", "linear", function () {
$("#glassM").css("font-size", "25px")
$("#glassM").attr("class", "fa fa-search")
})
} else {
$("header").fadeIn("fast", "linear")
}
clearTimeout($.data(this, 'scrollTimer'));
$.data(this, 'scrollTimer', setTimeout(function () {
$("header").fadeIn("fast", "linear")
if(iOSSafari && animateHeader){
$("header").css("margin-bottom", "2%").animate({ marginBottom: "60px" })
}
}, 2500))
if (st <= 600 && $("#search").is(":visible")) {
$("#glassM").css("font-size", "30px")
$("#glassM").attr("class", "fa fa-times")
}
lastScrollTop = st;
}
});
}
//==================================================================
//this is where the magic happens=====================
if (iOSSafari) {
initial = $(window).height()
$(window).resize(function () {
if ($(window).height() >= initial && animateHeader === false) {
$("header").animate({ marginBottom: "60px" })
animateHeader = true
} else {
$("header").animate({ marginBottom: "2%" }, function () {
animateHeader = false
})
}
})
}
//======================================================================
所以我遇到了这个问题,点击页面底部的固定按钮会使页面向上滑动,显示移动 safari 中的底部导航栏,需要再次点击该按钮才能工作。向按钮添加 margin-bottom: 50px;
可以解决此问题,但是当页面滚动时,边距有点多,因为导航栏向下滑动。
使用 safe-area-inset
作为边距并不能解决问题。使用它作为填充修复它,但它也将元素一直延伸到屏幕底部
我还尝试了以下代码,这应该可以防止导航栏隐藏。这行得通,但它扰乱了 window 滚动计算和固定位置元素,因此它不能解决我的问题。
html,body{
height: 100%;
overflow-y: scroll;
-webkit-overflow-scrolling: touch;
}
在移动 safari 中使用 javascript 或 jquery 是否有任何方法可以知道底部导航栏何时为 visible/hidden 或解决此问题的任何解决方法?
经过大量的反复试验,我终于找到了解决问题的方法。我在一个类似的网站上工作,页面底部有一个 header 而不是按钮,但概念相似。
header 在页面滚动时动画进出并在 2.5 秒不活动后淡入,
当导航栏淡入或淡出时,触发 window resize
。如果正在使用移动 safari,那么每次 header 淡入并且它没有正确的 margin-bottom
时,就会添加边距。当导航栏出现时,边距被移除,因此 header 保持在导航栏顶部,没有任何额外的边距。
观看它工作的视频:https://streamable.com/sc20h
代码如下:
var initial = 0;
var animateHeader = false;
//check if using mobile safari [returns true is mobile safari] =====
var ua = window.navigator.userAgent;
var iOS = !!ua.match(/iPad/i) || !!ua.match(/iPhone/i);
var webkit = !!ua.match(/WebKit/i);
var iOSSafari = iOS && webkit && !ua.match(/CriOS/i);
//===================================================
//This fades the header in and out on scroll, this can be ignored if working on a button===
function headerAnimate() {
var lastScrollTop = 0;
var delta = 200;
$(window).off("scroll").on("scroll", function (event) {
if (!$(".box").hasClass("showing")) {
var st = $(this).scrollTop();
if (Math.abs(lastScrollTop - st) <= delta)
return;
if (st > lastScrollTop) {
$("header, #profilepopup, .search2 div").fadeOut("fast", "linear", function () {
$("#glassM").css("font-size", "25px")
$("#glassM").attr("class", "fa fa-search")
})
} else {
$("header").fadeIn("fast", "linear")
}
clearTimeout($.data(this, 'scrollTimer'));
$.data(this, 'scrollTimer', setTimeout(function () {
$("header").fadeIn("fast", "linear")
if(iOSSafari && animateHeader){
$("header").css("margin-bottom", "2%").animate({ marginBottom: "60px" })
}
}, 2500))
if (st <= 600 && $("#search").is(":visible")) {
$("#glassM").css("font-size", "30px")
$("#glassM").attr("class", "fa fa-times")
}
lastScrollTop = st;
}
});
}
//==================================================================
//this is where the magic happens=====================
if (iOSSafari) {
initial = $(window).height()
$(window).resize(function () {
if ($(window).height() >= initial && animateHeader === false) {
$("header").animate({ marginBottom: "60px" })
animateHeader = true
} else {
$("header").animate({ marginBottom: "2%" }, function () {
animateHeader = false
})
}
})
}
//======================================================================