Cytoscape.js 警告:"The style value of `label` is deprecated for `width`" 试图让节点具有相同的标签宽度时
Cytoscape.js warning: "The style value of `label` is deprecated for `width`" when trying to have a node with same width of label
我正在使用 Cytoscape.js to render a dagre layout 图表。
在设置 节点 样式时,我使用 属性 width: label
,如您在以下代码中所见:
const cy = cytoscape({
container: document.getElementById('cyGraph'),
maxZoom: 3,
minZoom: 0.3,
elements: dataForCytoscape,
style: [
{
selector: 'node',
style: {
'shape': 'round-rectangle',
'background-color': '#fff',
'label': 'data(name)',
'text-valign': 'center',
'color': '#333333',
'border-width': 1,
'border-color': '#2E1A61',
'width': 'label',
'font-size': '10px',
"padding-left": '5px',
"padding-right": '5px',
"padding-top": '5px',
"padding-bottom": '5px'
}
},
{
selector: 'edge',
style: {
...
}
}
],
layout: {
name: 'dagre'
}
});
代码正常工作,nodes 获得与内部 labels 相同的宽度,但我收到以下 warning 在控制台中:
The style value of `label` is deprecated for `width`
问题:有没有其他方法可以让Cytoscapenodes的宽度和里面的label?
一样
经过一番测试,我自己找到了解决方案:我决定从data(name)
字段开始计算width
。
因此,我将 'width': 'label'
更改为以下 arrow function:
'width': (node:any) => { return node.data('name').length * 7 }
如您所见,我使用标签字符串的 length
(将包含 name
字段)并将其乘以常数(我从 10
但后来我意识到 7
是最好的 就我而言 ).
这样,我没有任何警告并且图形节点 适合 标签 (name
) 宽度。
另一种解决方案是 canbax 在对我的问题的评论中提出的解决方案:
You can set a dynamic width using data properties. For example
'width': 'data(label_width)' Here every node should have a data
property called label_width
我想起了另一种方法。这里可以动态生成一个canvas元素并设置字体然后测量文字。
'width': (node) => {
const ctx = document.createElement('canvas').getContext("2d");
const fStyle = node.pstyle('font-style').strValue;
const size = node.pstyle('font-size').pfValue + 'px';
const family = node.pstyle('font-family').strValue;
const weight = node.pstyle('font-weight').strValue;
ctx.font = fStyle + ' ' + weight + ' ' + size + ' ' + family;
return ctx.measureText(node.data('name'));
}
这种方法可能成本更高,但它可能会为您提供更准确的测量结果
我正在使用 Cytoscape.js to render a dagre layout 图表。
在设置 节点 样式时,我使用 属性 width: label
,如您在以下代码中所见:
const cy = cytoscape({
container: document.getElementById('cyGraph'),
maxZoom: 3,
minZoom: 0.3,
elements: dataForCytoscape,
style: [
{
selector: 'node',
style: {
'shape': 'round-rectangle',
'background-color': '#fff',
'label': 'data(name)',
'text-valign': 'center',
'color': '#333333',
'border-width': 1,
'border-color': '#2E1A61',
'width': 'label',
'font-size': '10px',
"padding-left": '5px',
"padding-right": '5px',
"padding-top": '5px',
"padding-bottom": '5px'
}
},
{
selector: 'edge',
style: {
...
}
}
],
layout: {
name: 'dagre'
}
});
代码正常工作,nodes 获得与内部 labels 相同的宽度,但我收到以下 warning 在控制台中:
The style value of `label` is deprecated for `width`
问题:有没有其他方法可以让Cytoscapenodes的宽度和里面的label?
一样经过一番测试,我自己找到了解决方案:我决定从data(name)
字段开始计算width
。
因此,我将 'width': 'label'
更改为以下 arrow function:
'width': (node:any) => { return node.data('name').length * 7 }
如您所见,我使用标签字符串的 length
(将包含 name
字段)并将其乘以常数(我从 10
但后来我意识到 7
是最好的 就我而言 ).
这样,我没有任何警告并且图形节点 适合 标签 (name
) 宽度。
另一种解决方案是 canbax 在对我的问题的评论中提出的解决方案:
You can set a dynamic width using data properties. For example 'width': 'data(label_width)' Here every node should have a data property called label_width
我想起了另一种方法。这里可以动态生成一个canvas元素并设置字体然后测量文字。
'width': (node) => {
const ctx = document.createElement('canvas').getContext("2d");
const fStyle = node.pstyle('font-style').strValue;
const size = node.pstyle('font-size').pfValue + 'px';
const family = node.pstyle('font-family').strValue;
const weight = node.pstyle('font-weight').strValue;
ctx.font = fStyle + ' ' + weight + ' ' + size + ' ' + family;
return ctx.measureText(node.data('name'));
}
这种方法可能成本更高,但它可能会为您提供更准确的测量结果