目次
原則
関数の実装
ホームページ ウェブフロントエンド htmlチュートリアル シームレスなスクロールについてまだ心配ですか?今こそこの知識を徹底的に習得 point_html/css_WEB-ITnose

シームレスなスクロールについてまだ心配ですか?今こそこの知識を徹底的に習得 point_html/css_WEB-ITnose

Jun 21, 2016 am 08:48 AM

最近、会社の株取引コンテストのページの作成に忙しく、昨日ようやくオンラインに公開しました。一見シンプルなページですが、作ってみて初めて苦労や隠れた落とし穴に気づきます。 jquery はページ ロジックの記述に直接使用されるため、想像よりもはるかに複雑です。レイアウト、機能、ロジックのいずれの観点においても、要約する価値があるものがあります。

クリックして昨日立ち上げたページを表示します

この記事では主にシームレススクロールの実装について説明します。

私が初めて js を学び始めたとき、シームレスなスクロールは魔法の機能だと本当に感じました。舞台裏で何が起こっているのでしょうか?ブロックの数が少ないのになぜ転がらないのでしょうか?その後、原理を理解した後、それはいくつかの盲目的な方法によって達成されることがわかりました。

原則

シームレスにスクロールする必要がある 4 つの要素が、1 つの ul.item 内の 6 li.item であると仮定します。コンテナ .w​​rap 内の ul.items のスクロールを制御します。 HTML コードは次のとおりです。

ul.items は、className が items である ul 要素を表し、他の場所でも同じことが当てはまります

<div class="wrap">    <ul class="items"><!--    --><li class="item"><img src="https://static.tigerbrokers.com/portal/images/cooperation/stockGame/v2-partner0.8a07a886.jpg" alt=""></li><!--    --><li class="item"><img src="https://static.tigerbrokers.com/portal/images/cooperation/stockGame/v2-partner1.56bcecb3.png" alt=""></li><!--    --><li class="item"><img src="https://static.tigerbrokers.com/portal/images/cooperation/stockGame/v2-partner2.9a7e8842.jpg" alt=""></li><!--    --><li class="item"><img src="https://static.tigerbrokers.com/portal/images/cooperation/stockGame/v2-partner3.47acdfbd.png" alt=""></li><!--    --><li class="item"><img src="https://static.tigerbrokers.com/portal/images/cooperation/stockGame/v2-partner5.e9205d49.jpg" alt=""></li><!--    --><li class="item"><img src="https://static.tigerbrokers.com/portal/images/cooperation/stockGame/v2-partner6.83b14a71.png" alt=""></li><!--    --></ul></div>
ログイン後にコピー

私たちの目標は、次のとおりです。水平スクロールなので li.item を水平に配置する必要があります。目標を達成するために一般的に使用される方法は、float: left を使用するか、display: inline-block を使用することです。ページ要素の動きを制御することは、要素の left、top、translateX、translateY を制御すること以外の何ものでもありません。もう 1 つは、スクロール距離 (scrollTop、scrollLeft) を制御することです。レイアウトの選択は、js コントロール属性の選択にも影響します。

この例では、display: inline-block レイアウトを使用することを選択し、ul.items のscrollLeft 値を制御して ul 全体をスクロールします。レイアウトでは次の点に注意する必要があります。

  1. ここでの非表示は ul.items との違いに注意してください。 float: 左のレイアウト。

    .items { overflow: hidden; }
    ログイン後にコピー
  2. ul.itemsの内容はラップできないため、

    .items { white-space: nowrap; }
    ログイン後にコピー
  3. をモバイル端末に合わせる必要がありますが、構成幅が小さくなると必然的にアイテムの幅も小さくなります。

    @media (max-width: 780px) {    .item {        width: 190px;    }}@media (max-width: 580px) {    .item {        width: 160px;    }}
    ログイン後にコピー
  4. HTML レイアウトの は、display: inline-block 要素間のギャップをなくすためのものです。

では、シームレスなスクロールを実現する盲目的なトリックとは何でしょうか?本来なら絵で説明したほうがわかりやすいのですが、ここではぐずぐずして言葉で説明し、理解していただければと思います。

子要素 123456 があります。1 つずつ左にスクロールしてコピーすると、123456123456 になります。ボディ全体を 2 番目の 1 に移動すると、全体の位置が最初の 1 に戻ります。これは div.items の overflow: hidden のため、で発生した変更を使用できません。真ん中 肉眼で認識すると左に動き続けて止まらないように感じます。

理解できない場合は、コードで理解するか、メッセージを残してください。

関数の実装

スポーツに関して言えば、setTimeout または setInterval を使用する方法がよく思い浮かびますが、html5 ではより高性能なメソッド requestAnimationFrame が提供されます。

パフォーマンスの点では、requestAnimationFrame > setTimeout > setInterval。具体的な理由を知るために関連情報を見つけることができます。 setTimeout の最小タイミング値は 100/60 です。したがって、パフォーマンスと互換性の観点から、モーションを実装するときは、次のステートメントを作成することがよくあります:

var lastTime = 0,    nextFrame = window.requestAnimationFrame       ||                window.webkitRequestAnimationFrame ||                window.mozRequestAnimationFrame    ||                window.msRequestAnimationFrame     ||                function(callback) {                    var currTime = + new Date,                        delay = Math.max(1000/60, 1000/60 - (currTime - lastTime));                    lastTime = currTime + delay;                    return setTimeout(callback, delay);                },    cancelFrame = window.cancelAnimationFrame               ||                  window.webkitCancelAnimationFrame         ||                  window.webkitCancelRequestAnimationFrame  ||                  window.mozCancelRequestAnimationFrame     ||                  window.msCancelRequestAnimationFrame      ||                  clearTimeout;
ログイン後にコピー

どこにスクロールするかを知る必要があります。 0 に戻ると、この位置はコピー前のすべてのサブ要素の合計の長さになります。ただし、デバイスの幅の変更により子要素の幅も変更されるため、レイアウトを一致させるには、次の操作を行う必要があります。

// 单个子元素的宽度var itemW = 240;if ($items.children().eq(0).width() == 190) {    itemW = 190;}if ($items.children().eq(0).width() == 160) {    itemW = 160;}// 目标位置var target = itemW * $items.children().length;
ログイン後にコピー

ブラインドネスを実現するには、子要素のコピー

$items.html( $items.html() + $items.html() );
ログイン後にコピー

モーション関数を定義します。ここでのモーションは均一モーションなので、+1 を維持するだけで済みます。より速く移動する必要がある場合は、シームレスなスクロールが実現されるように、

var timer = null;function adAni() {    timer = nextFrame(function() {        scrollX += 1;        // 当递增到大于了目标距离,就直接变为0        if (scrollX >= target) {            scrollX = 0;        }        $items.scrollLeft(scrollX);        adAni();    });}// 运行这个函数就可以实现无缝滚动啦。adAni();
ログイン後にコピー

をもう少し追加します。しかし、他にもいくつかのニーズがあります。たとえば、マウスオーバーが発生した場合、スクロールを停止し、マウスオーバーを離れた後にスクロールを再開する必要があります。ニーズの変化により、モバイル端末上で items.ul をスライドさせ、指を離した後もスクロールを継続できることも必要です。そのため、PCとモバイルを区別する機能が必要になります。 UAの違いによって区別されます。

function isMobile() {    return /(iphone|ipad|ipod|ios|android|mobile|blackberry|iemobile|mqqbrowser|juc|fennec|wosbrowser|browserng|Webos|symbian|windows phone)/i.test(navigator.userAgent);}
ログイン後にコピー

PC側ではマウスを近づけると停止し、マウスを離すとスクロールを続けます

if (!isMobile()) {    $items.on('mouseover', function() {        cancelFrame(timer);    }).on('mouseout', function() { adAni(); });}
ログイン後にコピー

モバイル側では左にスライドできます。と右にスライドすると自動スクロールを停止し、放した後も自動スクロールを続けます。モバイル側のスライディング イベントは、主に touchstart、touchmove、および touchend によって実装されます。これらは、PC 側の Mousedown、mousemove、mouseup と同様です。

var sX, sL;$items.on('touchstart', function(e) {    cancelFrame(timer);    sX = e.originalEvent.changedTouches[0].pageX;    sL = $items.scrollLeft();}).on('touchmove', function(e) {    var dis = e.originalEvent.changedTouches[0].pageX - sX;    var nowX = sL - dis;    if (nowX > target) {        nowX = 0;    }    $items.scrollLeft(nowX);}).on('touchend', function(e) {    scrollX = $items.scrollLeft();    if (scrollX >= target) {        scrollX = 0;    }    adAni();})
ログイン後にコピー

これで基本的には完了です。これは比較的単純な例ですが、requestAnimationFrame を使用してモーションを実装したり、モバイル端末上でイベントをスライドさせたりするなど、一般的に使用される関数もいくつか含まれています。ここにまとめて共有させていただきますので、ご質問がございましたらお気軽にご相談ください。

segmentfault の記事は codepen のデモをサポートしていないため、記事の冒頭にあるリンクにアクセスして表示するか、私の個人ブログにアクセスして元のブログのテキストを表示することができます。

ご質問がございましたら、公式アカウントにメッセージを残してください。WeChat で isreact を検索すると見つかります^_^。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

&lt; Progress&gt;の目的は何ですか 要素? &lt; Progress&gt;の目的は何ですか 要素? Mar 21, 2025 pm 12:34 PM

この記事では、HTML&lt; Progress&gt;について説明します。要素、その目的、スタイリング、および&lt; meter&gt;との違い要素。主な焦点は、&lt; Progress&gt;を使用することです。タスクの完了と&lt; Meter&gt; statiの場合

&lt; datalist&gt;の目的は何ですか 要素? &lt; datalist&gt;の目的は何ですか 要素? Mar 21, 2025 pm 12:33 PM

この記事では、HTML&lt; Datalist&GT;について説明します。オートコンプリートの提案を提供し、ユーザーエクスペリエンスの改善、エラーの削減によりフォームを強化する要素。

&lt; meter&gt;の目的は何ですか 要素? &lt; meter&gt;の目的は何ですか 要素? Mar 21, 2025 pm 12:35 PM

この記事では、html&lt; meter&gt;について説明します。要素は、範囲内でスカラーまたは分数値を表示するために使用され、Web開発におけるその一般的なアプリケーション。それは差別化&lt; Meter&gt; &lt; Progress&gt;およびex

ビューポートメタタグとは何ですか?レスポンシブデザインにとってなぜそれが重要なのですか? ビューポートメタタグとは何ですか?レスポンシブデザインにとってなぜそれが重要なのですか? Mar 20, 2025 pm 05:56 PM

この記事では、モバイルデバイスのレスポンシブWebデザインに不可欠なViewportメタタグについて説明します。適切な使用により、最適なコンテンツのスケーリングとユーザーの相互作用が保証され、誤用が設計とアクセシビリティの問題につながる可能性があることを説明しています。

HTML5フォーム検証属性を使用してユーザー入力を検証するにはどうすればよいですか? HTML5フォーム検証属性を使用してユーザー入力を検証するにはどうすればよいですか? Mar 17, 2025 pm 12:27 PM

この記事では、ブラウザのユーザー入力を直接検証するために、必要、パターン、MIN、MAX、および長さの制限などのHTML5フォーム検証属性を使用して説明します。

HTML5&lt; time&gt;を使用するにはどうすればよいですか 日付と時刻を意味的に表す要素? HTML5&lt; time&gt;を使用するにはどうすればよいですか 日付と時刻を意味的に表す要素? Mar 12, 2025 pm 04:05 PM

この記事では、html5&lt; time&gt;について説明します。セマンティックデート/時刻表現の要素。 人間の読み取り可能なテキストとともに、マシンの読みやすさ(ISO 8601形式)のDateTime属性の重要性を強調し、Accessibilitを増やします

&lt; iframe&gt;の目的は何ですか タグ?使用する際のセキュリティ上の考慮事項は何ですか? &lt; iframe&gt;の目的は何ですか タグ?使用する際のセキュリティ上の考慮事項は何ですか? Mar 20, 2025 pm 06:05 PM

この記事では、&lt; iframe&gt;外部コンテンツをWebページ、その一般的な用途、セキュリティリスク、およびオブジェクトタグやAPIなどの代替案に埋め込む際のタグの目的。

HTML5のクロスブラウザー互換性のベストプラクティスは何ですか? HTML5のクロスブラウザー互換性のベストプラクティスは何ですか? Mar 17, 2025 pm 12:20 PM

記事では、HTML5クロスブラウザーの互換性を確保するためのベストプラクティスについて説明し、機能検出、プログレッシブエンハンスメント、およびテスト方法に焦点を当てています。

See all articles