数据分布情况不同,在圆上分布出现重叠会不同,对于元素进行重排处理
来源: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
相似问题