官方示例

cy.cxtmenu({
selector: 'node, edge',
commands: [
{
content: '<span class="fa fa-flash fa-2x"></span>',
select: function(ele){
console.log( ele.id() );
}
},
{
content: '<span class="fa fa-star fa-2x"></span>',
select: function(ele){
console.log( ele.data('name') );
},
enabled: false
},
{
content: 'Text',
select: function(ele){
console.log( ele.position() );
}
}
]
});

cy.cxtmenu({
selector: 'core',
commands: [
{
content: 'bg1',
select: function(){
console.log( 'bg1' );
}
},
{
content: 'bg2',
select: function(){
console.log( 'bg2' );
}
}
]
});
});
完整示例代码
<!DOCTYPE html>
<html>
<head>
<title>cytoscape-cxtmenu.js demo</title>
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, maximum-scale=1">
<link href="https://unpkg.com/font-awesome@4.7.0/css/font-awesome.min.css" rel="stylesheet" type="text/css" />
<script src="https://unpkg.com/cytoscape/dist/cytoscape.min.js"></script>
<!-- for testing with local version of cytoscape.js -->
<!--<script src="../cytoscape.js/build/cytoscape.js"></script>-->
<script src="cytoscape-cxtmenu.js"></script>
<style>
body {
font-family: helvetica;
font-size: 14px;
overflow: hidden;
}
#cy {
width: 100%;
height: 100%;
position: absolute;
left: 0;
top: 0;
z-index: 999;
}
h1 {
opacity: 0.5;
font-size: 1em;
}
.cxtmenu-disabled {
opacity: 0.333;
}
</style>
<script>
window.addEventListener('DOMContentLoaded', function(){
var cy = window.cy = cytoscape({
container: document.getElementById('cy'),
ready: function(){
},
style: [
{
selector: 'node',
css: {
'content': 'data(name)'
}
},
{
selector: 'edge',
css: {
'curve-style': 'bezier',
'target-arrow-shape': 'triangle'
}
}
],
elements: {
nodes: [
{ data: { id: 'j', name: 'Jerry' } },
{ data: { id: 'e', name: 'Elaine' } },
{ data: { id: 'k', name: 'Kramer' } },
{ data: { id: 'g', name: 'George' } }
],
edges: [
{ data: { source: 'j', target: 'e' } },
{ data: { source: 'j', target: 'k' } },
{ data: { source: 'j', target: 'g' } },
{ data: { source: 'e', target: 'j' } },
{ data: { source: 'e', target: 'k' } },
{ data: { source: 'k', target: 'j' } },
{ data: { source: 'k', target: 'e' } },
{ data: { source: 'k', target: 'g' } },
{ data: { source: 'g', target: 'j' } }
]
}
});
cy.cxtmenu({
selector: 'node, edge',
commands: [
{
content: '<span class="fa fa-flash fa-2x"></span>',
select: function(ele){
console.log( ele.id() );
}
},
{
content: '<span class="fa fa-star fa-2x"></span>',
select: function(ele){
console.log( ele.data('name') );
},
enabled: false
},
{
content: 'Text',
select: function(ele){
console.log( ele.position() );
}
}
]
});
cy.cxtmenu({
selector: 'core',
commands: [
{
content: 'bg1',
select: function(){
console.log( 'bg1' );
}
},
{
content: 'bg2',
select: function(){
console.log( 'bg2' );
}
}
]
});
});
</script>
</head>
<body>
<h1>cytoscape-cxtmenu demo</h1>
<div id="cy"></div>
</body>
</html>
react版本
import React, { useEffect, useRef } from "react";
import cytoscape from "cytoscape";
import cxtmenu from "cytoscape-cxtmenu";
import "font-awesome/css/font-awesome.min.css";
cytoscape.use(cxtmenu);
const CytoscapeDemo = () => {
const cyRef = useRef(null);
useEffect(() => {
const cy = cytoscape({
container: cyRef.current,
style: [
{
selector: "node",
style: {
content: "data(name)",
},
},
{
selector: "edge",
style: {
"curve-style": "bezier",
"target-arrow-shape": "triangle",
},
},
],
elements: {
nodes: [
{ data: { id: "j", name: "Jerry" } },
{ data: { id: "e", name: "Elaine" } },
{ data: { id: "k", name: "Kramer" } },
{ data: { id: "g", name: "George" } },
],
edges: [
{ data: { source: "j", target: "e" } },
{ data: { source: "j", target: "k" } },
{ data: { source: "j", target: "g" } },
{ data: { source: "e", target: "j" } },
{ data: { source: "e", target: "k" } },
{ data: { source: "k", target: "j" } },
{ data: { source: "k", target: "e" } },
{ data: { source: "k", target: "g" } },
{ data: { source: "g", target: "j" } },
],
},
});
cy.cxtmenu({
selector: "node, edge",
commands: [
{
content: '<span class="fa fa-flash fa-2x"></span>',
select: (ele) => {
console.log(ele.id());
},
},
{
content: '<span class="fa fa-star fa-2x"></span>',
select: (ele) => {
console.log(ele.data("name"));
},
enabled: false,
},
{
content: "Text",
select: (ele) => {
console.log(ele.position());
},
},
],
});
cy.cxtmenu({
selector: "core",
commands: [
{
content: "bg1",
select: () => {
console.log("bg1");
},
},
{
content: "bg2",
select: () => {
console.log("bg2");
},
},
],
});
return () => cy.destroy();
}, []);
return (
<div style={{ height: "100vh", width: "100%" }}>
<h1 style={{ fontSize: "1em", opacity: 0.5 }}>Cytoscape-cxtmenu Demo</h1>
<div
id="cy"
ref={cyRef}
style={{
height: "calc(100% - 2em)",
width: "100%",
position: "absolute",
top: "2em",
}}
/>
</div>
);
};
export default CytoscapeDemo;
API详解
let cy = cytoscape({
container: document.getElementById('cy'),
});
let defaults = {
menuRadius: function(ele) {
return 100;
},
selector: 'node',
commands: [
],
fillColor: 'rgba(0, 0, 0, 0.75)',
activeFillColor: 'rgba(1, 105, 217, 0.75)',
activePadding: 20,
indicatorSize: 24,
separatorWidth: 3,
spotlightPadding: 4,
adaptativeNodeSpotlightRadius: false,
minSpotlightRadius: 24,
maxSpotlightRadius: 38,
openMenuEvents: 'cxttapstart taphold',
itemColor: 'white',
itemTextShadowColor: 'transparent',
zIndex: 9999,
atMouse: false,
outsideMenuCancel: false
};
let menu = cy.cxtmenu(defaults);
示例一:背景颜色

cy.cxtmenu({
selector: "node, edge",
commands: [
{
content: '<span class="fa fa-flash fa-2x"></span>',
select: (ele) => {
console.log(ele.id());
},
},
{
content: '<span class="fa fa-star fa-2x"></span>',
select: (ele) => {
console.log(ele.data("name"));
},
enabled: false,
},
{
content: "Text",
select: (ele) => {
console.log(ele.position());
},
},
],fillColor: 'rgba(0, 0, 100, 0.75)',
});
示例二:添加菜单按钮

cy.cxtmenu({
selector: "node, edge",
commands: [
{
content: '<span class="fa fa-flash fa-2x"></span>',
select: (ele) => {
console.log(ele.id());
},
},
{
content: '<span class="fa fa-star fa-2x"></span>',
select: (ele) => {
console.log(ele.data("name"));
},
enabled: false,
},
{
content: "Text",
select: (ele) => {
console.log(ele.position());
},
},
{
content: "Text1",
select: (ele) => {
console.log(ele.position());
},
},
],
});
示例三:自定义菜单项的样式

{
content: "Text1",
contentStyle: {
color: "red",
fontSize: "20px",
textAlign: "center",
},
select: (ele) => {
console.log(ele.position());
},
},