1. 程式人生 > >d3滑鼠拖拽、放大縮小後動態載入頁面資料demo

d3滑鼠拖拽、放大縮小後動態載入頁面資料demo

d3滑鼠拖拽、放大縮小後動態載入頁面資料demo

index.html

<!DOCTYPE html>

<html>

<head>

    <meta charset="UTF-8">

    <style>

        *{

            margin: 0;

            padding: 0;

        }

        #keyword{

            height: 90%;

          width: 95%;

          position: 
absolute;           top: 55px;           bottom: 0px;              z-index: 0;          overflow:hidden;          word-break:break-all;         }       #keyword2{          height: 90%;          width: 95%;          position: absolute;          top: 55px;          bottom: 0px;          z-index
: 0;          overflow:hidden;          word-break:break-all;       }         .link {             fill: none;             stroke: #666;             stroke-width: 1.5px;         }         #licensing {             fill: green;         }         .link.licensing {             stroke: green
;         }         .link.resolved {             stroke-dasharray: 0,2 1;         }         circle {             stroke: #333;             stroke-width: 1.5px;         }         text {             font: 12px Microsoft YaHei;             pointer-events: none;             text-shadow: 0 1px 0 #fff, 1px 0 0 #fff, 0 -1px 0 #fff, -1px 0 0 #fff;         }         .linetext {             font: 12px Microsoft YaHei;         }         .mytooltip{             position: absolute;             height: auto;             font-family: "microsoft yahei", simhei;             font-size: 14px;             text-align: center;             border: 1px solid #999;             padding: 5px;             background-color: white;             border-radius: 5px;          opacity:0.0;         }       #gallery {          width: 200px;          height: 200px;          /*background: url('img/1.JPG') no-repeat center center;          background-size:100%;          font-size:30px;          color:#fff;*/          text-align:center;          /*line-height:200px;*/       }     </style>    <link rel="stylesheet" type="text/css" href="css/easyui.css">    <link rel="stylesheet" type="text/css" href="css/icon.css"> </head> <body> <div title="資料展示" >    <div id="keyword">    </div>    <div id="keyword2" style="top:80px;position: fixed;opacity: 0">    </div> </div> <img id="img_id" src="img/map.jpg" onmousemove="imgMouseMove(this,event)" onmouseover="imgMouseOver(this)"     onmouseleave="imgMouseOut(this)" onclick="imgClick(this,event)"     style="position: fixed;bottom: 5px;right: 5px;z-index: 100px;width: 136.6px;height: 76.8px"/> <div class="mytooltip" id="imgtooltip"></div> <script src="assets/plugins/jquery/jquery-3.3.1.min.js"></script> <script src="assets/plugins/jquery.easyui.min.js"></script> <script src="assets/plugins/d3/d3.v3.min.js"></script> <script src="assets/plugins/html2canvas.js"></script> <script src="assets/js/pages/index.js"></script> </body> </html>

index.js

var root = {};var nodesbak = {};var colorObj = {};var imgtype = 0;var maxValue = 0;//最大的那個系統$(function (){     $.getJSON("assets/data/word.json", function (data){         root = deepClone(data,{});         //系統備份         root.nodes.concat().forEach(function(node,k) {             if(node.value > maxValue){                 maxValue = node.value;             }             colorObj[node.id] = k;             nodesbak[node.id] = {name:node.id,group:node.group,x1:node.x,y1:node.y,type:node.id,value:node.value};         });         //表備份         root.nodes1.concat().forEach(function(node,k) {             nodesbak[node.id] = {name:node.id,group:node.group,x1:node.x,y1:node.y,pid:node.pid,type:node.pid};         });         //畫系統佈局圖         draw(root.nodes,root.links,sys_transform,sys_scale,null);         //畫表的矩形樹圖         drawTabImg();         //表矩形樹圖截圖         doScreenShot();     })     $("#img_id").hide();     $("#sys_keyword").val(""); })var links = [];//關聯關係var nodes = {};//節點資料var initscale = 1;//保留一份最初始的縮放係數,用於放大時計算最近距離var sys_scale = 1;//域、系統放大時的縮放倍數var sys_transform = [0,0];//域、系統放大時的中心座標var tab_scale = 1;//表放大時的縮放倍數var tab_transform = [0,0];//表放大時的中心座標var edges_line = null;//連線線var circle = null;//節點var edges_text = null;//連線線上的文字var text = null;//節點文字var svg = null;var force = null;//力學圖物件var zoom = null;//縮放配置var dx = 0;//x偏移量var dy = 0;//y偏移量var ds = 1;//放大縮小倍數var m_down_x ;//拖拽前xvar m_down_y ;//拖拽前yvar m_move_x ;//拖拽後xvar m_move_y ;//拖拽後yvar isDown = false;//記錄滑鼠狀態var width = '100%',height = '100%';var type = '1';//'1':域、系統;'2'://格式化資料function formatData(paramNodes,paramLinks,pid){     var m = 0;     var copynodes = deepClone(nodesbak,{});     paramNodes.forEach(function(node,k) {         var x = copynodes[node.id].x1;         var y = copynodes[node.id].y1;         if(pid == null){             if(type == 1){                 x = x*((screen.width -100)/1366);                 y = y*((screen.height -280)/768);             }             if(type == 2){                 x = x*10;                 y = y*10;             }             if(x*ds+dx > 0 && x*ds+dx < screen.width                 && y*ds+dy > 0 && y*ds+dy < (screen.height -280) && m < 500/ds             ){                 nodes[node.id] = {name: node.id,group:node.group,x1:x,y1:y,type:(type ==1?node.id:node.pid)};                 m++;             }             return;         }         if(pid != null && pid == node.pid){             x = x*10;             y = y*10;             if(x*ds+dx > 0 && x*ds+dx < screen.width                 && y*ds+dy > 0 && y*ds+dy < (screen.height -280) && m < 500/ds             ){                 nodes[node.id] = {name: node.id,group:node.group,x1:x,y1:y,type:(type ==1?node.id:node.pid)};                 m++;             }         }     });     for(var i=0;i<paramLinks.length;i++){         if(nodes[paramLinks[i].source] != null && nodes[paramLinks[i].target] != null){             links.push({                 source: paramLinks[i].source,                 target: paramLinks[i].target,                 rela: paramLinks[i].value             })         }     }     links.forEach(function(link) {         //利用sourcetarget名稱進行連線以及節點的確認         link.source = nodes[link.source];         link.target = nodes[link.target];     }); }function zoomed(){//縮放函式     svg.selectAll("g").attr("transform",//svg下的g標籤移動大小         "translate("  +d3.event.translate + ")scale(" +d3.event.scale + ")"); }//繪製圖像function draw(paramNodes,paramLinks,paramTransform,paramScale,pid) {     tooltip ?tooltip.html(""):tooltip;     nodes = {};     links = [];     edges_line = null;//連線線     circle = null;//節點     edges_text = null;//連線線上的文字     text = null;//節點文字     formatData(paramNodes,paramLinks,pid);     force = d3.layout.force()//layoutjson格式轉化為力學圖可用的格式         .nodes(d3.values(nodes))//設定節點陣列         .links(links)//設定連線陣列         .size([width, height])//大小         .linkDistance(120)//連線線長度         .charge(-600)//值為+,則相互吸引,絕對值越大吸引力越大。值為-,則相互排斥,絕對值越大排斥力越大         .on("tick", tick)//開始轉換         .start();     zoom = d3.behavior.zoom()//縮放配置,         .scaleExtent([0.4, 10])//縮放比例         .on("zoom", zoomed);     svg = d3.select("#keyword").append("svg")//新增svg元素進行圖形的繪製         .attr("width", width)         .attr("height", height)         .call(zoom)         .on("mousedown",function(event){             isDown = true;             //獲取滑鼠按下時座標             m_down_x = d3.event.pageX;//拖拽前x             m_down_y = d3.event.pageY;//拖拽前y         })         .on(