Размер внешнего объекта SVG не соответствует

Я пытаюсь сделать 2 HTML-объектов в SVG и в дальнейшем использовать их внутри графиков Vis.js. Мой первый svg (кнопка) работает как задумано и выглядит хорошо. Моя проблема заключается в том, что, когда я пытаюсь вставить таблицу div, ширина / высота - это не то, что я им установил.

Вот что я получаю:

Как вы можете видеть, кнопка больше, чем красная коробка, хотя красная коробка имеет большую ширину и высоту (1000px x 800px против 220px x 68px)!

Вот мой JavaScript:

// THE RED BOX
const tableComponent =
`<svg xmlns="http://www.w3.org/2000/svg" width="1000px" height="800px">
<foreignObject x="0" y="0" width="100%" height="100%">
<div xmlns="http://www.w3.org/1999/xhtml" style="height: 100%; width: 100%; background-color: red;">
  <p>Here is a paragraph that requires word wrap</p>
</div>
</foreignObject>
</svg>`;

// THE ORANGE BUTTON
const buttonComponent =
  `<svg xmlns="http://www.w3.org/2000/svg" width="220px" height="68px">
  <foreignObject x="0" y="0" width="100%" height="100%">
  <div xmlns="http://www.w3.org/1999/xhtml" style="height: 100%; width: 100%;">
    <button style="width: 100%; height: 100%; font-size: 20px; color: white; background-color: #FF9700; border-radius: 8px; border: none;">Order Filling</button>
  </div>
  </foreignObject>
  </svg>`;


const tableComponentUrl = "data:image/svg+xml;charset=utf-8," + encodeURIComponent(tableComponent);
const buttonComponentUrl = "data:image/svg+xml;charset=utf-8," + encodeURIComponent(buttonComponent);

const nodes = new DataSet([
  { id: 1, image: buttonComponentUrl, shape: 'image' },
  { id: 2, image: tableComponentUrl, shape: 'image' },
  { id: 3, label: 'Node 3', shape: 'box' }
]);
// create an array with edges
const edges = new DataSet([
  { from: 1, to: 2, arrows: 'to' },
  { from: 1, to: 3, arrows: 'to' }
]);
// create a network
const container = document.querySelector('.data-source-container');
const data = {
  nodes: nodes,
  edges: edges
};
const options = {
  edges: { smooth: false }
};
const network = new Network(container, data, options);

1 ответ

Решение

Ну, SVG - это масштабируемая векторная графика, внутренние размеры не имеют ничего общего с размерами, которые видит пользователь (точнее: x размеры объектов, которые видит пользователь, x_orig*scale где x_orig это размер х внутри SVG и scale фактор, установленный размером x всего элемента SVG).

Другими словами (если предположить, что другие части работают, и если они работают, вы придумали интересный хак для расширения возможностей vis.js по вставке html), вы должны установить размеры ваших изображений. Попробуй использовать size , scale или же shapeProperties.useImageSize в опциях соответствующих узлов. Однако я не вижу возможности настроить соотношение сторон, поэтому для этого может потребоваться дополнительная настройка внутри самого SVG (например, настройка его размеров).

Дайте мне знать, как это происходит, это довольно интересный подход, который у вас есть.

Другие вопросы по тегам