如何使Cytoscape.js画布尊重其父级的位置

时间:2019-04-03 11:23:42

标签: javascript css reactjs cytoscape.js

我有一个React组件,一旦从服务器获取了一些数据,便会呈现Cytoscape dagre图。似乎渲染了一块占父<div id="cy" />右半部分的画布。调用cy.center()cy.fit()会使图形本身居中并使之适合父div,但是由于包含的画布不在屏幕的一半,因此只显示了一半的可视化效果。

设置以下CSS:

position: absolute;
left: 0;
right: 0;

与所有在线示例一样,容器上的

将使画布居中,但会中断文档流。它还不能解决一半尺寸的问题。

JSX:

  if (moduleStructure) {
    return (
      <div
        id="cy-module-structure"
        style={{
          position: "absolute",
          left: 0,
          top: 0,
          height: "500px",
          width: "1500px",
          display: "block",
        }}
      />
    );
  }

图形生成代码。在获取数据后,这由React挂钩调用。

  function generateGraph(nodes, edges) {
    cytoscape.use(dagre);
    const cy = cytoscape({
      container: document.getElementById("cy-module-structure"),
      boxSelectionEnabled: false,
      autounselectify: true,
      layout: {
        name: "dagre",
        nodeDimensionsIncludeLabels: true,
      },
      zoom: 1,
      pan: { x: 0, y: 0 },
      style: [
        {
          selector: "node",
          style: {
            content: "data(label)",
            "text-valign": "center",
            "text-halign": "center",
            "background-color": "#11479e",
          },
        },
        {
          selector: "edge",
          style: {
            width: 4,
            "target-arrow-shape": "triangle",
            "line-color": "#9dbaea",
            "target-arrow-color": "#9dbaea",
            "curve-style": "bezier",
          },
        },
      ],
      elements: {
        nodes,
        edges,
      },
    });

    cy.ready(() => {
      cy.center();
      cy.fit();
      cy.resize();
    });
  }

最后是父级JSX:

      <div className="top-flex"> // flex-direction: row: 
        <Diagram /> // Cytoscape component
        <div className="basic-info">
          <H3>TEXT</H3>
          <small>INFO</small>
        </div>
      </div>

理想情况下,图形应占据父div的整个宽度。在屏幕截图中,您可以看到上述效果。

Desired result

2 个答案:

答案 0 :(得分:0)

(1)调整大小和适合的顺序相反。如果您以后要调整大小,那么放宽就没有意义。拟合发生在可用边界上。

(2)确保仅在componentDidMount()之后挂载Cytoscape。

(3)container必须类似于position:relativeposition:absolute(绝对不是position:static),这样container的子对象可以相对放置到container。 Cytoscape.js将默认设置position:relative,因此除非您将其覆盖,否则它会被明智地设置。

答案 1 :(得分:0)

问题是应用了更高级别的样式text-align: center。删除它应该正确对齐。