私はこの醜いコードの塊を持っており、ウェブサイトにサブナビゲーションを配置する役割を果たしています。私でもそれが地獄のように醜いことを認めているので、どうすればそれを改善できるかについて意見が欲しいです:)
複雑なロジックが原因ではないので、誰かがより良い構造化のアイデアを持っているかもしれません:
positionSubItems : function() {
var $that = $(this),
$parent = $that.parents().eq(1),
$elements = $parent.find(' > li'),
$activeElements = $parent.find(' > li.active'),
$container = $that.parent().find(".expandedViewContainer"),
highestBoundary = $($elements[0]).offset().top - $($elements[0]).outerHeight(true),
lowestBoundary = $($elements[$elements.length - 1]).offset().top + $($elements[$elements.length - 1]).outerHeight(true),
containerHeight = $container.outerHeight(true),
elementHeight = $that.outerHeight(true),
returnIndex = function(selector) {
return $(selector).parent().index();
};
if($that.data().subItemsPositioned !== true) {
$container.css({
'margin-top' : - ( containerHeight / 2 + (elementHeight / 2) )
});
if((lowestBoundary - highestBoundary) <= containerHeight) {
$container.css({
'margin-top' : - ((elementHeight * 2) + (elementHeight * returnIndex($that)) + ($activeElements.find(" > ul").outerHeight(true) || 0))
});
}
if($container.offset().top < highestBoundary) {
$container.css({
'margin-top' : - ((elementHeight * 2) + (elementHeight * returnIndex($that)))
});
if((lowestBoundary - highestBoundary) < containerHeight) {
$container.css({
'margin-top' : - ((elementHeight * 2) + (elementHeight * returnIndex($that)) + ($activeElements.find(" > ul").outerHeight(true) || 0))
});
}
}
if(($container.offset().top + containerHeight) >= lowestBoundary) {
$container.css({
'margin-top' : - ( containerHeight - (elementHeight * ($elements.length - returnIndex($that))) )
});
if((lowestBoundary - highestBoundary) <= containerHeight) {
$container.css({
'margin-top' : - ((elementHeight * 2) + (elementHeight * returnIndex($that)) + ($activeElements.find(" > ul").outerHeight(true) || 0))
});
}
}
$that.data().subItemsPositioned = true;
}
}
それで、それが何をするのか簡単に説明させてください。左側の垂直ナビゲーション(の垂直リスト)があるとしましょうli
。それらli
の中には、リンクと、アイテムの別のリストを含む別のdivがあります。したがって、この関数が実行する必要があるのはli
、いくつかのルールに従ってこのサブレベルのsを配置することです。
li
2つの境界があります。1つは最初のレベルの最も高い「li」アイテムにそれ自体の高さを加えたものに対応し、もう1つは最初のレベルの最も低いものにそれ自体の高さを加えたものに対応します。- 最初の条件は、コンテナによって保持され、親の右側に表示されるサブアイテムを常に配置することです
li
。したがって、親はそのコンテナの中央に表示されます。 - 上記のルールに基づいて、結果として得られるコンテナの配置のオフセットが上限を超える場合は、コンテナの上部オフセットが上限と同じレベルになるようにコンテナを再配置します。
- 最初のルールに従って残りのアイテムをクリックし続け、その場合は2番目のルールを適用し、次の条件が満たされている場合はそれを適用します。コンテナの下部のオフセットが最低境界を超えたら、再配置します。コンテナの底部は常に最低境界と同じレベルにあります
- 上記のすべてのルールと条件を通過した後、コンテナの高さが上限と下限の間の高さよりも大きいかどうかも確認する必要があります。その場合は、最初のルールを適用し、コンテナを上限
- 親が少なく
li
、コンテナの高さが境界間の高さの高さを再び超える場合は、別のシナリオが発生するため、上記のルールを適用する必要があります。 - すでに詳細を掘り下げているので、説明しない別のシナリオがあります
したがって、上記のように、誰かがすべてのロジックを実行するためのより良い方法と、おそらくよりクリーンな方法を持っていることを願っています:)