ホームページ > ウェブフロントエンド > jsチュートリアル > モバイル端末でのIndexListの詳細説明

モバイル端末でのIndexListの詳細説明

小云云
リリース: 2018-01-04 14:06:42
オリジナル
1730 人が閲覧しました

この記事は主にモバイル端末の効果のインデックスリストを詳しく紹介していますので、興味のある方は参考にしていただければ幸いです。

前に書いてます

前回のモバイルエフェクトの話に続き、今回はIndexListの実装原理について説明します。効果は次のとおりです:

ここでコードを参照してください: github

モバイルエフェクト用のスワイパー

モバイルエフェクト用のピッカー

モバイルエフェクト用の cellSwiper

1. コア分析

全体的な原理右側のインデックスバーをクリックまたはスライドすると、クリックのインデックス値を取得して左側のコンテンツを対応する位置にスライドさせます。特定の位置にスライドする方法については、以下の内訳を参照してください:

1.1 基本的な HTML コード


<p class="indexlist">
 <ul class="indexlist-content" id="content">
  <!-- 需要生成的内容 -->
 </ul>
 <p class="indexlist-nav" id="nav">
  <ul class="indexlist-navlist" id="navList">
   <-- 需要生成的索引条 -->
  </ul>
 </p>
 <p class="indexlist-indicator" style="display: none;" id="indicator"></p>
</p>
ログイン後にコピー

1.2 DOM の初期化

Ele.me コンポーネント ライブラリのindexList は vue コンポーネントを使用して DOM を生成するため、通常、ここでは DOM の生成をシミュレートするために JavaScript を使用します。


// 内容填充
function initialDOM() {
 // D.data 获取内容数据
 var data = D.data;
 var contentHtml = &#39;&#39;;
 var navHtml = &#39;&#39;;
 // 初始化内容和NAV
 data.forEach(function(d) {
  var index = d.index;
  var items = d.items;
  navHtml += &#39;<li class="indexlist-navitem">&#39;+ index +&#39;</li>&#39;;
  contentHtml += &#39;<li class="indexsection" data-index="&#39;+ index +&#39;"><p class="indexsection-index">&#39;+ index +&#39;</p><ul>&#39;;
  items.forEach(function(item) {
   contentHtml += &#39;<a class="cell"><p class="cell-wrapper"><p class="cell-title"><span class="cell-text">&#39;+ item +&#39;</span></p></p></a>&#39;;
  });
  contentHtml += &#39;</ul></li>&#39;;
 });

 content.innerHTML = contentHtml;
 navList.innerHTML = navHtml;
}

// 样式初始化
if (!currentHeight) {
 currentHeight = document.documentElement.clientHeight -content.getBoundingClientRect().top;
}
// 右边索引栏的宽度
navWidth = nav.clientWidth;
// 左边内容的初始化高度和右边距
// 高度为当前页面的高度与内容top的差值
content.style.marginRight = navWidth + &#39;px&#39;;
content.style.height = currentHeight + &#39;px&#39;;
ログイン後にコピー

1.3 スライディング イベントをバインドする

右側のインデックス バーにスライディング イベントを追加します。クリックまたはスライドするとトリガーされます。ソース コードでは、最初のインデックス バーで touchstart イベントがトリガーされた場合にのみ、touchstart イベントの最後で touchmove および touchend イベントがウィンドウにバインドされます。 window スライド イベントと終了イベントをトリガーします。これは、スライド プロセス中に左側のコンテンツ領域をスライドできると同時に、インデックス効果を達成できることを意味します。


function handleTouchstart(e) {
 // 如果不是从索引栏开始滑动,则直接return
 // 保证了左侧内容区域能够正常滑动
 if (e.target.tagName !== &#39;LI&#39;) {
  return;
 }
 
 // 记录开始的clientX值,这个clientX值将在之后的滑动中持续用到,用于定位
 navOffsetX = e.changedTouches[0].clientX;
 
 // 内容滑动到指定区域
 scrollList(e.changedTouches[0].clientY);
 if (indicatorTime) {
  clearTimeout(indicatorTime);
 }
 moving = true;
 
 // 在window区域注册滑动和结束事件
 window.addEventListener(&#39;touchmove&#39;, handleTouchMove, { passive: false });
 window.addEventListener(&#39;touchend&#39;, handleTouchEnd);
}
ログイン後にコピー

ここでは e.changedTouches が使用されています。この API は MDN で確認できます。

マルチタッチが使用されていない場合、changedTouches と touchs の差は特に大きくありません。changedTouches が同じ点で 2 回クリックされた場合、2 回目のタッチ値はありません。詳細については、この記事をご覧ください

ここでスライドの方法を見てみましょう:


function scrollList(y) {
 // 通过当前的y值以及之前记录的clientX值来获得索引栏中的对应item
 var currentItem = document.elementFromPoint(navOffsetX, y);
 if (!currentItem || !currentItem.classList.contains(&#39;indexlist-navitem&#39;)) {
  return;
 }
 
 // 显示指示器
 currentIndicator = currentItem.innerText;
 indicator.innerText = currentIndicator;
 indicator.style.display = &#39;&#39;;

 // 找到左侧内容的对应section
 var targets = [].slice.call(sections).filter(function(section) { 
  var index = section.getAttribute(&#39;data-index&#39;);
  return index === currentItem.innerText;
 });
 var targetDOM;
 if (targets.length > 0) {
  targetDOM = targets[0];
  // 通过对比要滑动到的区域的top值与最开始的一个区域的top值
  // 两者的差值即为要滚动的距离
  content.scrollTop = targetDOM.getBoundingClientRect().top - firstSection.getBoundingClientRect().top;
  
  // 或者使用scrollIntoView来达到相同的目的
  // 不过存在兼容性的问题
  // targetDOM.scrollIntoView();
 }
}
ログイン後にコピー

elementFromPoint の API については、getBoundingClientRect とscrollIntoView の互換性についてここ

caniuse.com を参照してください

getBoundingClientRect

sc rollIntoView

最後に、ウィンドウ上のスライディングイベントをキャンセルする必要があります


window.removeEventListener(&#39;touchmove&#39;, handleTouchMove);
window.removeEventListener(&#39;touchend&#39;, handleTouchEnd);
ログイン後にコピー

2. 非常に多くの分析があり、以下を参照することで優れた設計コンセプトを学ぶことができます。ソースコード。たとえば、最初にそれを実行するように求められた場合、右側のインデックス バーにイベントをバインドするだけで、左側のコンテンツを関連付けることはできません。そうすると、スライディング エリアが大幅に減少します。
同時に、ソースコードを見ることで比較的遠い知識を学び、自ら学習するよう促すこともできます。たとえば、この記事では、changedTouches や elementFromPoint などの API の研究が挙げられます。

関連する推奨事項:


モバイル端末のIndexListエフェクトの紹介

モバイル端末で指をスライドさせるカルーセル効果を実現するjs

モバイルHTML5での横画面と縦画面の判断方法

以上がモバイル端末でのIndexListの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート