【发布时间】:2014-04-25 02:06:07
【问题描述】:
在我正在处理的当前项目中,我需要能够使用 jQuery 动态添加多个级别的可排序嵌套列表。我有嵌套的可排序列表按需要工作,但我遇到了父母的下一个兄弟姐妹在视觉上与前一个父兄弟姐妹的后代重叠的问题,如 this fiddle
从视觉上看,我需要每个列表项不重叠其兄弟元素的任何后代,所以我的想法是我需要根据后代元素的累积高度来设置高度/边距底部。
我能做的唯一尝试是:
function resizeHeight(){
var setToChildrenHeights = function(){
var height = $(this).height();
$(this).children().each(function(){
height += $(this).outerHeight();
});
$(this).css('margin-bottom',height);
}
$("li").each(setToChildrenHeights);
}
问题在于,当我有 3 级嵌套列表时它不起作用(即,父级被推离直接子级但不妨碍子级子级。
作为参考,我使用的谷歌搜索的子集是:
- “jquery 如何在添加/删除嵌套子项时在每个级别自动更改祖先高度”
- “jquery 父级高度随着嵌套子级的添加/删除而变化”
- “jquery 列表容器高度随着项目的添加而增加”
- “jquery 在添加子元素时动态改变 div 的高度”
- “jquery cascading resize when child dynamic added/removed”
- “jquery 根据子项高度调整列表元素高度”
除了搜索jQuery api文档,到目前为止我还没有找到解决方案,我希望另一双眼睛能够指出我的错误。任何帮助表示赞赏。
更新: 我很幸运地使用此代码 (updated fiddle) 采用了递归方法,但不幸的是它现在设置了太多的边距底部:
function recursiveResize($parentElement){
var numChild = $parentElement.children().length
console.log('number of children = '+numChild);
var parentHeight = $parentElement.height();
if (numChild<1)
return parentHeight;
var height = 0;
$parentElement.children().each(function(){
height += recursiveResize($(this));
});
return parentHeight + height;
}
//try2
function newResizeRecursive(){
var $parentElements = $('li');
$parentElements.each(function(){
var height = $(this).height();
var childrenHeights = recursiveResize($(this));
var newmargin = childrenHeights - height +3
console.log('new margin = '+newmargin);
console.log('before '+$(this).css('margin-bottom'))
$(this).css('margin-bottom', (newmargin>3 ? newmargin: 3))
console.log('after '+$(this).css('margin-bottom'))
});
}
【问题讨论】: