1
+ 'use strict' ;
1
2
/**
2
3
* Simply draw a stacked graph
3
4
* @class
@@ -169,7 +170,9 @@ StackedGraph.prototype.updateDrawing = function (animated, timing) {
169
170
* @param { number[] } xy Local coordinate
170
171
*/
171
172
StackedGraph . prototype . local2global = function ( xy ) {
172
- let [ w , h ] = [ this . _htmlElement . clientWidth , this . _htmlElement . clientHeight ] ;
173
+ let [ w , h ] = [
174
+ this . _htmlElement . clientWidth || this . _htmlElement . parentNode . clientWidth ,
175
+ this . _htmlElement . clientHeight || this . _htmlElement . parentNode . clientHeight ] ;
173
176
let [ l , r , t , b ] = [ this . padding . left , this . padding . right , this . padding . top , this . padding . bottom ] ;
174
177
let [ x , y ] = xy ;
175
178
return [ x * ( w - r - l ) + l , y * ( - h + 2 * t + b ) + h - t - b ] ;
@@ -180,7 +183,9 @@ StackedGraph.prototype.local2global = function (xy) {
180
183
* @param { number[] } xy Global coordinate
181
184
*/
182
185
StackedGraph . prototype . global2local = function ( xy ) {
183
- let [ w , h ] = [ this . _htmlElement . clientWidth , this . _htmlElement . clientHeight ] ;
186
+ let [ w , h ] = [
187
+ this . _htmlElement . clientWidth || this . _htmlElement . parentNode . clientWidth ,
188
+ this . _htmlElement . clientHeight || this . _htmlElement . parentNode . clientHeight ] ;
184
189
let [ l , r , t , b ] = [ this . padding . left , this . padding . right , this . padding . top , this . padding . bottom ] ;
185
190
let [ x , y ] = xy ;
186
191
return [ ( x - l ) / ( w - r - l ) || 0 , ( y - h + t + b ) / ( - h + 2 * t + b ) || 0 ] ;
@@ -214,14 +219,16 @@ StackedGraph.prototype.weightedWiggle = function(index) {
214
219
}
215
220
return dg0 . slice ( 0 , index + 1 ) . reduce ( ( a , b ) => a + b ) ;
216
221
}
217
-
222
+ StackedGraph . prototype . getColor = function ( index ) {
223
+ return this . colors [ index % this . colors . length ] || '#000000' ;
224
+ }
218
225
/** Update the drawing */
219
226
StackedGraph . prototype . drawStacked = function ( ) {
220
227
// Remove the drawn elements
221
228
this . stackedGraphDOMs . forEach ( element => this . _htmlElement . removeChild ( element ) ) ;
222
229
this . stackedGraphDOMs . splice ( 0 , this . stackedGraphDOMs . length ) ;
223
230
224
- let getColor = index => this . colors [ ( index - 1 ) % this . colors . length ] || '#000000' ;
231
+ let getColor = index => this . getColor ( index - 1 ) ;
225
232
// Draw the data to draw
226
233
for ( let i = 1 ; i < this . _dataToDraw . length ; i ++ ) {
227
234
let polygon = document . createElementNS ( this . svgns , 'polygon' ) ;
@@ -233,14 +240,14 @@ StackedGraph.prototype.drawStacked = function() {
233
240
polygon . style . fill = getColor ( i ) ;
234
241
polygon . classList . add ( 'stacked-polygon' , 'stacked-' + ( i - 1 ) ) ;
235
242
let wrapEvent = event => {
236
- let detail = event ;
237
243
event . stackedIndex = i - 1 ;
238
- let clientX = event . clientX || event . touches [ 0 ] . clientX ;
239
- let relativeX = ( clientX - this . padding . left ) / ( this . _htmlElement . clientWidth - this . padding . left - this . padding . right ) || 0 ;
244
+ let offsetX = event . offsetX || ( ( event . targetTouches [ 0 ] || { pageX : 0 } ) . pageX - event . target . getBoundingClientRect ( ) . left ) ;
245
+ let relativeX = ( offsetX - this . padding . left ) / ( this . _htmlElement . clientWidth - this . padding . left - this . padding . right ) || 0 ;
240
246
let dataIndex = Math . round ( relativeX * ( this . dataDimension - 1 ) ) ;
241
247
event . dataIndex = dataIndex ;
242
248
event . stackedData = this . _data [ i - 1 ] [ dataIndex ] ;
243
- let newEvent = new CustomEvent ( 'stacked-' + event . type , { detail } ) ;
249
+ let newEvent = new CustomEvent ( 'stacked-' + event . type ) ;
250
+ for ( let prop in event ) newEvent [ prop ] = event [ prop ] ;
244
251
this . _htmlElement . dispatchEvent ( newEvent ) ;
245
252
} ;
246
253
// Binding events
@@ -260,12 +267,14 @@ function makeHorizontalAxis(stackedGraph) {
260
267
let _this = stackedGraph ;
261
268
// Horizontal axis line
262
269
_this . horizontalAxis = document . createElementNS ( _this . svgns , 'line' ) ;
270
+ let width = _this . _htmlElement . clientWidth || _this . _htmlElement . parentNode . clientWidth ;
271
+ let height = _this . _htmlElement . clientHeight || _this . _htmlElement . parentNode . clientHeight ;
263
272
// Resize behavior
264
273
_this . horizontalAxis . resize = ( ) => {
265
274
_this . horizontalAxis . setAttribute ( 'x1' , _this . padding . left ) ;
266
- _this . horizontalAxis . setAttribute ( 'x2' , _this . _htmlElement . clientWidth - _this . padding . right ) ;
267
- _this . horizontalAxis . setAttribute ( 'y1' , _this . _htmlElement . clientHeight - _this . padding . bottom ) ;
268
- _this . horizontalAxis . setAttribute ( 'y2' , _this . _htmlElement . clientHeight - _this . padding . bottom ) ;
275
+ _this . horizontalAxis . setAttribute ( 'x2' , width - _this . padding . right ) ;
276
+ _this . horizontalAxis . setAttribute ( 'y1' , height - _this . padding . bottom ) ;
277
+ _this . horizontalAxis . setAttribute ( 'y2' , height - _this . padding . bottom ) ;
269
278
}
270
279
_this . horizontalAxis . style . stroke = '#aaaaaa' ;
271
280
_this . horizontalAxis . style . strokeWidth = '1px' ;
@@ -282,7 +291,6 @@ function makeHorizontalAxis(stackedGraph) {
282
291
_this . horizontalGrads . splice ( 0 , _this . horizontalGrads . length ) ;
283
292
_this . horizontalGradTags . splice ( 0 , _this . horizontalGradTags . length ) ;
284
293
let [ left , right , bottom ] = [ _this . padding . left , _this . padding . right , _this . padding . bottom ] ;
285
- let [ width , height ] = [ _this . _htmlElement . clientWidth , _this . _htmlElement . clientHeight ] ;
286
294
let n = Math . ceil ( ( width - left - right ) / _this . gradSpacing || 0 ) ;
287
295
let step = Math . ceil ( _this . dataDimension / n || 0 ) ;
288
296
if ( _this . dataDimension > 500 ) {
@@ -327,6 +335,9 @@ function bindResizeBehaviors(stackedGraph) {
327
335
328
336
// This function defines the public getter/setter of the class
329
337
function publicStackedGraph ( stackedGraph ) {
338
+ Object . defineProperty ( stackedGraph , 'dom' , {
339
+ get : ( ) => stackedGraph . _htmlElement
340
+ } ) ;
330
341
Object . defineProperty ( stackedGraph , 'htmlElement' , {
331
342
get : ( ) => stackedGraph . _htmlElement
332
343
} ) ;
@@ -370,5 +381,33 @@ function publicStackedGraph(stackedGraph) {
370
381
371
382
window . addEventListener ( 'load' , event => {
372
383
let stackedGraph = window . stackedGraph = new StackedGraph ( 'stacked' ) ;
384
+ let dataTitles = [ '项目A' , '项目B' , '项目C' ] ;
373
385
stackedGraph . updateDrawing ( true , stackedGraph . animationTiming ) ;
386
+
387
+ // let labelDOM = document.createElement('div');
388
+ // labelDOM.classList.add('stacked-label');
389
+ // labelDOM.style.position = 'fixed';
390
+ // let indicator = document.createElement('div');
391
+ // indicator.classList.add('stacked-indicator');
392
+ // labelDOM.appendChild(indicator);
393
+ // let titleDOM = document.createElement('div');
394
+ // titleDOM.classList.add('stacked-title');
395
+ // labelDOM.appendChild(titleDOM);
396
+ // let valueDOM = document.createElement('div');
397
+ // valueDOM.classList.add('stacked-value');
398
+ // labelDOM.appendChild(valueDOM);
399
+ // stackedGraph.dom.addEventListener('stacked-mouseenter', event => {
400
+ // document.body.appendChild(labelDOM);
401
+ // indicator.style.background = stackedGraph.getColor(event.stackedIndex);
402
+ // });
403
+ // stackedGraph.dom.addEventListener('stacked-mousemove', event => {
404
+ // labelDOM.style.left = event.clientX + 10 + 'px';
405
+ // labelDOM.style.top = event.clientY + 10 + 'px';
406
+
407
+ // titleDOM.innerHTML = dataTitles[event.stackedIndex];
408
+ // valueDOM.innerHTML = event.stackedData.toFixed(2);
409
+ // });
410
+ // stackedGraph.dom.addEventListener('stacked-mouseleave', event => {
411
+ // document.body.removeChild(labelDOM);
412
+ // });
374
413
} ) ;
0 commit comments