Android viewport setting “user-scalable=no” breaks width / zoom level of viewport

后端 未结 3 2069
终归单人心
终归单人心 2020-12-04 16:23

I am working on a web app which has a width of 640px.

In the document head I set

  

        
相关标签:
3条回答
  • 2020-12-04 16:36

    I wanted mobile to always show a website 640px wide because of a design that would break otherwise. (a design I did not make..) Thereby I wanted to disable zooming for mobile users. What worked for me me is the following:

    - UPDATED 2013-10-31

    First of all, there is no way you can do this without Javascript. You will have to check the user agent string. Therefore I created a mobile-viewport.js and included the script just before the closing tag:

    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();
    

    The script checks if the visitor has an android (not chrome) or firefox browser. The android browser does not support the combination of width=640 and user-scalable=false, and the firefox browser does have a double screen width for some strange reason. If the visitor has a windows phone IE browser MobileOptimized is set.

    0 讨论(0)
  • 2020-12-04 16:45

    I had the same situation, if you want the content to always fit the screen width without allowing the user to zoom in/out, use the following meta tags (this will work no matter what width you give)

     <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    
    0 讨论(0)
  • 2020-12-04 16:55

    Trying rendering the viewport meta tag like so:

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

    Setting scale settings will set user restrictions on how far they can zoom, and so if you set the initial and maximum to the same amount, this should fix the problem.

    UPDATE: I was able to fix my bug for android devices all together by setting the below:

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

    I also noticed that some content, such as p tags were not flowing across the screen, so the hack for that would be to add the background-image property with empty string to any content that is stuck and is not going across the layout view. Hope this helps this time for you.

    0 讨论(0)
提交回复
热议问题