@antv/x6 要求不显示水平滚动条,并且如果水平方向上显示不全的节点,则要求自动显示全部节点,垂直方向可以出现滚动条来滚动显示所有的节点。

1、要求一共有二个:

  • 要求一:水平滚动条不显示。之前的文章中就已经发表过,可以用Scroller的className来处理。
  • 要求二:水平方向上显示全部节点,如果有显示不全的节点(即看不到的节点)要求能够显示出来,垂直方向的滚动条可以显示出来,然后用滚动条来滚动显示下面看不到的节点。

2、思路:

graph.use(
      new Scroller({
        enabled: true,
        padding: {
          top: 0,
          right: 0,
          bottom: 0,
          left: 0,
        },
        pageVisible: false,
        pageBreak: false,
        autoResize: true,
        className: 'scrollerCss',
      }),
    );
  • 思路二:水平方向上显示所有节点。

可以通过节点的视口的坐标与容器的宽度进行比较,查看是否已经超过,如果超过,就需要重新处理容器的rect,这样就可以了。

// 自定义函数来检测节点是否完全显示
  function isNodeCompletelyVisible(node) {
    const bbox = node.getBBox(); // 获取节点的包围盒
    // const viewport = graph.getContentArea(); // 获取画布视口
    // console.log(bbox.x, viewport.x, bbox.right, viewport.x + viewport.width);

    // 检查节点的四个角是否都在视口内
    return (
      // bbox.x > viewport.x &&
      // bbox.y > viewport.y &&
      // bbox.right < viewport.x + viewport.width &&
      // bbox.bottom < viewport.y + viewport.height
      // bbox.x > viewport.x && bbox.right > viewport.x + viewport.width
      bbox.x > unref(containerWidth)
    );
  }

注掉的部分是baidu ai生成的代码,实测还是有些问题,与我们项目的要求还是不太相符。

通过实测,发现bbox.x > unref(containerWidth),这样就会返回true,那么我们就要重新设置rect来达到显示所有节点的效果。

const containerWidth = ref(0);
function resizeFitContent() {
    let nodes = graph.getNodes();
    let reqResize = false;
    nodes.forEach((node) => {
      if (!reqResize) {
        reqResize = isNodeCompletelyVisible(node);
      }
    });

    if (reqResize) {
      let rect = graph.getContentArea();
      // console.log(rect.x, rect.y, rect.width, rect.height);
      //下面是我们实测的padding与rect,需要根据自己项目的实际情况进行调整。
      graph.zoomToRect(
        {
          x: rect.x - 10,
          y: rect.y,
          width: rect.width + 20,
          height: viewState.height - 100,
        },
        {
          padding: {
            top: '0px',
            right: '30px',
            bottom: '0px',
            left: '30px',
          },
        },
      );
    }

3、最好上张图,来明确下效果:

一开始只显示了四个节点,然后我们通过检测要不要自动调整以适应画布,然后看到所有的节点。

通过上面的设置,最好我们就可以看到所有的节点,如果屏幕够大,就不需要调整了。

4、上面不仅是一个显示所有节点的实现,也可以理解为适应屏幕大小的方案。

5、因为我们这个是可以显示垂直滚动条,来滚动显示内容的,如果是不匀许,那么我们就得考虑要同时处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值