画面の高さ領域よりも長いDOMのオブジェクトのリストがあります。
タイムラインツリービューのようなものを作成するためだけに、画面上の可視オブジェクトを検出する必要があります。 (下の写真のようなもの):
私のDOMは次のようになります:
<!-- elements visibility on screen to be DETECTED -->
<div id="elements">
<div id="elem-1">Lorem ipsum</div>
<div id="elem-2">Lorem ipsum</div>
<div id="elem-3">Lorem ipsum</div>
<div id="elem-4">Lorem ipsum</div>
<div id="elem-5">Lorem ipsum</div>
<div id="elem-6">Lorem ipsum</div>
<div id="elem-7">Lorem ipsum</div>
<div id="elem-8">Lorem ipsum</div>
</div>
<!--elements visibility on screen to be AFFECTED -->
<ul id="timeline">
<li view-id="elem-1">Elem-1</li>
<li view-id="elem-2">Elem-2</li>
<li view-id="elem-3" class="active">Elem-3</li>
<li view-id="elem-4" class="active">Elem-4</li>
<li view-id="elem-5" class="active">Elem-5</li>
<li view-id="elem-6" class="active">Elem-6</li>
<li view-id="elem-7">Elem-7</li>
<li view-id="elem-8">Elem-8</li>
</ul>
私の目標は、#elements
コンテナから画面上に表示される要素のIDを検出し、#timeline
コンテナ内の対応する要素にactive
クラスを割り当てることです。
Scroll
イベントでこのプロセスを実行する必要があります。
これを達成する方法はありますか?
まず、on-screen visible area
はViewport
として知られています。
(画像はOPから取得されます。Photoshop)でクリアおよび編集されます
したがって、必要なのは、Viewport
内のすべての要素を検出することです。
これはjQueryの多くのプラグインを使用して実現できますが、jQuery withinviewport
と呼ばれる1つの例で説明します
ソースおよびドキュメントへのリンク: [withInViewport-Github]
プラグインをダウンロードして、スクリプトにjQuery
フレームワークとwithinviewport
プラグインを含めます。
<script src="http://code.jquery.com/jquery-1.7.min.js"></script>
<script src="withinViewport.js"></script>
<script src="jquery.withinviewport.js"></script>
。
scroll
イベントで関数を初期化する:
$(window).bind("scroll", function() {
//your code placeholder
});
。
withinviewport
セレクターを使用してビューポート内のすべての要素を取得し、各要素ごとに#timeline
コンテナー内の対応するリスト項目にクラスを追加します。
$("#elements > div").withinviewport().each(function() {
$('#timeline > li[view-id="'+$(this)[0].id+'"]').addClass('active');
});
すべてをまとめる:
$(window).bind("scroll", function() {
//clear all active class
$('#timeline > li').removeClass('active');
//add active class to timeline
$("#elements > div").withinviewport().each(function() {
$('#timeline > li[view-id="'+$(this)[0].id+'"]').addClass('active');
});
});
。
。
また、このプラグインは、ビューポートの上下左右のオフセットを設定する機会を提供します。
こちらのデモをご覧ください: http://patik.com/code/within-viewport/