vue在手机端页面缩放的控制

1,问题的提出

某vue前端程序,在手机APP上运行。需要做多图片浏览效果,要求如下:

  1. 进入浏览页面时,显示适应手机页面的缩小图,
  2. 用户可采用双指缩放,放大查看小图
  3. 用户点击图片时,弹出大图,宽度尺寸固定为1200px
  4. 大图可移动查看,但不允许缩放,点击大图后退出

以上要求中,第2和3叠加后,可能造成显示的大图过大,不利于查看。

如用户在显示小图时,双指放大3倍,此时页面上所有元素均放大3倍;用户再点击图片,此时显示的大图实际宽度为 1200*3=3600px

如此大幅图片并不利于查看图片。

 

因此,需要采取一种措施,用户可以放大小图,但是在单击显示大图时,不要放大大图的尺寸,而是让大图始终保持宽度尺寸固定为1200px。

 

2,方案分析

我设想的解决方案是,在显示大图前,获知当前页面的缩放比例R,然后在显示大图前,在程序中设置页面的scale属性为 1/R。即

transform: scale(1/R);

通过设置将页面的缩放抵消掉,使页面仍处于原始大小。这样,查看大图时就能1:1显示了。

 

但是我在网上搜索良久,竟然未能找到一个方法能获得当前手机页面的缩放比例值。

有说用addEventListener将容器(DIV)的touchstart 、touchmove 进行绑定监听,获得手势的比例,但本人测试发现,双指滑动时这些事件并不触发。

也许是我代码有误,后改为将事件绑定到document上,也不行,获取不到屏幕当前的缩放比。

 

于是转换思路,看到有文章说到viewport的scale属性,与页面缩放有关。但是查看文档,也只有以下三个初始设置值,并没有一个可以获得当前scale的变量:

  • initial-scale
  • minimum-scale
  • maximum-scale

郁闷中想到,重置initial-scale 为1 也许能让页面比例复原。代码如下:

document.getElementsByName('viewport')[0].setAttribute('content','width=device-width,initial-scale=1.0')

 

但是,发现上述语句不起作用!

后经反复试验,发现即使页面已经放大,其initial-scale属性值仍然为1,此时用代码去设置为1,相当于没有变化,所以被忽略了没效果。

其实,可以先将scale改为非常接近1的数值,再改回1即可有效。代码如下:

            document.getElementsByName('viewport')[0].setAttribute('content','width=device-width,initial-scale=1.01')
            document.getElementsByName('viewport')[0].setAttribute('content','width=device-width,initial-scale=1.0')

 

3,总结

本人对前端编程不熟悉,因此即使是一个小的功能也要摸索好久,好在最终得到了解决。

发此文出来,也是希望有知道如何获得手机当前页面缩放比的大佬教教我,感谢!

 

posted @ 2023-05-12 15:32  jack0424  阅读(1267)  评论(0编辑  收藏  举报