.my-element {
height: 100vh; /* Fallback for browsers that do not support Custom Properties */
height: calc(var(--vh, 1vh) * 100);
}
现在让我们用JavaScript获取视口的内部高度:
// First we get the viewport height and we multiple it by 1% to get a value for a vh unit
let vh = window.innerHeight * 0.01;
// Then we set the value in the --vh custom property to the root of the document
document.documentElement.style.setProperty('--vh', `${vh}px`);
// save old window size to adjust only if width changed
let oldWidth = window.innerWidth,
oldHeight = window.innerHeight;
// element to adjust
const target = document.querySelector(".vh100");
// adjust the size if window was resized
window.addEventListener("resize", handleResize);
function handleResize(initial = false) { // the parameter is used for calling the function on page load
/*
* if the width changed then resize
* without this Chrome mobile resizes every time navbar is hidden
*/
if (window.innerWidth !== oldWidth || initial) {
// stretch the target
target.classList.add("setting-100vh");
// save height and apply as min height
const h = target.clientHeight;
target.classList.remove("setting-100vh");
target.style.minHeight = h + "px";
}
}
// call when page is loaded
handleResize(true);
* {
margin: 0;
}
.vh100 {
background-color: green;
}
/*
* Stretch the element to window borders and save the height in JS
*/
.setting-100vh {
position: fixed;
top: 0;
bottom: 0;
min-height: unset;
}
<body>
<header class="vh100">
<h1>100vh on mobile</h1>
</header>
<main>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Possimus ipsa officia mollitia facilis esse cupiditate, nisi recusandae quas id enim alias eaque suscipit voluptates laudantium quasi saepe deserunt labore fuga deleniti placeat, necessitatibus
quibusdam. Quaerat adipisci provident minima laboriosam modi ullam accusamus error dolores iure ducimus laborum similique distinctio temporibus voluptas nulla quod ipsa, nostrum quam cumque id animi unde consectetur incidunt! Dolorem sed quisquam
at cumque. Cumque non nam exercitationem corporis? Minus sed explicabo maiores ipsam ratione. Quam, fugit asperiores nesciunt dolores culpa, numquam blanditiis sint dolorum ex corrupti illo veniam nostrum odio voluptatibus accusantium ullam impedit
eligendi voluptates?</p>
</main>
</body>
9条答案
按热度按时间rkue9o1l1#
根据official article on Chrome web,设置填充可见视口的高度的正确方法是使用
height: 100%
,可以在<html>
元素上,也可以在position: fixed
元素上。正如文档所描述的,这确保了与移动的Safari的兼容性,并且与URL栏的大小无关。aurhwmvo2#
尝试使用
min-height: -webkit-fill-available
。您也可以将其添加到height: 100vh
下面作为备用。ttygqcqt3#
从开发人员的Angular 来看,社区仍然没有严格的协议,浏览器应该如何处理顶部、底部和侧面板的移动。
问题中提到的问题是众所周知的:
1.这一切都始于Apple Webkit Issue,其中一个问题是网站开发人员使用
vh
来计算字体大小(calc(100/vh * something)).如果100vh是动态的,当用户向下滚动并且地址栏被隐藏时,那么字体大小,如任何其他绑定元素,将被扭曲,产生非常差的用户体验,更不用说是CPU/GPU密集型任务。苹果公司的决定是 * 匹配更大尺寸的屏幕(没有地址栏),以100vh不断 *。所以,当地址栏显示,你使用
100vh
高度的底部将走出屏幕。许多开发人员不同意这一决定,并认为视口单位是动态的,完全等于可见的"视口"。1.谷歌Chrome团队决定与苹果浏览器兼容,并坚持同样的决定。
height: 100%
在大多数现代浏览器中等于真实可见部分,即高度变化,并取决于在滚动期间地址栏是可见还是隐藏。1.横条不仅可以出现在屏幕的顶部,也可以出现在底部(现代iOS),屏幕键盘可以缩短视图。有一个nice demo可以检查移动设备的实际大小
100vh vs 100%
。补偿对
vh
的一些依赖性,可见栏高度等于"100vh-100%",当栏隐藏时,差异将为0。46qrfjad4#
现在让我们用JavaScript获取视口的内部高度:
来源:https://css-tricks.com/the-trick-to-viewport-units-on-mobile/
eblbsuwk5#
你可以修正地址栏设置高度的问题:100%在html和body标签和小康当然设置边距和填充的身体为零,也可以处理滚动在您的主要div更好地控制
s4chpxco6#
我刚刚想出了一个调整元素大小的方法,这样元素的高度就不包括那些只有屏幕导航栏和浏览器顶栏的没有主按钮的安卓智能手机了。如果内容比屏幕大,元素应该增长到可以容纳所有内容的大小,这就是为什么我使用最小高度。
编辑:
使用类而不是更改JS中的样式添加了代码段
bejyjqdl7#
我遇到了一个类似的问题,并将此解决方案用于ReactJS:
此
useWindowSize
函数取自Rerender view on browser resize with React。当我在代码中使用它时,它看起来像这样:
watbbzwu8#
我只是想在上面的答案上做一点扩展--我发现正如上面提到的Ross Light,你想使用
height: 100%
来解释web浏览器的地址栏,然而,为了使它工作,你必须将html标签和body标签的高度设置为等于height: 100%
,否则你的div将无法正确扩展:hwamh0ep9#
下面的代码片段对我很有效,我在main标记中插入了一个边框作为 Package 器的示例。