数据分布情况不同,在圆上分布出现重叠会不同,对于元素进行重排处理
来源: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,重排后再恢复,还出问题?
00 -
益铭
2016-07-08
老师的逻辑确实有漏洞,如果不是第一个和第二个数据相交就失效了,你的重排逻辑正确,只是太密集相交的数据重排后就散乱到上天了,这个重排的思路只是部分情况有用,还是要看数据的情况,不行就手动设置位置呗。
00
相似问题