@Geuis の方法を最初に試した後、間違った問題を解決していることに気付きました。項目の最後の行が、クリップされる行と必ずしも同じではないためです。
たとえば、3x4 グリッドに 12 個のアイテムがあるとします。1 行に 3 個のアイテム、合計 4 行です。次に、コンテナーの高さが、最初の 2 行と 3 行目の上半分を表示するのに十分だとします。最後の行は 4 行目ですが、一番上までスクロールしたと仮定すると、クリッピングされている行は 3 行目です。または、コンテナーの一番下までスクロールするとどうなりますか? これで、2 番目の行が切り取られ、下ではなく上から外れます。
そのため、行を見るのではなく、ホバーされている特定のアイテムを見て、その単一のアイテムが完全に表示されているかどうかを判断する必要があることに気付きました。そうであれば、何もしません。そうでない場合は、アイテムのどちらの端がクリップされているかに応じて上下にスクロールします。
これが私が思いついたものです。ホバー時:
var containerHeight = $container.height(),
itemHeight = $(this).height(),
itemOffset = Math.floor($(this).position().top),
itemVisible = containerHeight - itemOffset,
itemClip = itemHeight - itemVisible;
if (itemClip > 0){
$container.scrollTo('+=' + itemClip, 600);
} else if (itemOffset < 0){
$container.scrollTo('-=' + Math.abs(itemOffset), 600);
}
($container
はスクリプトの別の場所で を含むものとして定義されていますdiv
)
1行ずつ:
- すべてのアイテムを保持するコンテナーの高さを取得します
- ホバリングされているアイテムの高さを取得する
- コンテナーの上部からホバーされたアイテムの上部までの距離を取得します
- コンテナーの高さ (1 行目) から距離 (3 行目) を引きます。
- 4 行目との差を、ホバリングされているアイテムの高さ (2 行目) から差し引きます。
これで、次の 2 つのことがわかります。
- 行 3 の結果が負の場合、項目はコンテナーの上部を越えてその数のピクセル分クリップされています。
- 行 5 の結果が正の場合、項目はコンテナーの下部を超えてその数のピクセル分クリップされています。
これを知っていれば、コンテナを正しい方向に正しい距離だけスクロールして、アイテム全体を表示できます。
実際のスクロール自体には、現在のスクロール位置からピクセル数を上下にスクロールするためにjQuery ScrollToプラグインが必要です(コンテナーの上部からではありません。これは、jQuery の組み込み関数が行うことです)。x
.scrollTop()
(ScrollTo は値として負の数を取らないため、上にスクロールするには、itemOffset
- したがっての絶対値を取得する必要がありますMath.abs(itemOffset)
)。