很抱歉回答了我自己的问题,但经过大量修改后,我找到了一种适合我并且似乎适用于大多数网站的方法,因此我认为值得分享:
function zoom(scale) {
document.body.style.transform = "scale(" + scale + ")";
document.body.style.transformOrigin = "top left";
document.body.style.width = (100 / scale) + "%";
document.body.style.height = (100 / scale) + "%";
};
zoom(1.25);
诀窍是通过缩放变换放大身体,然后减小高度和宽度。减小高度和宽度会使其重新流动并将转换后的内容保留在屏幕上。
我通过将上面的代码粘贴到几个流行网站上的 Chrome Firefox 和 IE 的控制台来测试它。它似乎完美地重新扩展了 amazon.com 和 stackoverflow.com,但不是 gmail。我自己的网络应用需要下面描述的补丁。
更完整的 jQuery 补丁解决方案:
使用上述解决方案(以及在捏缩放之后),当 JavaScript 尝试测量像素位置并使用它们来定位其他元素时会出现问题。这是因为像getBoundingClientRect() 这样的函数返回坐标乘以scale。如果您使用 jQuery .height()、.width()、offset() 等,您会遇到同样的问题;所有 jQuery 文档都说,“当用户缩放页面时,尺寸可能不正确”。
您可以修复像 .width() 这样的 jQuery 方法,以便像使用 scale = 1 查看时一样传递值。
自 jQuery 3.2.0 起编辑: height()、width() 等已修复,不需要下面显示的补丁。但是 offset() 仍然需要补丁,如果您使用 $(window).height() 或 width() 来查找视口的大小,则需要除以比例。
var zoom = (function () {
var scale = 1, recurLev = 0;
function alter(fn, adj) {
var original = $.fn[fn];
$.fn[fn] = function () {
var result;
recurLev += 1;
try {
result = original.apply(this, arguments);
} finally {
recurLev -= 1;
}
if (arguments.length === 0 && recurLev === 0) {
result = adj(result);
}
return result;
};
}
function scalePos(n) { return n / scale; }
/* Not needed since jQuery 3.2.0
alter("width", scalePos);
alter("height", scalePos);
alter("outerWidth", scalePos);
alter("outerHeight", scalePos);
alter("innerWidth", scalePos);
alter("innerHeight", scalePos);
*/
alter("offset", function (o) { o.top /= scale; o.left /= scale; return o; });
return function (s) {
scale = s;
document.body.style.transform = "scale(" + scale + ")";
document.body.style.transformOrigin = "top left";
document.body.style.width = (100 / scale) + "%";
document.body.style.height = (100 / scale) + "%";
};
}());
zoom(1.25);
我发现的唯一其他问题是代码(如拖动和绘图等)使用来自事件的位置,如 mousedown、touchstart、mousemove、touchmove 等。我发现你必须缩放 @987654334 @和pageY除以scale。