Skip to content

1. 主题切换

系统自带了两套主题: 明亮(DefaultLight) 和 暗色(DefaultDark)
js

// 使用样式系统
let styleSystem = stage.styleSystem;

// 切换到 ‘明亮’ 主题(默认生效的主题)
styleSystem.setTheme('DefaultLight');

// 切换到 ‘暗色’ 主题
styleSystem.setTheme('DefaultDark');

2. 定义样式类

styleSystem的 defClass() 方法可以定义样式类, 类似css的样式类,如下:

规则是 "." 开头, 例如: ".active"、".myStyle"。
js

// 使用样式系统
let styleSystem = stage.styleSystem;

// 定义一个类似‘玻璃’的样式
styleSystem.defClass('.glass', {
    // 边框
    borderColor: '#F0F0F0',
    borderRadius: 5,
    borderWidth: 1,

    // 边框与里面图形的内间距
    padding: 8,

    // 背景颜色
    backgroundColor: 'rgba(128,128,128,0.2)',

    // 图形绘制参数
    lineWidth: 1,
    strokeStyle: 'gray',

    // 字体大小
    fontSize: '12px',
});

// 使用上面定义好的样式
node.addClass('.glass');
link.addClass('.glass');

// 移除
node.removeClass('.glass');

3. css()方法设置样式

使用css()方法, 可以直接修改某个图元的样式:
js
node.css({
    fillStyle: 'blue',
    lineWidth: 2,
    //...
});

4. 样式优先级

将jtopo的样式系统看做三层堆叠的结构。

优先级从低到为高:1. setTheme() 2. addClass() 3. css()
1. addClass() 里的定义优先级永远高于 setTheme() 主题中的设置。
2. css() 里的定义优先级永远高于 addClass() 的样式设置。
3. 样式发生覆盖时,优先级最高的生效, 与设置的 **先后顺序无关**。
应尽量使用 addClass()的方式,比较灵活。
demo中经常使用css() 是因为代码少且简单,实际生产中应多用 addClass()方式.

4.1. Node对象:

样式大部分属性命名和效果基本上都遵循了 Html5-CSS 和 Cavnas绘图属性定义:

1. 边框和背景的设置遵循 Html5-CSS,例如:
js
// 节点边框 和 背景
node.css({
    border:'1px solid gray',
    backgroundColor: 'green',
});
1. 内部的线条和图形填充等属性遵循 Canvas绘图定义,例如:
js

// 节点内部图形的填充 和 线条, setStyles和css功能完全等价,只是语义上做了区分:
node.setStyles({
    strokeStyle: 'red',
    fillStyle:'orange',
    lineWidth: 3
});

4.2. Link对象:

1. 统一遵循Cavnas绘图定义, 例如:
js
// 线条颜色 和 宽度
link.setStyles({
    strokeStyle: 'red',
    lineWidth: 3,
    lineDash: [5, 2]
});

Link对象没有边框和背景.

5. 更多示例

js

// 可以用类似css语法设置更多属性, 涉及语法详细可以参考CSS相关教程。
circleNode.css({
    // 边框
    borderWidth: 10,

    // 边框颜色
    borderColor: '#808080',

    // 图形填充颜色
    fillStyle: 'rgba(0,0,255,0.2)',

    // 背景颜色
    backgroundColor: 'rgba(0,128,0,0.5)',

    // 圆角, 流行的浏览器也支持数组: [5, 0, 5, 0], 可以给每一个角设置不同弧度
    borderRadius: 5,

    // 字体样式 字体大小 字体名称
    font: 'bold 11px sans-serif',

    // 文字颜色
    color: 'gray',

    // 文字在节点上的位置
    textPosition: 'center',

    // 文字左右对齐方式(水平方向)
    textAlign: 'center',    // 左右居中

    // 文字基线(垂直方向)
    textBaseline: 'middle'
});

6. 节点样式图解:


可以将图片单独打开放大查看.

7. 自定义主题

最低要求: 2.4.0 版本
js

// 基于默认主题('DefaultLight'),定义一个新的主题名字叫: MyTheme
let myTheme = stage.styleSystem.defTheme('DefaultLight', 'MyTheme');

// 查看定义
console.log(myTheme.getStyle('Layer'));
console.log(myTheme.getStyle('Node'));

// 自定义背景颜色 替换掉默认的背景网格
myTheme.setStyle('Layer', {
    background: '#efefef'
});
// 修改部分定义
myTheme.setStyle('Node', {
    borderColor: 'gray',
    borderWidth: 9,
    borderRadius: 3,
    backgroundColor: 'black',
    color: 'white',
    textPosition: 'center',
    textBaseline: 'middle',
});
myTheme.setStyle('Link', {
    strokeStyle: 'black',
    lineWidth: 3,
});

// Link上的标签
myTheme.setStyle('LinkLabel', {
    fontSize: '12px',
    fontWeight: 'bold italic',
    color: 'brown',
});

// Link上的箭头
myTheme.setStyle('LinkArrow', {
    fontSize: '12px',
    fontWeight: 'bold italic',
    color: 'brown',
});



// 应用
stage.styleSystem.setTheme('MyTheme');