【问题标题】:Android viewport setting "user-scalable=no" breaks width / zoom level of viewportAndroid视口设置“user-scalable=no”会破坏视口的宽度/缩放级别
【发布时间】:2012-09-25 06:53:32
【问题描述】:

我正在开发一个宽度为 640 像素的网络应用程序。

在文档head我设置

  <meta name="viewport" content = "width=640, user-scalable=no" />

因此内容可以很好地显示和水平拉伸。
这在 iOS 上完美运行,但在 Android 中,浏览器打开放大的网站,因此用户必须双击才能缩小整个页面。

当我更改视口设置以省略 user-scalable 标记时:

<meta name="viewport" content="width=640" />

Android 浏览器可以很好地调整到 640 像素 - 所以它可以工作。
然而现在的问题是,由于没有设置user-scalable 标签,用户可以在 Android 和 iOS 上放大和缩小。

如何在 Android 上禁止缩放并同时将视口宽度设置为 640 像素?

【问题讨论】:

  • 这是浏览器的错误。我已经尝试了一切,没有任何效果。最后我只从这个浏览器中删除了user-scalable=no。它工作正常。

标签: android iphone mobile browser viewport


【解决方案1】:

我希望移动设备始终显示 640 像素宽的网站,因为否则会破坏设计。 (我没有做的设计..)因此我想禁用移动用户的缩放。对我有用的是以下内容:

- 2013 年 10 月 31 日更新

首先,没有 Javascript 就无法做到这一点。您将不得不检查用户代理字符串。因此,我创建了一个 mobile-viewport.js 并将脚本包含在结束标记之前:

function writeViewPort() {
    var ua = navigator.userAgent;
    var viewportChanged = false;
    var scale = 0;

    if (ua.indexOf("Android") >= 0 && ua.indexOf("AppleWebKit") >= 0) {
        var webkitVersion = parseFloat(ua.slice(ua.indexOf("AppleWebKit") + 12));
        // targets android browser, not chrome browser (http://jimbergman.net/webkit-version-in-android-version/)
        if (webkitVersion < 535) {
            viewportChanged = true;
            scale = getScaleWithScreenwidth();
            document.write('<meta name="viewport" content="width=640, initial-scale=' + scale + ', minimum-scale=' + scale + ', maximum-scale=' + scale + '" />');
        }
    }

    if (ua.indexOf("Firefox") >= 0) {
        viewportChanged = true;
        scale = (getScaleWithScreenwidth() / 2);
        document.write('<meta name="viewport" content="width=640, user-scalable=false, initial-scale=' + scale + '" />');
    }

    if (!viewportChanged) {
        document.write('<meta name="viewport" content="width=640, user-scalable=false" />');
    }

    if (ua.indexOf("IEMobile") >= 0) {
        document.write('<meta name="MobileOptimized" content="640" />');
    }

    document.write('<meta name="HandheldFriendly" content="true"/>');
}

function getScaleWithScreenwidth() {
    var viewportWidth = 640;
    var screenWidth = window.innerWidth;
    return (screenWidth / viewportWidth);
}

writeViewPort();

脚本会检查访问者是否使用 android(不是 chrome)或 firefox 浏览器。 android浏览器不支持width=640和user-scalable=false的组合,而firefox浏览器由于某种奇怪的原因确实有双屏宽度。如果访问者有一个 windows phone IE 浏览器 MobileOptimized 被设置。

【讨论】:

  • 哦,谢谢。我不得不对其进行一些调整以适用于我的特定网站,但现在我得到了一个完全适合浏览器的网站,即使在旧的 Android 设备上也是如此。
【解决方案2】:

尝试像这样渲染视口元标记:

    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />

设置缩放设置将设置用户缩放范围的限制,因此如果您将初始值和最大值设置为相同的量,这应该可以解决问题。

更新:通过设置以下内容,我能够一起修复我的 Android 设备错误:

<meta name="viewport" content="width=640px, initial-scale=.5, maximum-scale=.5" />

我还注意到某些内容,例如 p 标签没有在屏幕上流动,因此解决方法是将带有空字符串的 background-image 属性添加到任何被卡住并且没有穿过屏幕的内容中布局视图。希望这次对您有所帮助。

【讨论】:

  • 显然当将初始比例设置为 1.0 时,它会调整为 320 像素,以便页面加载放大(我的页面宽度为 640 像素)。将初始比例设置为 0.5 和 640 像素一样有效。 user-scalable=no 选项会破坏 Android,无论我使用 , 还是 ; - 所以仍然没有解决方案:(
  • 我试过&lt;meta name="viewport" content = "width=640, user-scalable=no" /&gt;&lt;meta name="viewport" content = "width=640; user-scalable=no" /&gt;都让Android浏览器加载最初放大的页面
  • 酷,这似乎可行 - 所以要理解这一点:不需要 user-scalable=no 因为 initial-scale 和 maximum-scale 设置为相同的数字?
  • 完全正确。我们可以通过这种方式锁定用户可见布局:)
  • This 表示您应该使用逗号来分隔多个属性,而不是分号。
【解决方案3】:

我有同样的情况,如果您希望内容始终适合屏幕宽度而不允许用户放大/缩小,请使用以下元标记(无论您给出什么宽度都可以)

 <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />

【讨论】:

  • 显然当将初始比例设置为 1.0 时,它会调整为 320 像素,以便页面加载放大(我的页面宽度为 640 像素)。将初始比例设置为 0.5 和 640 像素一样有效。 user-scalable=no 选项会破坏 Android,无论我使用 , 还是 ; - 所以仍然没有解决方案:(
猜你喜欢
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多