全画面ページのスクロール効果を実現するJavaScript

全画面ページのスクロール効果を実現するJavaScript

JavaScript DOM を読み終えた後、解釈型 JavaScript スクリプト言語に対する理解が深まり、JavaScript コードがより標準化されました。

次に、今日皆さんにお伝えしたい技術的な問題、つまり全画面ページでのスクロールについてお話しします。

実装されたコードは非常にシンプルですが、その中の問題点を発見するには、長年の経験、読解経験、そしてプログラマーの豊かな想像力が必要です。

まず、最終的な 2 つのレンダリングと console.log によって出力されたコンテンツを見てみましょう。

1. ページ2の効果をクリックして結果を印刷します。

クリック後、pagelist[this.index].rollCount タイマーに Math.ceil(rollData.num) という値の文字列が出力されます。5 秒後に別のカウンターが自動的に実行され、pagelist[this.index].rollCount タイマーがクリアされます。

2. もう一度ページ 2 をクリックすると、次の結果が印刷されます。

クリック後、まずpagelist[this.index].rollCountタイマーが存在するかどうかを確認し、存在する場合はクリアします。クリックに対応するページに到達した場合は、実行されていないことを出力して戻ります。

詳しくは、以下の例をご覧ください。さまざまな状況が詳しく説明されています。

<!DOCTYPE html>
<html lang="ja">
<ヘッド>
    <メタ文字セット="UTF-8">
    <title>全画面ページめくり効果</title>
    <スタイル>
        * {
            パディング: 0;
            マージン: 0;
        }
 
        html、本文{
            幅: 100%;
            高さ: 100%;
            色: #fff;
        }
 
        ul {
            リストスタイル: なし
        }
 
        #ナビ{
            位置: 固定;
            上: 50px;
            左: 50px;
        }
 
        #nav li {
            幅: 80ピクセル;
            高さ: 50px;
            テキスト配置: 中央;
            行の高さ: 50px;
            境界線: 2px 実線 #fff;
            カーソル: ポインタ;
        }
 
        #nav li:n番目の子(1) {
            背景: #f60;
        }
 
        #nav li:n番目の子(2) {
            背景: #63c;
        }
 
        #nav li:n番目の子(3) {
            背景: #3c6;
        }
 
        #nav li:n番目の子(4) {
            背景: #f9c;
        }
 
        #ページ {
            幅: 100%;
            高さ: 100%;
        }
 
        #ページ li {
            幅: 100%;
            高さ: 100%;
        }
    </スタイル>
</head>
<本文>
<ul id="ページ">
    <li></li>
    <li></li>
    <li></li>
    <li></li>
</ul>
<ul id="nav">
    <li>ページ 1</li>
    <li>ページ 2</li>
    <li>ページ 3</li>
    <li>ページ 4</li>
</ul>
<スクリプト>
    関数rollingPage() {
        var pageul = document.getElementById("ページ");
        var pagelist = pageul.children;
 
        var navul = document.getElementById("nav");
        var navlist = navul.children;
 
        (i = 0; i < navlist.length; i++) の場合 {
            //すべてのスタイルを取得する getComputedStyle
            var bgcolor = getComputedStyle(navlist[i], "").backgroundColor;
// アラート(背景色);
            ページリスト[i].style.background = bgcolor;
 
            //現在の要素のインデックス オブジェクトを定義し、現在の要素の添字を保存します。navlist[i].index = i;
 
            //変数をオブジェクトとして宣言する var rollData = {
                番号: 0,
                ターゲット: 0
            };
            navlist[i].onclick = 関数 () {
 
                //クリックされたボタンに対応するページとページ全体の上端の間の距離 rollData.target = pagelist[this.index].offsetTop;
 
                //クリックされた要素が現在の要素かどうかを判断します。現在の要素である場合は、実行を継続しません。var h = window.innerHeight || document.documentElement.clientHeight 
                    || ドキュメント本体のクライアントの高さ;
                var x = this.index;
                //現在クリックされたボタンに対応するページに要素属性タイマーがあるかどうかを判断します if (pagelist[this.index].rollCount) {
                    console.log("存在する");
                    ページリストのロールカウントをクリアします。
 
                    /* 連続クリックによって直接戻ったり、ページが完全に読み込まれなかったりすることを防ぐため、それを防ぐための判断を追加します。
                     ※このように、上記をクリアした後でも、ページに完全に到達しない場合でも、
                       *カウンタpagelist[this.index].rollCountも下方向に実行されます
                     * */
                    /*しかし、物事は決して完璧にはならず、常に改善する必要があることがわかりました。
                     ※友人とチャットをしている最中に、再度現在のページに対応するボタンをクリックしました。
                       ※しかし、以下の戻りは実行されていないことがわかりました。
                     *カウンターに出力された Math.ceil(rollData.num) の値をもう一度見てみましょう。1 です。
                     *したがって、Math.ceil(rollData.num) + 1 == h * x || 
                     *Math.ceil(rollData.num) - 1 == h * x
                     *
                     * もう一つの理由は、
                       * window.scrollTo(0, Math.ceil(rollData.num) + 1) の場合
                     * 1 を減算し、アルカリを追加せずに保存すると、アルカリを追加しない値は Math.ceil(rollData.num) になります。
                     * */
                    (Math.ceil(rollData.num) + 1 == h * x || の場合 
                             Math.ceil(rollData.num) - 1 == h * x || 
                                   Math.ceil(rollData.num) == h * x) {
                        console.log("実行されませんでした");
                        //それが存在し、スクロールバーがスクロールする値が現在のページと等しい場合、
                          //カウンターは下方向には実行されません。
                        戻る;
                    }
                }
 
                //ページをスクロールするためのタイマー pagelist[this.index].rollCount = setInterval(function () {
                    //Math.ceil() は、rollData.num = rollData.num + より大きい方向に丸めます。 
                                     (rollData.target - rollData.num) / 10;
                    コンソールにログ出力します。
              //1. スクロールバーをh*xの位置に移動します。window.scrollTo()
             //2. Math.ceil によって取得された後の rollData.num 属性の絶対値が x*h の前後で 1 になるケースを判別します。 //上記 2 つの操作を行う理由は、Math.ceil(rollData.num) の値を印刷するときに、x*h の前後の値の差が 1 になる場合があることがわかったためです。
                    (Math.ceil(rollData.num) + 1 == h * x)の場合{
                        window.scrollTo(0, Math.ceil(rollData.num) + 1);
                    } そうでない場合 (Math.ceil(rollData.num) - 1 == h * x) {
                        window.scrollTo(0, Math.ceil(rollData.num) - 1);
                    } それ以外 {
                        window.scrollTo(0, Math.ceil(rollData.num));
                    }
                }, 30);
 
                /*5秒後、条件が満たされた場合、pagelist[x].rollCountカウンターをクリアして、上位カウンターが継続的に実行されるのを防ぐことができます* */
                setTimeout(関数() {
                    //5秒後、Math.ceil(rollData.num)で前回と次回の差が1の場合、
                        // 上記のタイマーをクリアします if (Math.ceil(rollData.num) + 1 == h * x || 
                           Math.ceil(rollData.num) - 1 == h * x || 
                               Math.ceil(rollData.num) == h * x) {
                        console.log("自動的にクリア" + x);
                        ページリスト[x].rollCountをクリアします。
                    }
                }, 5000);
            }
        }
    }
 
    ローリングページへのロードイベントを追加します。
    関数addLoadEvent(func) {
        var oldonload = window.onload;
        if (typeof window.onload != 'function') {
            window.onload = 関数;
        } それ以外 {
            window.onload = 関数(){
                古いonload();
                関数();
            }
        }
    }
</スクリプト>
</本文>
</html>

上記の最適化を完了した後、今後もさらに多くの本を読んだり、オープンソースの Web サイトにアクセスして専門家が書いたコードを読んだり、想像力を駆使して自分のコードを常に改善したりする必要があることがわかりました。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • シンプルなページのフルスクリーンを実現する js
  • js は F11 ページの全画面表示をシミュレートします
  • jsはページの全画面表示と全画面表示を終了する方法を制御します
  • ページ要素を全画面で表示する JavaScript 全画面メソッド
  • スクロールバーがページの一番下までスクロールしたと判断してイベントを実行する方法をJSで実装する
  • js、jquery 指定された位置へのページのスクロール/ジャンプの実装アイデア
  • jsはHTMLページのスクロールイベントメソッドを監視します
  • スクロールバーがページの一番下までスクロールすると、コンテンツを自動的に追加するためのjsコードが読み込まれます。
  • jsはスクロールバーがページの下部または上部に到達したかどうかを判断します
  • js はスクロールバーを実装し、ページの下部までスクロールして読み込みを続行します。

<<:  HTML テーブル セルの幅と高さを設定する方法

>>:  MySQL共通インデックスとユニークインデックスの選択に関する詳細な分析

推薦する

Centos7 に DAMO データベースをインストールするチュートリアル

1. 準備Linux オペレーティング システムをインストールした後、ここで Linux 7 を選択...

MySQLのkillがスレッドをkillできない理由

目次背景問題の説明原因分析シミュレーションする総括する背景日常の使用において、MySQL で個別また...

HTML にオーディオファイルを挿入してブラウザで再生する場合の互換性の問題

HTML にオーディオ ファイルを挿入した後 (mp3 ファイルを再生した後) に発生したいくつかの...

MYSQL大規模書き込み問題の最適化の詳細な説明

概要: MySQL のパフォーマンス最適化について話すとき、誰もがクエリ パフォーマンスを向上させる...

ブラウザのキャッシュを防ぐために、js または css の後に ?v= バージョン番号を追加します。

コードをコピーコードは次のとおりです。 <span style="font-size...

HTML テーブルタグチュートリアル (7): 背景色属性 BGCOLOR

テーブルの背景色は、BGCOLOR 属性を通じて設定できます。基本的な構文<テーブル BGCO...

MySQLデータベース移行におけるデータ文字化けの問題を解決する

リーダーの指示のもと、Java プロジェクトを引き継ぎ、リファクタリングを行う必要がありました。同時...

JSブラウザストレージの詳しい説明

目次導入クッキークッキーとはクッキー生成方法クッキーの適用シナリオクッキーのデメリット回避策ローカル...

パーソナライズされたクリエイティブなウェブサイトデザインの例 (30)

そこで、個性的なスタジオやフリーランスを表現する組み合わせを 30 個選びました。デザインを目立たせ...

mysql はインデックスを無効にしますか?

mysql の IN はインデックスを無効にしますか?しませんよ! 結果をご覧ください: mysq...

CenOS6.7 mysql 8.0.22 のインストールと設定方法のグラフィックチュートリアル

CenOS6.7 は MySQL8.0.22 (推奨コレクション) をインストールします1. MyS...

HTML 初心者のためのベストプラクティス 15 選

HTML 初心者向けのベストプラクティスを 30 個紹介します。 1. タグを閉じたままにする過去に...

JS正規RegExpオブジェクトについての簡単な説明

目次1. RegExpオブジェクト2. 文法2.1 定義2.2 修飾子2.3 角括弧2.4 メタ文字...

MySQL マルチインスタンス構成ソリューション

1.1 MySQL マルチインスタンスとは何ですか?簡単に言うと、MySQL マルチインスタンスとは...

MySQLグループリンクの使用に関する詳細な説明

MYSQL におけるグループ化とリンクは、データベースの操作やデータのやり取りで最もよく使用される ...