Unexpected/Incorrect 变换的缩放大小:缩放“缩放时 in/out chrome 浏览器
Unexpected/Incorrect scale size for transform: scale" when zoom in/out chrome browser
Webkit 浏览器(即 Chrome、Safari 中会出现不正确的缩放大小。 Chrome我用的版本是68.
演示:Codepen Link
@Kaiido 要求的代码
HTML:
<div class="test1"></div>
<div class="test2"></div>
CSS:
.test1 {
z-index: 100;
position: fixed;
top: 10px;
left: 10px;
width: 1px;
height: 1px;
background: blue;
transform-origin: top left;
transform: scale(100, 100);
}
.test2 {
position: absolute;
top: 0;
left: 0;
width: 100px;
height: 100px;
background: red;
}
在上面的 link 中,如果您缩放 chrome 的 in/out,您会看到比例大小不一定与 .test2
的固定大小相匹配 div。我希望 scale(100, 100)
的最终大小在缩放时与带有 width:100px; height: 100px
的大小完全相同,但显然情况并非如此。
我也在视网膜 mac 和电脑上测试过这个。这与 Chrome 中的行为相同。但是相同的代码在 Firefox 中进行了测试并且工作正常。
这是某种错误还是我遗漏了什么?谢谢。
这是一个错误...由于这些浏览器舍入坐标以避免抗锯齿而导致的。
因此,当您将缩放级别设置为 120% 时,小方块实际上应该渲染为 1.2px*1.2px 方块先验变换。
但是 webkit 浏览器会将此值四舍五入为 1px,甚至在应用转换之前(我认为 FF 也会这样做,但可能在转换之后)。
因此,在缩放到 150% 之前,您不会看到任何变化,现在它将四舍五入为 2px,并且您的蓝色方块将变得比相同的 100px*100px 更大。
只有在 200% 时它们才会再次匹配。
除了让他们知道并避免使用如此小的元素外,没有什么可以避免的;-)(使用 10px*10px 正方形并将变换缩放级别除以 10 可以防止此错误)。
在手机上发现了类似的情况Chrome。在 ~100px 结果变得完全错误后,通过 CSS 变换将 1px 值缩放到某个宽度,并随着继续变得更糟。在我的例子中,这是一个基于 js 的范围控件,我通过转换将其 'progress' 视觉部分从 1px(基础)缩放到当前用户 touchX 位置:scaleX(touchX);
我对问题的看法是基于对 CSS 单位评估 (https://webplatform.github.io/docs/tutorials/understanding-css-units/) 的理解:在具有小数 window.devicePixelRatio 的屏幕上有一种用于抗锯齿的热切整数方程。 Android 通常有 2.3、2.6 DPR,当用户更改显示器的缩放系统设置时它可能会改变。
我的解决方案涉及 javascript,因此可能不适合您,但仍然可能有用:
fixedWidth = (devicePixelRatio * originalWidth) / Math.round(devicePixelRatio);
Webkit 浏览器(即 Chrome、Safari 中会出现不正确的缩放大小。 Chrome我用的版本是68.
演示:Codepen Link
@Kaiido 要求的代码
HTML:
<div class="test1"></div>
<div class="test2"></div>
CSS:
.test1 {
z-index: 100;
position: fixed;
top: 10px;
left: 10px;
width: 1px;
height: 1px;
background: blue;
transform-origin: top left;
transform: scale(100, 100);
}
.test2 {
position: absolute;
top: 0;
left: 0;
width: 100px;
height: 100px;
background: red;
}
在上面的 link 中,如果您缩放 chrome 的 in/out,您会看到比例大小不一定与 .test2
的固定大小相匹配 div。我希望 scale(100, 100)
的最终大小在缩放时与带有 width:100px; height: 100px
的大小完全相同,但显然情况并非如此。
我也在视网膜 mac 和电脑上测试过这个。这与 Chrome 中的行为相同。但是相同的代码在 Firefox 中进行了测试并且工作正常。
这是某种错误还是我遗漏了什么?谢谢。
这是一个错误...由于这些浏览器舍入坐标以避免抗锯齿而导致的。
因此,当您将缩放级别设置为 120% 时,小方块实际上应该渲染为 1.2px*1.2px 方块先验变换。
但是 webkit 浏览器会将此值四舍五入为 1px,甚至在应用转换之前(我认为 FF 也会这样做,但可能在转换之后)。
因此,在缩放到 150% 之前,您不会看到任何变化,现在它将四舍五入为 2px,并且您的蓝色方块将变得比相同的 100px*100px 更大。
只有在 200% 时它们才会再次匹配。
除了让他们知道并避免使用如此小的元素外,没有什么可以避免的;-)(使用 10px*10px 正方形并将变换缩放级别除以 10 可以防止此错误)。
在手机上发现了类似的情况Chrome。在 ~100px 结果变得完全错误后,通过 CSS 变换将 1px 值缩放到某个宽度,并随着继续变得更糟。在我的例子中,这是一个基于 js 的范围控件,我通过转换将其 'progress' 视觉部分从 1px(基础)缩放到当前用户 touchX 位置:scaleX(touchX);
我对问题的看法是基于对 CSS 单位评估 (https://webplatform.github.io/docs/tutorials/understanding-css-units/) 的理解:在具有小数 window.devicePixelRatio 的屏幕上有一种用于抗锯齿的热切整数方程。 Android 通常有 2.3、2.6 DPR,当用户更改显示器的缩放系统设置时它可能会改变。
我的解决方案涉及 javascript,因此可能不适合您,但仍然可能有用:
fixedWidth = (devicePixelRatio * originalWidth) / Math.round(devicePixelRatio);