javascript - 节点的背景图像样式不适用于 SVG 图像

标签 javascript cytoscape.js

当我将节点背景图像设置为 SVG 文件时,放大/缩小会更改背景图像。这会产生丑陋的视觉效果。 PNG 没有这个问题。

这是一个具有SVG背景的节点image initially fine

这是我放大时的同一个节点。您可以看到图像也放大了 image when I zoomed in

最佳答案

这是一个可运行的代码,用于演示如何使用 background-image 与 SVG 图形。 SVG 代码在使用前必须进行适当编码。尝试运行下面的代码,然后放大和缩小(按控制键并使用鼠标滚轮)。 SVG 图形将随节点正确缩放。

const svg_pin =
  '<svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M12,11.5A2.5,2.5 0 0,1 9.5,9A2.5,2.5 0 0,1 12,6.5A2.5,2.5 0 0,1 14.5,9A2.5,2.5 0 0,1 12,11.5M12,2A7,7 0 0,0 5,9C5,14.25 12,22 12,22C12,22 19,14.25 19,9A7,7 0 0,0 12,2Z" fill="yellow"></path></svg>';

const svgpin_Url = encodeURI("data:image/svg+xml;utf-8," + svg_pin);


var cy = cytoscape({
  container: document.getElementById("cy"),

  elements: {
    nodes: [{
        data: {
          id: "j",
          name: "John"
        },
        position: {
          x: 100,
          y: 100
        }
      },
      {
        data: {
          id: "e",
          name: "Elena"
        },
        position: {
          x: 100,
          y: 500
        }
      },
      {
        data: {
          id: "k",
          name: "Kim"
        },
        position: {
          x: 600,
          y: 500
        }
      },
      {
        data: {
          id: "g",
          name: "Gordon"
        },
        position: {
          x: 550,
          y: 80
        }
      }
    ],

    edges: [{
        data: {
          source: "j",
          target: "e",
          label: "JE"
        }
      },
      {
        data: {
          source: "j",
          target: "g",
          label: "JG"
        }
      },
      {
        data: {
          source: "e",
          target: "j"
        }
      },
      {
        data: {
          source: "k",
          target: "j"
        }
      },
      {
        data: {
          source: "k",
          target: "e",
          label: "KE"
        }
      },
      {
        data: {
          source: "k",
          target: "g"
        }
      },
      {
        data: {
          source: "g",
          target: "j"
        }
      }
    ]
  },

  style: [{
      selector: "node",
      style: {
        shape: "hexagon",
        "background-color": "blue",
        "background-image": svgpin_Url,
        label: "data(name)",
        opacity: 0.55
      }
    },
    {
      selector: "edge",
      style: {
        label: "data(label)",
        width: 3,
        "line-color": "#c0c",
        "target-arrow-color": "#00c",
        "curve-style": "bezier",
        "target-arrow-shape": "triangle",
        "target-arrow-fill": "#c00",
        "arrow-scale": 20
      }
    },
    {
      selector: ".highlight",
      css: {
        "background-color": "yellow"
      }
    }
  ],
  layout: {
    name: "preset"
  }
});
#cy {
  width: 100%;
  height: 80%;
  position: absolute;
  top: 10px;
  left: 10px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/cytoscape/2.7.10/cytoscape.min.js"></script>
<div id="cy"></div>

关于javascript - 节点的背景图像样式不适用于 SVG 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57090814/

相关文章:

javascript - 如何使用 javascript 回调函数检测文本区域中的 url?

javascript - cytoscape.js webgl 渲染器

javascript - 使用 Cytoscape JS 突出显示边缘不起作用

javascript - 为什么 "ended"音频html5事件多次触发?

javascript - JSONP使用JQuery从HTTPS协议(protocol)中获取JSON

javascript - 无法正确将外部 JS 导入 Aurelia 应用程序(数据表)

javascript - 嵌套数组问题

javascript - (Node.js/Express) 将数据从 Controller 发送到 pug View 然后由 Javascript 处理的最佳实践

javascript - Cytoscape.js 中的字体大小问题

javascript - Cytoscape.js 复合子节点 addClass 不显示样式