数据分布情况不同,在圆上分布出现重叠会不同,对于元素进行重排处理

来源:10-6 饼图文本重排(重排)

学之舟_36820

2016-06-13

数据分布情况不同:

  • 重叠出现在右上角

data:[
  ["JQuery",.15,"#FF7676"],
  ["CSS3",.01],
  ["HTML5",.01],
  ["Js",.7],
  ["PHP",.13]
]
  • 重叠出现在右下角

data:[
  ["IOS",.25,"#FF7676"],
  ["Cocos2d-x",.02],
  ["Unity-3D",.02],
  ["Android",.71]
]
  • 重叠出现在左下角

data:[
   ["Js",.7,"#FF7676"],
   ["CSS3",.01],
   ["HTML5",.01],
   ["PHP",.13],
   ["JQuery",.15]
]
  • 重叠出现在左上角

data:[
  ["Android",.71,"#FF7676"],
  ["IOS",.25,"#5DDBD8"],
  ["Cocos2d-x",.02,"#99C0FF"],
  ["Unity-3D",.02,"#FFAD69"]
]

对象的重排方法:

// 重排元素
H5ComponentPie.reSort = function (list) {
	// 检测相交
	var compare = function (domA,domB) {
		var offsetA = $(domA).offset();
		var offsetB = $(domB).offset();

		// domA 投影
		var shadowA_x = [offsetA.left, offsetA.left + $(domA).width()];
		var shadowA_y = [offsetA.top, offsetA.top + $(domA).height()];

		// domB 投影
		var shadowB_x = [offsetB.left, offsetB.left + $(domB).width()];
		var shadowB_y = [offsetB.top, offsetB.top + $(domB).height()];

		// 检测x轴
		var intersect_x = (shadowA_x[0] > shadowB_x[0] && shadowA_x[0] < shadowB_x[1]) || (shadowA_x[1] > shadowB_x[0] && shadowA_x[1] < shadowB_x[1]);

		// 检测y轴
		var intersect_y = (shadowA_y[0] > shadowB_y[0] && shadowA_y[0] < shadowB_y[1]) || (shadowA_y[1] > shadowB_y[0] && shadowA_y[1] < shadowB_y[1]);

		return intersect_x && intersect_y;
	};

	// 错开重排
	//  位置调整,向圆靠近
	var reset = function (domA,domB) {
		// 圆右上角
		if ( $(domA).css("left") != "auto" && $(domA).css("bottom") != "auto" ) {
			$(domA).css("left", parseInt($(domA).css("left")) - $(domB).width() / 6 );
			$(domA).css("bottom", parseInt($(domA).css("bottom")) + $(domB).height() / 2 );
		};

		// 圆右下角
		if ( $(domA).css("left") != "auto" && $(domA).css("top") != "auto" ) {
			$(domA).css("left", parseInt($(domA).css("left")) + $(domB).width() / 6 );
			$(domA).css("top", parseInt($(domA).css("top")) - $(domB).height() / 2 );
		};

		// 圆左上角
		if ( $(domA).css("right") != "auto" && $(domA).css("bottom") != "auto" ) {
			$(domA).css("right", parseInt($(domA).css("right")) + $(domB).width() / 6 );
			$(domA).css("bottom", parseInt($(domA).css("bottom")) - $(domB).height() / 2 );
		};

		// 圆左下角
		if ( $(domA).css("right") != "auto" && $(domA).css("top") != "auto" ) {
			$(domA).css("right", parseInt($(domA).css("right")) - $(domB).width() / 6 );
			$(domA).css("top", parseInt($(domA).css("top")) + $(domB).height() / 2 );
		};
	};

	// 定义将要重排的元素
	// 有时候不是第一个元素和第二个元素发生重叠,这里每次都由新的数组存储要重排的元素
	var willReset = [];

	for (var i=0; i<list.length; i++) {
		if (list[i+1]) {
			if ( compare(list[i],list[i+1]) ) {
				willReset.push([list[i],list[i+1]]);
			};
		};
	};

	console.log(willReset);
	if (willReset.length) {
		for (var i=0; i<willReset.length; i++) {
			reset(willReset[i][0],willReset[i][1]);
		};
		
		// 递归-彻底重排分开
		// 火狐报错发生太多递归?
		H5ComponentPie.reSort(list);
	};

};

这里遇到的问题:

位置调整?

变更量大,最后错开位置很大,由于设置方向上是向圆靠近的,会出现文本内容跑到圆上面。

如果将文本内容都是往外进行,可以全部都是相加。

火狐报错发生太多递归?

写回答

2回答

益铭

2016-07-08

递归卡死的问题老师视频里不是演示了吗,先把text的过渡动画时长设为0,重排后再恢复,还出问题?

0
0

益铭

2016-07-08

老师的逻辑确实有漏洞,如果不是第一个和第二个数据相交就失效了,你的重排逻辑正确,只是太密集相交的数据重排后就散乱到上天了,这个重排的思路只是部分情况有用,还是要看数据的情况,不行就手动设置位置呗。

0
0

Web App用组件方式开发全站

用HTML5/CSS3/JS流行技术,实现移动端可视化数据报告

3164 学习 · 516 问题

查看课程