动态设置元视口比例

Wil*_*han 3 html javascript

https://stackblitz.com/edit/js-meta-viewport

在 Chrome 调试器中,当我单击“可以缩放”但无法在移动设备(Nexus 5(Chrome 70))上缩放时,我可以看到元标记更新。

最终目标是在移动设备上动态允许和禁止在同一个水疗中心进行缩放。

编辑:

我已经成功地从

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=10.0, minimum-scale=0.0, user-scalable=yes">
Run Code Online (Sandbox Code Playgroud)

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">
Run Code Online (Sandbox Code Playgroud)

还有不包括最小规模的变化

并返回,但这似乎没有影响或改变行为,特别是用户在我的 Nexus 5(Chrome 70)上“缩放”的能力。

我试过分配viewportTag.content = content、调用viewportTag.setAttribute('content', content)和重新渲染document.head.removeChild()then document.head.appendChild()。再次全部成功切换标记但没有行为

分配:https : //stackblitz.com/edit/js-meta-viewport

setAttribute: https://stackblitz.com/edit/js-meta-viewport-answer ( /sf/answers/3772990721/ )

重绘:https : //stackblitz.com/edit/js-meta-viewport-redraw

更新:

这里的解决方案有效https://stackblitz.com/edit/js-meta-viewport-answer ( /sf/answers/3772990721/ ) 但我不明白为什么,不是setAttribute()因为https:/ /stackblitz.com/edit/js-meta-viewport-setattribute不起作用

Sha*_*har 7

您要更改的元标记是视口。当 metaeg 设置为 user-scalable=no 时,用户无法像这样缩放设备:

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
Run Code Online (Sandbox Code Playgroud)

要使用 javascript 更改它,请查看以下代码:

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
Run Code Online (Sandbox Code Playgroud)
// Holds the scale state. doesn't have to be in a global var,
// just for the clarity of the explanation
let allowScale = true;

// Just to show the state
// You do not need this function
function showViewportState() {
    const viewportState =  document.getElementById('viewport-state');
    viewportState.innerHTML = allowScale? 'Can Scale': 'Can not Scale';
}
showViewportState();

const btn = document.getElementById('toggle');
btn.addEventListener('click', toggleViewport);

// The toggle view port updates the
function toggleViewport(){
    let viewport = document.querySelector("meta[name=viewport]");
    if (!viewport){
        // in case there is no view port meta tag creates one and add it to the head
        viewport=document.createElement('meta');
        viewport.name = "viewport";
        document.getElementsByTagName('head')[0].appendChild(viewport);
    }
    
    const content = allowScale?
        'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no':'width=device-width, initial-scale=1.0, user-scalable=yes';
    // this is where the magic happens by changing the vewport meta tag
    viewport.setAttribute('content', content);
    allowScale = !allowScale;
    showViewportState();
}
Run Code Online (Sandbox Code Playgroud)
        body{
            margin: 0;
            padding: 0;
        }
        .main{
            display: flex;
            min-height: 100vh;
            justify-content: center;
            align-items: center;
            text-align: center;
        }
        #viewport-state{
            margin-top: 20px;
            font-weight: bold;
            display: block;
        }
Run Code Online (Sandbox Code Playgroud)