问题描述
当包含 createjs 的画布使用 zoom
样式(例如 zoom: 0.5
)缩放时,画布上的按钮具有不同的点击目标,该目标仅在按钮的一侧或没有目标完全没有。
var stage,label;
function init() {
stage = new createjs.Stage("demoCanvas");
stage.name = "stage";
var background = new createjs.Shape();
background.name = "background";
background.graphics.beginFill("red").drawRoundRect(0,150,60,10);
label = new createjs.Text("foo","bold 24px Arial","#FFFFFF");
label.name = "label";
label.textAlign = "center";
label.textBaseline = "middle";
label.x = 150/2;
label.y = 60/2;
var button = new createjs.Container();
button.name = "button";
button.x = 75;
button.y = 40;
button.addChild(background,label);
stage.addChild(button);
// listeners
var targets = [stage,button,label,background];
for (var i=0; i<targets.length; i++) {
var target = targets[i];
target.on("click",toggleText,null,false,false);
}
stage.update();
}
function toggleText(evt) {
label.text = (label.text == 'foo') ? 'bar' : 'foo';
stage.update();
}
body{
margin: 0;
text-align: center;
}
#demoCanvas{
background: tan;
width: 500px;
height: 300px;
transform-origin: 0 0;
transform: scale(0.2); // Firefox = This does not cause problem with button clicking
zoom: 0.2; // Other browsers = This causes a problem with button clicking in Chrome
}
<html>
<head>
<script src="https://code.createjs.com/easeljs-0.8.2.min.js"></script>
</head>
<body onload="init();">
<canvas id="demoCanvas"></canvas>
</body>
</html>
请注意,这不会在 SO 片段中失败,因此我也制作了此 available as a Pen。
此行为会出现在 Chrome 中,但不会出现在 Firefox 中(它会识别 transform: scale()
样式)。
如果画布需要在 DOM 中缩放,如何在 Chrome 中完成而不导致按钮失败?
解决方法
缩放 css 样式被认为是非标准的,因此对于 Chrome 和其他浏览器,您也可以使用 transform : scale() 。我可以确认 zoom 确实破坏了 CreateJS - 如果你愿意,你可以向他们的 EaselJS GitHub 添加一个问题 - 不确定在可以使用 transform : scale() 时是否值得修复。干杯。
CSS 缩放:“非标准 此功能是非标准的,不在标准轨道上。不要在面向 Web 的生产站点上使用它:它不适用于每个用户。实现之间也可能存在很大的不兼容性,未来行为可能会发生变化。”