【问题标题】:Scaling SVG country map relative to the selected district center相对于所选地区中心缩放 SVG 国家地图
【发布时间】:2016-04-16 23:53:30
【问题描述】:

我有一张 svg 国家地图,当您单击一个地区然后看到相对于所选地区的动画缩放时,我正在尝试实现效果,即在单击的地区中心使用transform-origin 点进行缩放。而且我希望不要使用任何库

  1. 首先,为什么here,当我们设置了svgviewBox 属性时,polygons 用getBoundingClientRect() 绘制的点与它们的实际元素不匹配svgmap、@ 987654331@?
  2. 如果我们添加一些系数,例如here,那么我们需要什么viewBoxMapCoefX1viewBoxMapCoefX1,以便使用getBoundingClientRect() 点绘制的mapPolygon 匹配实际的map 元素?
  3. 当我尝试通过添加来扩展 map 时:

    // ANIMATION HERE
    map.style.transformOrigin = transformOriginX + "px " + transformOriginY + "px";
    map.style.transform = "scale(" + scale + ")";

    看起来transformOrigin 的值是错误的。如果我尝试通过添加更改viewBox 值:

    // ANIMATION HERE
    svg.viewBox.baseVal.x = bounding.left;
    svg.viewBox.baseVal.y = bounding.top;
    svg.viewBox.baseVal.width = bounding.width;
    svg.viewBox.baseVal.height = bounding.height;

    那么如何使用 CSS 制作缩放动画(no SMIL)?

非常感谢您对此提供任何帮助或建议。

【问题讨论】:

标签: javascript html css animation svg


【解决方案1】:

1) 您应该使用 .getBBox() 而不是 BoundingClientRect 来获取坐标,因为这将基于 SVG 本身而不是屏幕。

3) 您正在将变换应用到组标签,而将这些变换应用到 SVG 元素本身是有意义的。您可能已经尝试过,但是变换原点值将全部基于您之前获得的坐标?只要动画按预期工作,就我所见,动画正面没有问题。

// ANIMATION HERE
var svg = document.querySelector("svg");
svg.style.transformOrigin = '50% 50%';
svg.style.transform = 'scale(4)';

【讨论】:

  • 1. .getBBox() 成功了,谢谢!有没有关于这个方法的caniuse信息?
  • 3.恐怕我不是很清楚你。我已经用.getBBox() 更新了fiddle 并用svg.style.* 进行了缩放,但我仍然遇到左侧小区域的缩放问题。
  • @smorkiri 为什么要根据地区动态计算规模?您想要针对不同地区进行不同级别的缩放吗?
【解决方案2】:

感谢@OwenAyres's answer 1 部分问题已解决。

我们可以在px% insted 中找到map 直接相对于所选区域中心进行缩放,然后将区域中心移动到map 的中心,然后进行缩放:

// ANIMATION HERE
var transformOriginXPercent = (50 - transformOriginX * 100 / mapBounding.width) * scale;
var transformOriginYPercent = (50 - transformOriginY * 100 / mapBounding.height) * scale;
var scaleText = "scale(" + scale + ")";
var translateText = "translate(" + transformOriginXPercent + "%," + transformOriginYPercent + "%)";

map.style.transformOrigin = "50% 50%";
map.style.transform = translateText + " " + scaleText;

并获取expected result

但仍然存在一个问题,transformOriginXtransformOriginY 的哪些系数是正确的才能得到以下形式的结果:

map.style.transformOrigin = (transformOriginX) + "px " + (transformOriginY) + "px";
map.style.transform = "scale(" + scale + ")";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多