JS中获取AndroidChrome浏览器地址栏高度
Get Android Chrome Browser Address bar height in JS
如何在 Chrome 浏览器中为 Android 获取 JavaScript 中地址栏的高度(左图中用红色矩形标记)?我需要知道它在向下滚动时消失了,我需要对此做出反应,因为那时视口高度不同。
我已经想到的一个解决方案:
获取初始状态下的视口高度:
var height = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
地址栏消失时获取视口高度
计算两个值之间的差异
问题是你必须处于第二状态才能知道。
您要找的是url bar resizing。由于 Android 的 chrome v56,David Bokan 建议在移动设备上使用 vh unit。在那篇文章中有一个演示,点击 link 获取更多信息以及如何在移动设备上使用它。
当用户向下滚动页面时,将引发 window.resize 事件。
您可以通过使用事件侦听器捕获此事件来更新您的页面。
更多信息:mobile chrome fires resize event on scroll
对我来说最好的方法是拥有类似的东西:
$(document).ready(function(){
var viewportHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
var viewportWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
var isPortrait = viewportHeight > viewportWidth;
$( window ).resize(onresize);
function onresize() {
var newViewportHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
var newViewportWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
var hasOrientationChanged = (newViewportHeight > newViewportWidth) != isPortrait;
var addressbarHeight = 130;
if (!hasOrientationChanged && (newViewportHeight != viewportHeight)) {
addressbarHeight = Math.abs(newViewportHeight - viewportHeight);
if (newViewportHeight < viewportHeight) {
// Android Chrome address bar has appeared
} else {
// Android Chrome address bar has disappeared
}
} else if(hasOrientationChanged) {
// Orientation change
}
viewportHeight = newViewportHeight;
viewportWidth = newViewportWidth;
isPortrait = viewportHeight > viewportWidth;
}
});
今天遇到了同样的问题,原来没有简单的方法可以直接计算出 url 条的高度。据我所知,javascript中可直接访问的变量中的none可以告诉你“100vh”的大小是多少。
在移动浏览器上,100vh 可能包括也可能不包括 url 栏的高度,如果我们想将 div 的大小精确调整为加载期间浏览器的可见内容区域。
我想出了一个解决方法,尽管它对我来说非常有效,我是这样做的:
- 在您的 html 根元素上添加一个大小为 100vh 的虚拟 属性。在我的例子中,我使用了 "perspective" 属性,它对我有用
那么您可以通过以下代码获取地址栏大小:
var addressBarSize = parseFloat(getComputedStyle(document.documentElement).perspective) - document.documentElement.clientHeight
我有一个包含动态内容的容器,它必须始终至少具有视口的完整高度(如果内容不适合屏幕,则可以滚动)。
因此,如果您需要固定高度,只需将我的解决方案中的 "min-height" 替换为 "height" 即可。
我就是这样处理的。
// calculate min-height on init
$(".content-container").css("min-height", `${window.innerHeight}px`);
// recalculate the min-height everytime the bar appears or disappears
$(window).resize(() => {
$(".content-container").css("min-height", `${window.innerHeight}px`);
});
它适用于 android 的地址栏和 safari 的地址栏(在 safari mobile 中也可以有顶部和底部栏)。
然后为了使过渡平滑,您可以应用 css 规则:
.content-container{
transition: min-height 500ms ease;
}
因为100vh will be larger than the visible height when the URL bar is shown
。根据this.
您可以通过创建一个宽度为 0、高度为 100vh 的元素来计算 URL 条的高度。
<div id="control-height"></div>
#control-height {
height: 100vh;
width: 0;
position: absolute;
}
然后使用 javascript 将 window.innerHeight
与该元素的高度进行比较。
const actualHeight = window.innerHeight;
const elementHeight = document.querySelector('#control-height').clientHeight;
const barHeight = elementHeight - actualHeight;
如何在 Chrome 浏览器中为 Android 获取 JavaScript 中地址栏的高度(左图中用红色矩形标记)?我需要知道它在向下滚动时消失了,我需要对此做出反应,因为那时视口高度不同。
我已经想到的一个解决方案:
获取初始状态下的视口高度:
var height = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
地址栏消失时获取视口高度
计算两个值之间的差异
问题是你必须处于第二状态才能知道。
您要找的是url bar resizing。由于 Android 的 chrome v56,David Bokan 建议在移动设备上使用 vh unit。在那篇文章中有一个演示,点击 link 获取更多信息以及如何在移动设备上使用它。
当用户向下滚动页面时,将引发 window.resize 事件。 您可以通过使用事件侦听器捕获此事件来更新您的页面。
更多信息:mobile chrome fires resize event on scroll
对我来说最好的方法是拥有类似的东西:
$(document).ready(function(){
var viewportHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
var viewportWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
var isPortrait = viewportHeight > viewportWidth;
$( window ).resize(onresize);
function onresize() {
var newViewportHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
var newViewportWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
var hasOrientationChanged = (newViewportHeight > newViewportWidth) != isPortrait;
var addressbarHeight = 130;
if (!hasOrientationChanged && (newViewportHeight != viewportHeight)) {
addressbarHeight = Math.abs(newViewportHeight - viewportHeight);
if (newViewportHeight < viewportHeight) {
// Android Chrome address bar has appeared
} else {
// Android Chrome address bar has disappeared
}
} else if(hasOrientationChanged) {
// Orientation change
}
viewportHeight = newViewportHeight;
viewportWidth = newViewportWidth;
isPortrait = viewportHeight > viewportWidth;
}
});
今天遇到了同样的问题,原来没有简单的方法可以直接计算出 url 条的高度。据我所知,javascript中可直接访问的变量中的none可以告诉你“100vh”的大小是多少。
在移动浏览器上,100vh 可能包括也可能不包括 url 栏的高度,如果我们想将 div 的大小精确调整为加载期间浏览器的可见内容区域。
我想出了一个解决方法,尽管它对我来说非常有效,我是这样做的:
- 在您的 html 根元素上添加一个大小为 100vh 的虚拟 属性。在我的例子中,我使用了 "perspective" 属性,它对我有用
那么您可以通过以下代码获取地址栏大小:
var addressBarSize = parseFloat(getComputedStyle(document.documentElement).perspective) - document.documentElement.clientHeight
我有一个包含动态内容的容器,它必须始终至少具有视口的完整高度(如果内容不适合屏幕,则可以滚动)。
因此,如果您需要固定高度,只需将我的解决方案中的 "min-height" 替换为 "height" 即可。
我就是这样处理的。
// calculate min-height on init
$(".content-container").css("min-height", `${window.innerHeight}px`);
// recalculate the min-height everytime the bar appears or disappears
$(window).resize(() => {
$(".content-container").css("min-height", `${window.innerHeight}px`);
});
它适用于 android 的地址栏和 safari 的地址栏(在 safari mobile 中也可以有顶部和底部栏)。
然后为了使过渡平滑,您可以应用 css 规则:
.content-container{
transition: min-height 500ms ease;
}
因为100vh will be larger than the visible height when the URL bar is shown
。根据this.
您可以通过创建一个宽度为 0、高度为 100vh 的元素来计算 URL 条的高度。
<div id="control-height"></div>
#control-height {
height: 100vh;
width: 0;
position: absolute;
}
然后使用 javascript 将 window.innerHeight
与该元素的高度进行比较。
const actualHeight = window.innerHeight;
const elementHeight = document.querySelector('#control-height').clientHeight;
const barHeight = elementHeight - actualHeight;