【问题标题】:Is there a way to reset the scale of the viewport dynamically to 1.0有没有办法将视口的比例动态重置为 1.0
【发布时间】:2012-02-22 09:39:13
【问题描述】:

我在移动在线商店工作,在实现产品缩放功能时卡住了

点击图片后“用户可缩放”是允许的,最大缩放设置为 10.0 当用户使用捏合手势放大产品时,一切正常。 但是在关闭缩放的图像后,比例不会重置为 1.0。

有没有办法动态重置视口的比例值。 “初始比例”似乎不起作用,将“最小比例”和“最大比例”重置为 1.0

问题出现在 iPhone / iPad 上

似乎有一个解决方案,但我不知道我应该在这篇文章中应用哪个元素: How to reset viewport scaling without full page refresh?

“你需要使用-webkit-transform: scale(1.1); webkit transition。”

但我不知道样式应用于哪个元素。

这里有一些代码来说明问题。

在视口的元标记中如下所示:

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

页面的其余部分如下所示:

<div id="page">
    <img src="images/smallProductImage.jpg">
</div>

<div id="zoom">
    <div class="jsZoomImageContainer"></div>
</div>

这是 javascript::

zoom:{
    img: null,
    initialScreen:null,

    load:function(src){             

        //load the image and show it when loaded

        showLoadingAnimation();
        this.img = new Image();
        this.img.src = src;

        jQuery(this.img).load(function(){
            zoom.show();
        });
    },

    show:function(){

        var screenWidth, screenHeight, imageWidth, imageHeight, scale, ctx;             

        hideLoadingAnimation();
        jQuery("#page").hide();         
        jQuery("#zoom").show();

        jQuery(".jsZoomImageContainer").empty();
        this.initialScreen =[jQuery(window).width(),  jQuery(window).height()]
        jQuery(".jsZoomImageContainer").append(this.img);               


        imageWidth = jQuery(this.img).width();
        imageHeight = jQuery(this.img).height();

        scale = this.initialScreen[0] / imageWidth ;

        jQuery(this.img).width(imageWidth * scale)
        jQuery(this.img).height(imageHeight * scale)


        jQuery(".jsZoomImageContainer").click(function(){
             zoom.hide();
        });

        jQuery('meta[name="viewport"]',"head").attr("content","user-scalable=yes, initial-scale:1.0, minimum-scale=1.0, maximum-scale=10.0")                 

    },

    hide:function(){                        
        jQuery(".jsZoomImageContainer").empty();                        
        jQuery('meta[name="viewport"]',"head").attr("content","user-scalable=no, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0") 

        jQuery("#zoom").hide();
        jQuery("#page").show();

        this.img = null;
        this.initialScreen = null;

    }
}

jQuery("#page img").click(function(){
    zoom.load("images/bigProductImage.jpg");
});

【问题讨论】:

  • 您提到的解决方案使用 CSS 来缩放事物,而不是应用在视口上的原生缩放。如果你想应用那个解决方案,你应该重新考虑你的缩放,所以它是由 css+javascript 完成的
  • 如果你有兴趣,我写了一个答案(这里)[stackoverflow.com/questions/22639296/… 关于这个确切的问题。一个(对我而言)有效的解决方案,与在回答您的问题或其他问题时找到的所有解决方案相反。

标签: javascript iphone ipad mobile viewport


【解决方案1】:

According to ppk,这种视口操作技术适用于除 Firefox 之外的所有现代浏览器:

<meta id="testViewport" name="viewport" content="width = 380">
<script>
if (screen.width > 740) {
    var mvp = document.getElementById('testViewport');
    mvp.setAttribute('content','width=740');
}
</script>

似乎关键是在meta 标签中设置id 属性,以便您可以使用JS 轻松选择它并替换content 属性的值。

【讨论】:

    【解决方案2】:

    它适用于所有现代浏览器。我已经在几个网站上完成了,一切都很好。 但是重置并不能解决问题。当情况发生变化时,您需要正确更改比例和视口宽度。 当方向改变和屏幕尺寸改变时,你需要改变它,当然在检测到屏幕尺寸时加载。如果您获得当前宽度的值,则可以计算比例。 (顺便说一下,当方向为 90 或 -90 时,您应该以高度为宽度)。 例如, 如果您的主容器宽度为 960px,并且 w_width 是您动态获得的当前宽度。

    scale=100/100/(960/w_width);
    scale=scale.toFixed(2) ;
    jQuery('meta[name=viewport]').attr('content', "width="+w_width+", initial-scale="+scale);
    

    【讨论】:

    • 不在所有浏览器中。此技术仅在 Webkit 浏览器中受支持,而 IE10+ 用于宽度小于 400 像素的视口。对于 Firefox,您目前必须添加一个新的元视口元素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2021-11-13
    相关资源
    最近更新 更多