javascript - 在不改变位置的情况下缩放 svg 组

标签 javascript html css svg

我想在悬停时增加元素组的大小。

我使用了 transform: scale() CSS 属性,但是当我悬停对象时,它正在从它的原始位置移动

p {
  font-family: Lato;
}

#stops>g:hover  {
        transform: scale(14);

    cursor: pointer;

}
<svg id="Calque_1" data-name="Calque 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 775.43 469.98">
    <defs>
        <style>.cls-1{fill:none;stroke-width:5px;}.cls-1,.cls-2{stroke:#a15256;}.cls-2{fill:#fff;}.cls-3{isolation:isolate;font-size:42.79px;font-family:ArialMT, Arial;}</style>
    </defs>
    <title>line</title>
    <path id="path7" class="cls-1" d="M202,67.72,329.33,215.86" transform="translate(-200.1 -66.09)" />
    <path id="path8" class="cls-1" d="M329.35,215.87,449,355" transform="translate(-200.1 -66.09)" />
    <path id="path9" class="cls-1" d="M449,355c41.53,51.11,96.22,63.08,117.9,69.28" transform="translate(-200.1 -66.09)" />
    <path id="path10" class="cls-1" d="M566.86,424.29C655.43,460.48,977.38,391.48,973,536" transform="translate(-200.1 -66.09)" />
    <g id="stops">
        <g id="g3670">
            <circle class="cls-2" cx="129.24" cy="149.78" r="13.58" />
            <text id="text3668" class="cls-3" transform="translate(120.84 114.12)">Station1</text>
        </g>
        <g id="g3700">
            <circle class="cls-2" cx="248.91" cy="288.93" r="13.58" />
            <text id="text3698" class="cls-3" transform="translate(284.5 239)">Station2</text>
        </g>
        <g id="g3750">
            <circle class="cls-2" cx="366.75" cy="358.2" r="13.58" />
            <text id="text3748" class="cls-3" transform="translate(134.96 379.59)">Station3</text>
        </g>
    </g>
</svg>

预期行为

我想在不改变位置的情况下增加文本大小和站圈(并填充它)。

这可以用 css 来完成,但是如果我可以推荐库,因为我会在地铁线路(火车循环)上制作动画,那就太好了

最佳答案

在下一个演示中,我将从文本中删除转换并添加 xy属性。当您将鼠标悬停在圆上时,就会发生转换。为了也转换文本,我使用了这个选择器:#stops g circle:hover + text

或者,您可以更改字体大小而不是转换文本。

text{
  font-family: Lato;
  font-size:16px;
}

#stops g circle:hover  {
    transform: scale(2);
    transform-origin: 50% 50%;
    transform-box: fill-box;
    cursor: pointer;
}

#stops g circle:hover + text{
    transform: scale(2);
    transform-origin: 0% 50%;
    transform-box: fill-box;
    cursor: pointer;
    pointer-events:none;
}
<svg id="Calque_1" data-name="Calque 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 775.43 469.98">
    <defs>
        <style>.cls-1{fill:none;stroke-width:5px;}.cls-1,.cls-2{stroke:#a15256;}.cls-2{fill:#fff;}.cls-3{isolation:isolate;font-size:42.79px;font-family:ArialMT, Arial;}</style>
    </defs>
    <title>line</title>
    <path id="path7" class="cls-1" d="M202,67.72,329.33,215.86" transform="translate(-200.1 -66.09)" />
    <path id="path8" class="cls-1" d="M329.35,215.87,449,355" transform="translate(-200.1 -66.09)" />
    <path id="path9" class="cls-1" d="M449,355c41.53,51.11,96.22,63.08,117.9,69.28" transform="translate(-200.1 -66.09)" />
    <path id="path10" class="cls-1" d="M566.86,424.29C655.43,460.48,977.38,391.48,973,536" transform="translate(-200.1 -66.09)" />
    <g id="stops">
        <g id="g3670">
            <circle class="cls-2" cx="129.24" cy="149.78" r="13.58" />
            <text id="text3668" class="cls-3" x="145" y="149.78" >Station1</text>
        </g>
        <g id="g3700">
            <circle class="cls-2" cx="248.91" cy="288.93" r="13.58" />
            <text id="text3698" class="cls-3"  x="270" y="288.93">Station2</text>
        </g>
        <g id="g3750">
            <circle class="cls-2" cx="366.75" cy="358.2" r="13.58" />
            <text id="text3748" class="cls-3" x="385" y="358.2">Station3</text>
        </g>
    </g>
</svg>

OP 评论说

The hover should be on g g:hover not g circle:hover

在本例中,我向 g 元素添加了一个矩形。矩形与 g 的边界框一样大。 g 元素中除 rect 之外的所有元素都有 pointer-events:none .变换发生在圆心周围。

text{
  font-family: Lato;
  font-size:16px;
}
g * {pointer-events:none;}
g rect{pointer-events:all;}
#stops g{transform: scale(1);}
#stops g:hover {
    transform: scale(2);
    transform-origin: 129.24px 149.78px;
    cursor: pointer;
}
<svg id="Calque_1" data-name="Calque 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 775.43 469.98">
    <defs>
        <style>.cls-1{fill:none;stroke-width:5px;}.cls-1,.cls-2{stroke:#a15256;}.cls-2{fill:#fff;}.cls-3{isolation:isolate;font-size:42.79px;font-family:ArialMT, Arial;}</style>
    </defs>
    <title>line</title>
    <path id="path7" class="cls-1" d="M202,67.72,329.33,215.86" transform="translate(-200.1 -66.09)" />
    <path id="path8" class="cls-1" d="M329.35,215.87,449,355" transform="translate(-200.1 -66.09)" />
    <path id="path9" class="cls-1" d="M449,355c41.53,51.11,96.22,63.08,117.9,69.28" transform="translate(-200.1 -66.09)" />
    <path id="path10" class="cls-1" d="M566.86,424.29C655.43,460.48,977.38,391.48,973,536" transform="translate(-200.1 -66.09)" />
    <g id="stops">
        <g id="g3670">
            <rect x="115" y="110" width="187" height="52" fill="none" />
            <circle class="cls-2" cx="129.24" cy="149.78" r="13.58" />
            <text id="text3668" class="cls-3" x="145" y="149.78" >Station1</text>
        </g>
        
    </g>
</svg>

为了计算<g>的边界框你可以使用 javascript 和方法 getBBox() .

为了更好地理解发生了什么,请在 <rect> 中添加一个填充

如果这是您想要的,您可以保留文本转换。

更新 2

OP 正在评论:

Can you make an example with three dots please ?

接下来是示例。在这种情况下,我使用 Javascript 来设置矩形的大小和 transform-origin 的值。每个组的。如果您只需要标记,您可以从检查器中复制它。 由于 OP 评论说他们希望在此示例中保留文本转换,因此文本保留转换而不是 xy属性。

let stops = document.querySelector("#stops");
// all the g elements in the stops 
let gs = stops.querySelectorAll("g");

// for each g in the gs
gs.forEach(g=>{
  // the rectangle in this g element
  let thisRect = g.querySelector("rect");
  // the circle in this g element
  let thisCircle = g.querySelector("circle");
  // the coords of the circle's center used for the transform-origin
  let x = thisCircle.getAttribute("cx");
  let y = thisCircle.getAttribute("cy");
  // the bounding box of the group
  let bb = g.getBBox();
  // set the rect's attributes
  thisRect.setAttributeNS(null, "x", bb.x);
  thisRect.setAttributeNS(null, "y", bb.y);
  thisRect.setAttributeNS(null, "width", bb.width);
  thisRect.setAttributeNS(null, "height", bb.height);
  
  // set the value for the transform-origin for this group
  g.style.transformOrigin =  `${x}px ${y}px`;
  
})
text{
  font-family: Lato;
  font-size:16px;
}
g * {pointer-events:none;}
g rect{pointer-events:all;}
#stops g{transform: scale(1);cursor: pointer;}
#stops g:hover {
    transform: scale(2); 
}
<svg id="Calque_1" data-name="Calque 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 775.43 469.98">
    <defs>
        <style>.cls-1{fill:none;stroke-width:5px;}.cls-1,.cls-2{stroke:#a15256;}.cls-2{fill:#fff;}.cls-3{isolation:isolate;font-size:42.79px;font-family:ArialMT, Arial;}</style>
    </defs>
    <title>line</title>
    <path id="path7" class="cls-1" d="M202,67.72,329.33,215.86" transform="translate(-200.1 -66.09)" />
    <path id="path8" class="cls-1" d="M329.35,215.87,449,355" transform="translate(-200.1 -66.09)" />
    <path id="path9" class="cls-1" d="M449,355c41.53,51.11,96.22,63.08,117.9,69.28" transform="translate(-200.1 -66.09)" />
    <path id="path10" class="cls-1" d="M566.86,424.29C655.43,460.48,977.38,391.48,973,536" transform="translate(-200.1 -66.09)" />
    <g id="stops">
        <g id="g3670">
            <rect fill="none"/>
            <circle class="cls-2" cx="129.24" cy="149.78" r="13.58" />
            <text id="text3668" class="cls-3" transform="translate(145 160)">Station1</text>
        </g>
        <g id="g3700">
            <rect fill="none"/>
            <circle class="cls-2" cx="248.91" cy="288.93" r="13.58" />
            <text id="text3698" class="cls-3" transform="translate(270 300)">Station2</text>
        </g>
        <g id="g3750">
            <rect fill="none"/>
            <circle class="cls-2" cx="366.75" cy="358.2" r="13.58" />
            <text id="text3748" class="cls-3" transform="translate(200 400)">Station3</text>
        </g>
    </g>
</svg>

关于javascript - 在不改变位置的情况下缩放 svg 组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56904649/

相关文章:

javascript - 在 jQuery 中从最高到最低的每个元素中添加数据属性

html - 使用css设置背景图片

javascript - 在 div 中定位表格

javascript - 如何从angularjs中的对象中删除空键?

javascript - 用户提交位置后重新居中 Google map

javascript - D3 V4 旭日图布局圆弧计算

html - 如何在 phonegap 中使用 css 添加背景图像

javascript - 制作固定的右侧导航栏

javascript - 如果 NODE 代理未运行,则阻止渲染 ANGULAR 页面

c# - 向 HTML 表格的奇数行添加备用背景样式