亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

JavaScript制作簡單的框選圖表

2019-11-19 16:34:57
字體:
來源:轉載
供稿:網友

故事背景:這幾天遇到一個客戶,是做會議記錄的,每次會議過程中,都會有特定設備記錄下講話人的位置以角度值顯示。他給我角度值,讓我給他做一個圖表來展示每個人的一個大概位置。

客戶想到的是用 Echarts 圖表來做,我首先想到的也是用 Echarts ,但是思考了他的要求以后,發現就一個簡單的框選圖表用 Echarts 來做是不是大材小用了,而且還要導入那么多的沒用的代碼。

于是我想到了用 canvas 畫布來仿著做,但又考慮了一下, canvas 操作起來不順手;究竟可不可以用普通的css結合 javascript 來把它做出來呢?此番思考驗證了:任何事情一定要多動腦,才能 碰到更簡單的解決問題的方式。

考慮到也許某天大家用得著,所以發布出來。注:擁有可移植性,可移到頁面任何位置,效果不會改變

先看最終效果吧:

圖一:

圖二:

這個小東西會涉及的知識點不多,歸納一下: js的三角函數 、 CSS3的transform 、 鼠標的坐標軸XY的計算 ...啊哈,差不多大體就這三方面的知識吧,如果你都只是有過了解也沒關系,因為都只用的到皮毛所以不必擔心。但是如果完全沒聽過,那就請您再去了解一下這方面知識。

代碼區域

<!doctype html> <html> <head>  <meta charset="utf-8" />  <title>仿Echarts圖表</title>  <style>  * {   padding:0;   margin:0;  }  #getcharts {   position:relative;   width:510px;   height:510px;   }  #wrapcharts {   list-style:none;   height:500px;   width:500px;   border:2px solid #aaa;   border-radius:50%;   position:relative;   margin:20px auto;  }  #wrapcharts li {   height:10px;   width:10px;   diaplay:block;   position:absolute;   cursor:pointer;   left:247px;   top:2px;   height:10px;   width:10px;   transition:0.2s;   background:red;   border-radius:50%;  }  #boxshadow {   position:absolute;   background:blue;   opacity:0.2;   height:0;   width:0;   left:0;   top:0;  }  </style> </head> <body>   <ul id="wrapcharts"></ul>  <div id="boxshadow"></div>  <script>  /*  **模擬從后端取值過來的【角度】和相對應的【人名】數組  **/  var degArr = [25,88,252,323,33,28,30,90,290,100,300,50,180,205,220,331,195,97,102,77,62,38,32,79];  var nameArr = ['內衣天使','小惡魔','金正恩','奧巴馬','duolaA夢','午夜激情','梁靜茹','劉亦菲','琪琪','大熊','小靜','小屁孩','張三','李四','王五','麻六','小明','小張','麗麗','多多','瑾瑾','biubiu','Mr.boluo','Hanson'];  /*  **聲明 getPos(param)函數: 利用三角函數定理根據傳入的角度值獲取對邊和臨邊的x,y值  **/  function getPos(deg)  {  var X = Math.sin(deg*Math.PI/180)*250 + 245;  var Y = -Math.cos(deg*Math.PI/180)*250 + 245;  return {x:X,y:Y};  }  /*  **這里不用說吧,獲取頁面中的ul,和ul中的li對象,以及框選時的那個任意變動大小的小方塊對象  **/  var oWrap = document.getElementById('wrapcharts');  var aLi = oWrap.getElementsByTagName('li');  var oBox =document.getElementById('boxshadow');  var allLi = '';  var posArr = [];  /*  **for循環中調用getPos(param)來獲取degArr數組中的所有角度對應的x,y值(就是每個角度對應的x,y坐標),并傳入到一個數組中保存,方便取用  **/  for(var i=0;i<degArr.length; i++)  {  posArr.push(getPos(degArr[i]));  }  /*  **for循環根據度數數組degArr的長度插入li小圓點到ul中,并將之前獲取的每個點對應的x,y左邊插入到行內樣式  **/  for(var i=0; i<degArr.length; i++)  {  allLi += '<li style="left:'+posArr[i].x+'px;top:'+posArr[i].y+'px;" title="'+degArr[i]+'°;姓名:'+nameArr[i]+'"></li>';  }  oWrap.innerHTML = allLi;  /*  **遍歷最終得到的ul中的li  **/  for(var i=0; i<aLi.length; i++)  {  aLi[i].index = i;  /*   **封裝鼠標移入每個小圓點時的放大事件,這里用到了matrix矩陣,為的事想兼容ie9以下瀏覽器,但是好像出了點問題   */  function focusOn(_this,color, size)  {   _this.style.background = color;   _this.style.WebkitTransform = 'matrix('+size+', 0, 0, '+size+', 0, 0)';   _this.style.MozTransform = 'matrix('+size+', 0, 0, '+size+', 0, 0)';   _this.style.transform = 'matrix('+size+', 0, 0, '+size+', 0, 0)';   _this.style.filter="progid:DXImageTransform.Microsoft.Matrix( M11= "+size+", M12= 0, M21= 0 , M22="+size+",SizingMethod='auto expend')";  }  aLi[i].onmouseover = function()  {   //alert(this.offsetLeft);   _this = this;   focusOn(_this,'blue', 2);  }  aLi[i].onmouseout = function()  {   //alert(this.offsetLeft);   _this = this;   focusOn(_this,'red', 1);   }  }  /***框選***/  /*  **拖拽框選代碼區域,這個我就不解釋了,明白人都一眼知道什么意思,這就像是公式,  */  var allSelect = {};  document.onmousedown = function(ev)  {  var ev = ev || window.event;  var disX = ev.clientX;  var disY = ev.clientY;  var H = W = clientleft = clienttop = clientright = clientbottom = 0;  oBox.style.cssText = 'left:'+disX+'px;top:'+disY+'px;';  //console.log(disX+';'+disY);  function again(f)  {   for(var i=0; i<posArr.length; i++)   {   if(posArr[i].x > clientleft && posArr[i].y > clienttop && (posArr[i].x + 10) < clientright && (posArr[i].y +10) < clientbottom)   {    //console.log(clientleft+';'+ clienttop +';'+ clientright +';' + clientbottom);    if(f){allSelect[i] = i;}else{    aLi[i].style.background = 'blue';    }   } else   {    aLi[i].style.background = 'red';   }   }   }   document.onmousemove = function(ev)  {   var ev = ev || window.event;   /*   **當鼠標向四個方向拖拉的時候進行方向判斷,并相應的改變小方塊的left,top以及width,height   **其實我這里有個問題,那就是,代碼重復了一些,本想著合并一下,但是作者有點懶,嘿嘿,你們也可以嘗試一下   **修改后你們拿去當做你們的發布,作者不會介意的   */   if(ev.clientX > disX && ev.clientY > disY)   {   W = ev.clientX - disX;   H = ev.clientY - disY;    oBox.style.width = W + 'px';   oBox.style.height = H + 'px';    clienttop = disY-oWrap.offsetTop;   clientleft = disX-oWrap.offsetLeft;    }else if(ev.clientX < disX && ev.clientY < disY)   {   W = disX - ev.clientX;   H = disY - ev.clientY;    oBox.style.top = ev.clientY + 'px';   oBox.style.left = ev.clientX + 'px';    oBox.style.width = W + 'px';   oBox.style.height = H + 'px';    clienttop = ev.clientY - oWrap.offsetTop;   clientleft = ev.clientX - oWrap.offsetLeft;    }else if(ev.clientX > disX && ev.clientY < disY)   {   W = ev.clientX - disX;   H = disY - ev.clientY;    oBox.style.top = ev.clientY + 'px';    oBox.style.width = W + 'px';   oBox.style.height = H + 'px';    clienttop = ev.clientY - oWrap.offsetTop;   clientleft = disX - oWrap.offsetLeft;    }else if(ev.clientX < disX && ev.clientY > disY)   {   W = disX - ev.clientX;   H = ev.clientY - disY;    oBox.style.left = ev.clientX + 'px';    oBox.style.width = W + 'px';   oBox.style.height = H + 'px';    clienttop = disY-oWrap.offsetTop;   clientleft = ev.clientX - oWrap.offsetLeft;   }     clientright = clientleft+ W;   clientbottom = clienttop + H;    W = '';   H = '';    again();   }  document.onmouseup = function()  {   again(1);    document.onmouseup = document.onmousemove = null;   oBox.style.cssText = 'height:0;width:0;';   if(JSON.stringify(allSelect) == '{}'){return;}   console.log(allSelect);    var lastSelect = [];   for(var attr in allSelect){   lastSelect.push(nameArr[attr]);   }   allSelect = {};    console.log(lastSelect);   alert('你選中的人是:/n/n'+lastSelect+'/n/n');    for(var i=0; i<aLi.length; i++)   {   aLi[i].style.background = 'red';   }  }  return false;  } </script> </body> </html> 

會用到的一些知識點拓展

注:在js中設置Transform的時候我用到的不是scale()方法,因為我想兼容ie9以下的版本所以用了矩陣變化。當然,你們也可以改為scale(),毫無影響。

1.在標準瀏覽器下的矩陣函數matix(a,b,c,d,e,f)、ie下的矩陣函數progid:DXImageTransform.Microsoft.Matrix( M11= 1, M12= 0, M21= 0 , M22=1,SizingMethod='auto expend')

他們的共同點:M11 == a; M12 == c; M21 == b; M22 == d

不一樣的地方:ie下的矩陣函數沒有 e 和 f 兩個參數,在矩陣函數中 e 和 f 是用來位移的,也就是說ie下沒法通過矩陣函數來實現位移[ 不過我們這里好像不需要位移,嘿嘿 ]

2.在標準瀏覽器下矩陣函數matrix中a,b,c,d,e,f 一一對應的的初始值為:matix(1,0,0,1,0,0)

3.通過矩陣實現縮放:

x軸縮放:a = x a c = x c e = x*e

y軸縮放:b = y b d = y d f = y*f

4.通過矩陣實現位移:[ie下沒位移]

x軸位移:e = e+x

y軸位移:f = f+y

5.通過矩陣實現傾斜:

x軸傾斜:c = Math.tan(xDeg/180*Math.PI)

y軸傾斜:b = Math.tan(yDeg/180*Math.PI)

6.通過矩陣實現旋轉:

a = Math.cos(deg/180*Math.PI);

b = Math.sin(deg/180*Math.PI);

c = -Math.sin(deg/180*Math.PI);

d = Math.cos(deg/180*Math.PI);

7.至于三角函數我就不介紹了,百度一大把。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品欧美aⅴ在线网站| 色在人av网站天堂精品| 26uuu久久噜噜噜噜| 欧美日韩在线观看视频| 日韩中文视频免费在线观看| 亚洲精品美女久久久久| 久久乐国产精品| 成人免费高清完整版在线观看| 成人精品一区二区三区| 欧美另类极品videosbest最新版本| 国产精品福利久久久| 欧美日韩加勒比精品一区| 精品国偷自产在线| 亚洲人精品午夜在线观看| 日韩在线视频免费观看高清中文| 亚洲国产成人精品电影| 丝袜情趣国产精品| 亚洲性线免费观看视频成熟| 国产免费一区二区三区香蕉精| 91天堂在线观看| 日韩精品视频三区| 中文亚洲视频在线| 日韩中文字幕在线| 国产精品免费视频久久久| 久久伊人91精品综合网站| 欧美一级电影在线| 亚洲人成自拍网站| 午夜精品蜜臀一区二区三区免费| 国产精品99久久久久久www| 国产精品视频一区二区高潮| 亚洲桃花岛网站| 国产精品久久中文| 91久久久久久国产精品| 成人在线国产精品| 中文字幕日韩av综合精品| 亚洲国产中文字幕在线观看| 国产精品aaa| 久久久久久久久久av| 国产精品午夜视频| 久久久久国色av免费观看性色| 欧美一级大片在线免费观看| 在线观看国产精品淫| 亚洲精品日韩激情在线电影| 久99久在线视频| 成人午夜一级二级三级| 日韩一区二区欧美| 欧美大片大片在线播放| 国产欧美一区二区三区视频| 成人午夜黄色影院| 欧美精品做受xxx性少妇| 亚洲欧美国产一本综合首页| 国产精品永久免费| 丝袜亚洲另类欧美重口| 亚洲综合av影视| 26uuu另类亚洲欧美日本老年| 欧美日韩国产色视频| 热久久这里只有精品| 成人激情视频免费在线| 国产午夜精品美女视频明星a级| 国产成人拍精品视频午夜网站| 亚洲色图15p| 日本一区二区不卡| 国产欧美久久一区二区| 日韩av电影手机在线观看| 久久亚洲综合国产精品99麻豆精品福利| 欧洲永久精品大片ww免费漫画| 国产一区二区三区直播精品电影| 欧美最猛性xxxxx(亚洲精品)| 亚洲欧美日韩精品久久奇米色影视| 亚洲成人免费在线视频| 亚洲人午夜色婷婷| 国产精品香蕉av| 欧美壮男野外gaytube| 91视频国产精品| 中文字幕综合一区| 国产精品高清免费在线观看| 中文字幕亚洲字幕| 国产精品久久久久久亚洲调教| 国产精品美女www爽爽爽视频| 久久精品视频免费播放| 精品久久久久久中文字幕大豆网| 亚洲影院在线看| 97在线视频一区| 亚洲成人av片在线观看| 久久久精品欧美| 亚洲国产精品久久久久秋霞蜜臀| 欧美日韩成人在线播放| 欧美日韩成人在线播放| 精品一区二区亚洲| 欧美日韩国产在线| 国产精品中文字幕在线观看| 久久久久久亚洲| 欧美电影在线播放| 亚洲欧美日韩在线高清直播| 亚洲图片在线综合| 尤物九九久久国产精品的分类| 国产香蕉精品视频一区二区三区| 国产精品电影在线观看| 欧美日韩免费区域视频在线观看| 亚洲直播在线一区| 亚洲xxxxx电影| 综合136福利视频在线| 欧美中文在线字幕| 色妞一区二区三区| 久久久99久久精品女同性| 欧美日韩在线第一页| 亚洲天堂日韩电影| 国产日本欧美一区二区三区在线| 亚洲精品97久久| 北条麻妃一区二区在线观看| 欧美性xxxxhd| 久久久精品日本| 亚洲男人的天堂在线| 最近2019年好看中文字幕视频| 日韩在线视频二区| 国产精品欧美久久久| 26uuu另类亚洲欧美日本一| 欧美电影免费观看高清| 久久免费精品日本久久中文字幕| 福利视频第一区| 亚洲一区二区免费| 91久久在线观看| 欧美激情视频免费观看| 亚洲视频综合网| 亚洲第一色中文字幕| 热草久综合在线| **欧美日韩vr在线| 国内精品伊人久久| 日韩一区二区三区国产| 精品国产欧美一区二区五十路| 欧美精品久久一区二区| 国产一级揄自揄精品视频| 韩国视频理论视频久久| 国产精品福利在线观看| 国产精品电影在线观看| 粉嫩老牛aⅴ一区二区三区| 亚洲精品国产电影| 久久精品国产亚洲一区二区| 欧美丰满老妇厨房牲生活| 亚洲欧美激情在线视频| 精品视频一区在线视频| 欧美黑人狂野猛交老妇| 久久成人一区二区| 日韩电影在线观看中文字幕| 国产99久久精品一区二区永久免费| 国产成人精品亚洲精品| 精品日韩视频在线观看| 久久在精品线影院精品国产| 九九热视频这里只有精品| 成人亚洲欧美一区二区三区| 欧美色播在线播放| 欧美黑人狂野猛交老妇| 国产精品亚洲网站| 黄色精品一区二区| 亚洲福利视频免费观看| 国产精品在线看| 91视频国产一区| 国产精品视频色| 国产精品一区二区三区久久| 欧美性xxxx极品高清hd直播| 97精品视频在线观看| 亚洲精品乱码久久久久久金桔影视| 欧美国产第二页| 国产精品综合不卡av|