视口初始缩放不等于 1 时的 Vh 和 vw

Posted

技术标签:

【中文标题】视口初始缩放不等于 1 时的 Vh 和 vw【英文标题】:Vh and vw when viewport initial-zoom does not equal 1 【发布时间】:2015-09-02 18:47:42 【问题描述】:

我正在寻找一个覆盖整个屏幕的叠加层。

width: 100vw;
height: 100vh;

我正在处理的网站没有响应,并且设置为 1000 像素宽。我有元数据:

<meta name="viewport" content="width=device-width" />

设置为加载站点,使其显示为 1000 像素宽,但使用设备视口作为 vh/vw 单元,以便我可以使用媒体查询和 javascript 来删除/初始化/不初始化某些功能。

问题是当像素比为 1:1 且未缩小时 100vh 等于视口,因此我的 100vh/vw 比物理视口小得多。

有没有一种方法可以在保持检测较小屏幕的能力的同时,不管缩放/缩放级别如何,都可以淹没视口?

正如@Benjamin Solum 所指出的,我应该补充一点,问题出在移动浏览器上。

【问题讨论】:

我没听说过这个,所以我在 codepen 上试了一下,它似乎工作正常(Chrome)。你用什么浏览器放大,你是如何放大的?只是增加文本大小或缩放所有内容?你试过 %'s 吗? 几乎任何移动浏览器 啊哈,在考虑桌面。你能设置一个 Codepen/JSFiddle/等吗?您可以在哪里复制我可以用手机遇到的问题?只是想验证我是否正确理解了您的问题。另外,只是为了尝试一下,&lt;meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1"&gt; 会解决问题吗? 抱歉耽搁了:初始比例放大浏览器,所以你只能看到角落,最小比例不允许缩小。这是小提琴:jsfiddle.net/n0rrmc9e/1 这是在手机上查看的简易版:fiddle.jshell.net/n0rrmc9e/1/show/light 是的,我不确定阻止缩小是否能解决您的特定问题。在黑暗中拍摄:)。好的,所以除了在 body 上设置 margin: 0; 以删除左上角的白色边框之外,无论我在我的 android 手机上放大还是缩小,红色方块都会覆盖整个屏幕(注 4)。根据您的 CSS,这就是我所期望的。究竟发生了什么在您的设备上不起作用? 【参考方案1】:

缩放后不调整视口宽度和高度尺寸是浏览器实现的主题。

与似乎与 DOM 元素本身更相关的宽度和高度属性不同,我认为必须更改 vw 和 vh 的浏览器实现。

但可能有理由不这样做,例如当前行为有用的用例。因此,对于您的缩放 + 无响应页面的情况,我认为真正解决方案的可能性很小。

【讨论】:

【参考方案2】:

要覆盖整个屏幕,请使用绝对定位:

.overlay 
  /* For visibility */
  background: #f00;
  /* Position absolutely relative to viewport */
  position: absolute;
  /* Set edges to go all the way out to the viewport */
  top: 0; right: 0; bottom: 0; left: 0;
&lt;div class="overlay"&gt;Hi!&lt;/div&gt;

您不需要以这种方式处理视口元数据或类似的东西。

正如 Benjamin Solum 所说,如果您希望无论滚动如何都保持在同一位置,则可以将其固定在位置上。

【讨论】:

这对我有用,但我会将position: absolute 替换为position: fixed。我相信作者想要的效果是想要相对于屏幕的视口定位,他们可能不希望它滚动。 唯一的缺点是我有一个谷歌地图元素,下面有一个关闭按钮。在极端情况下,用户使用地图下方的空间进行放大,只在屏幕上留下地图,他们无法退出,因为放大地图只会缩放地图而不是视口。不过我可以忍受。感谢您的回答。

以上是关于视口初始缩放不等于 1 时的 Vh 和 vw的主要内容,如果未能解决你的问题,请参考以下文章

如何利用vw+rem进行移动端布局

vh搭配vw进行响应式布局

rem、rm、px、vw之间的相互转换

CSS3自适应布局单位 —— vw,vh

HTML,VUE,嵌入iframe,实现iframe的100%高度和宽度,代码分享

设置元素宽高为铺满屏幕的方式(巧妙使用单位vw和vh)