Branding option for Cubik using links of a network diagram inside letters.
Based on the force-directed graph and applying a linear gradient. In addition use of SVG text as a clipping mask.
Branding option for Cubik using links of a network diagram inside letters.
Based on the force-directed graph and applying a linear gradient. In addition use of SVG text as a clipping mask.
| <!DOCTYPE html> | |
| <meta charset="utf-8"> | |
| <style> | |
| svg { | |
| background-color: #333; | |
| } | |
| .links line { | |
| stroke: url(#gradient); | |
| } | |
| #alpha{ | |
| fill: rgb(255,255,255); | |
| } | |
| #base { | |
| fill: #333; | |
| mask: url(#mask); | |
| } | |
| .title { | |
| font-family: 'Open Sans', sans-serif; | |
| font-size: 20em; | |
| text-anchor: middle; | |
| } | |
| #title-outline { | |
| fill:none; | |
| stroke: url(#gradient); | |
| stroke-width: 1.5px; | |
| } | |
| </style> | |
| <svg width="960" height="600"></svg> | |
| <script src="https://d3js.org/d3.v4.0.0-alpha.40.min.js"></script> | |
| <script> | |
| var svg = d3.select("svg"), | |
| width = +svg.attr("width"), | |
| height = +svg.attr("height"), | |
| title = 'Cubik', | |
| numberOfNodes = 1000; | |
| svg.append("linearGradient") | |
| .attr("id", "gradient") | |
| .attr("gradientUnits", "userSpaceOnUse") | |
| .selectAll("stop") | |
| .data([ | |
| {offset: "0%", color: "#18FFFF"}, | |
| {offset: "50%", color: "#7C4DFF"}, | |
| {offset: "100%", color: "#FF4081"} | |
| ]) | |
| .enter().append("stop") | |
| .attr("offset", function(d) { return d.offset; }) | |
| .attr("stop-color", function(d) { return d.color; }); | |
| var mask = svg.append("defs") | |
| .append("mask") | |
| .attr("id", "mask") | |
| .attr("x", 0) | |
| .attr("y", 0) | |
| .attr("width", "100%") | |
| .attr("height", "100%"); | |
| mask.append("rect") | |
| .attr("id", "alpha") | |
| .attr("width", "100%") | |
| .attr("height", "100%"); | |
| mask.append("text") | |
| .attr("class", "title") | |
| .attr("x", "50%") | |
| .attr("y", "60%") | |
| .text(title); | |
| var simulation = d3.forceSimulation() | |
| .force("link", d3.forceLink().id(function(d) { return d.id; })) | |
| .force("charge", d3.forceManyBody()) | |
| .force("center", d3.forceCenter(width / 2, height / 2)); | |
| var nodes = d3.range(numberOfNodes).map(function(i){ return {id: i}; }); | |
| var links = []; | |
| d3.range(numberOfNodes).forEach(function(i){ | |
| links.push({source: i, target: (i + 1) % numberOfNodes}); | |
| links.push({source: i, target: i * 7 % numberOfNodes}); | |
| }); | |
| var link = svg | |
| .append("g") | |
| .attr("class", "links") | |
| .selectAll("line") | |
| .data(links) | |
| .enter() | |
| .append("line"); | |
| simulation | |
| .nodes(nodes) | |
| .on("tick", ticked); | |
| simulation | |
| .force("link") | |
| .links(links); | |
| svg.append('rect') | |
| .attr("id", "base") | |
| .attr("width", "100%") | |
| .attr("height", "100%"); | |
| svg.append("text") | |
| .attr("id", "title-outline") | |
| .attr("class", "title") | |
| .attr("x", "50%") | |
| .attr("y", "60%") | |
| .text(title) | |
| setInterval(moveNodes, 5000); | |
| function ticked() { | |
| link | |
| .attr("x1", function(d) { return d.source.x; }) | |
| .attr("y1", function(d) { return d.source.y; }) | |
| .attr("x2", function(d) { return d.target.x; }) | |
| .attr("y2", function(d) { return d.target.y; }); | |
| } | |
| function moveNodes() { | |
| nodes.forEach(function(d){ | |
| d.vx = Math.random() * 2 - 2; | |
| d.vy = Math.random() * 2 - 2; | |
| }) | |
| simulation.alphaTarget(0.1).restart(); | |
| } | |
| </script> |