如何iframe的页面上忽略浏览器缩放(CTRL +滚动)

问题描述:

如何iframe的页面上忽略浏览器缩放(CTRL +滚动)如何iframe的页面上忽略浏览器缩放(CTRL +滚动)

我尝试:

试算大规模使用window.devicePixelRatio和变化iframe zoom document.body.style.transform = 'scale(' + 1/window.devicePixelRatio + ')';

+0

您是否尝试过在主页面和'iframe'内显示的页面上使用元标记?另外,你是从主页面还是从IFrame页面调用javascript方法? – Twometer

+0

是的,它是相同的页面,但与另一个表和标头 –

我用下面的代码:

const updateSizePrintPage =() => { 
     let scale = 1/window.devicePixelRatio; 
     document.getElementById('print-page').style.transform = 'scale(' + scale + ')'; 
     document.getElementById('print-page').style.transformOrigin = 'top left'; 
     }; 
window.addEventListener('resize', updateSizePrintPage) 

,它为我工作。 请参阅此问题:how did not zoom content on printing when browser zoom?

好吧,经过一番尝试,我发现了一个黑客解决方案,您的问题。它使用tombigel的DetectZoom Library(link)。一切都在主文档中进行(例如的index.html)

首先,你必须CSS以下行添加到您的文档

<style> 
     #frame { 
      -moz-transform: scale(1.0); 
      -moz-transform-origin: 0 0; 
      -o-transform-origin: 0 0; 
      -webkit-transform-origin: 0 0; 
     } 
</style> 

然后,(在我的情况frame)添加一个id您iframe,像这样:

<iframe id="frame" src="..."> 
</iframe> 

而且,在文档的末尾,添加一些javascript:

首先,我们需要的jQuery

<script src="http://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 

然后,实际DetectZoom库(我已经下载了它,并把它的代码在这里,使事情变得更容易一行,当然你可以把那个东西在一个单独的js文件)。

<script> 
    (function(root,ns,factory){"use strict";"undefined"!=typeof module&&module.exports?module.exports=factory(ns,root):"function"==typeof define&&define.amd?define(function(){return factory(ns,root)}):root[ns]=factory(ns,root)})(window,"detectZoom",function(){var devicePixelRatio=function(){return window.devicePixelRatio||1},fallback=function(){return{zoom:1,devicePxPerCssPx:1}},ie8=function(){var zoom=Math.round(100*(screen.deviceXDPI/screen.logicalXDPI))/100;return{zoom:zoom,devicePxPerCssPx:zoom*devicePixelRatio()}},ie10=function(){var zoom=Math.round(100*(document.documentElement.offsetHeight/window.innerHeight))/100;return{zoom:zoom,devicePxPerCssPx:zoom*devicePixelRatio()}},webkitMobile=function(){var deviceWidth=90==Math.abs(window.orientation)?screen.height:screen.width,zoom=deviceWidth/window.innerWidth;return{zoom:zoom,devicePxPerCssPx:zoom*devicePixelRatio()}},webkit=function(){var important=function(str){return str.replace(/;/g," !important;")},div=document.createElement("div");div.innerHTML="1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>0",div.setAttribute("style",important("font: 100px/1em sans-serif; -webkit-text-size-adjust: none; text-size-adjust: none; height: auto; width: 1em; padding: 0; overflow: visible;"));var container=document.createElement("div");container.setAttribute("style",important("width:0; height:0; overflow:hidden; visibility:hidden; position: absolute;")),container.appendChild(div),document.body.appendChild(container);var zoom=1e3/div.clientHeight;return zoom=Math.round(100*zoom)/100,document.body.removeChild(container),{zoom:zoom,devicePxPerCssPx:zoom*devicePixelRatio()}},firefox4=function(){var zoom=mediaQueryBinarySearch("min--moz-device-pixel-ratio","",0,10,20,1e-4);return zoom=Math.round(100*zoom)/100,{zoom:zoom,devicePxPerCssPx:zoom}},firefox18=function(){return{zoom:firefox4().zoom,devicePxPerCssPx:devicePixelRatio()}},opera11=function(){var zoom=window.top.outerWidth/window.top.innerWidth;return zoom=Math.round(100*zoom)/100,{zoom:zoom,devicePxPerCssPx:zoom*devicePixelRatio()}},mediaQueryBinarySearch=function(property,unit,a,b,maxIter,epsilon){function binarySearch(a,b,maxIter){var mid=(a+b)/2;if(0>=maxIter||epsilon>b-a)return mid;var query="("+property+":"+mid+unit+")";return matchMedia(query).matches?binarySearch(mid,b,maxIter-1):binarySearch(a,mid,maxIter-1)}var matchMedia,head,style,div;window.matchMedia?matchMedia=window.matchMedia:(head=document.getElementsByTagName("head")[0],style=document.createElement("style"),head.appendChild(style),div=document.createElement("div"),div.className="mediaQueryBinarySearch",div.style.display="none",document.body.appendChild(div),matchMedia=function(query){style.sheet.insertRule("@media "+query+"{.mediaQueryBinarySearch "+"{text-decoration: underline} }",0);var matched="underline"==getComputedStyle(div,null).textDecoration;return style.sheet.deleteRule(0),{matches:matched}});var ratio=binarySearch(a,b,maxIter);return div&&(head.removeChild(style),document.body.removeChild(div)),ratio},detectFunction=function(){var func=fallback;return isNaN(screen.logicalXDPI)||isNaN(screen.systemXDPI)?window.navigator.msMaxTouchPoints?func=ie10:"orientation"in window&&"string"==typeof document.body.style.webkitMarquee?func=webkitMobile:"string"==typeof document.body.style.webkitMarquee?func=webkit:navigator.userAgent.indexOf("Opera")>=0?func=opera11:window.devicePixelRatio?func=firefox18:firefox4().zoom>.001&&(func=firefox4):func=ie8,func}();return{zoom:function(){return detectFunction().zoom},device:function(){return detectFunction().devicePxPerCssPx}}}); 
</script> 

最后,让我们添加iframe的功能以保持大小。

<script> 
    function refresh() { 
     var zoomLevel = 1/(window.detectZoom.device().toFixed(2)); 
     $('#frame').css({ transform: 'scale(' + zoomLevel +')' }); 
    } 
    $(document).ready(function() { 
     refresh(); 
     $(window).on('resize', refresh); 
    }); 
</script> 

这里你可以看到一个工作示例:click(这将作为上述重定向到具有类似内容的HTML文档这个HTML文件在我自己的服务器托管,因为我不能上的jsfiddle使用iframe,但我没有病毒。)

请注意,我没有编写库DetectZoom,但只有最后一个javscript代码片段,它扩展了iFrame

所有的东西都经过谷歌浏览器61的测试,我不知道这个东西与其他老版本的brosers有多好。

+0

我不能使用一些库尝试 让scale = 1/window.devicePixelRatio; document.getElementById('frame')。style.transform ='scale('+ scale +')'; 窗口。addEventListener('resize',smFn); 在页面iframe真的没有改变,但在打印这个帧 - 不正确 –

+0

用我在我的答案中提出的方法,'iframe'可以正确缩放,但我不知道这是否依赖于浏览器。但为什么你不能使用图书馆? – Twometer