jsネイティブウォーターフォールフロープラグイン制作

jsネイティブウォーターフォールフロープラグイン制作

この記事では、jsネイティブウォーターフォールフロープラグインの具体的なコードを参考までに共有します。具体的な内容は次のとおりです。

まずは効果を確認

通常のウォーターフォールフローと同じです。呼び出す際にコンテナ、画像、画像幅を渡すことでウォーターフォールフローを直接生成します。

では、早速コードを見て、アイデアについて話していきましょう。

1.htmlを呼び出します。HTMLには1行だけ必要です。

<本文>
    <div class="main"></div>
 
    <script src="index.js"></script>
    <スクリプト>
        // 最初のパラメーター、ウォーターフォール コンテナー var dom = document.getElementsByClassName("main")[0];
        // 2 番目のパラメータである画像リンクは配列に書き込まれます var imgArr = ["img/0.jpg","img/45.jpg","img/225.jpg","img/3.png","img/7729.png","img/a.jpg","img/ama.jpg","img/c.png","img/0.jpg","img/3.png","img/45.jpg","img/225.jpg","img/7729.png","img/a.jpg","img/ama.jpg","img/c.png",];
        // プラグインを呼び出してパラメータを渡します。3 番目は画像 width.waterFallFlow(dom,imgArr,220); です。
    </スクリプト>
</本文>

2. CSSに対応するHTML

.main は渡されるコンテナであり、position: relative; が必要です。

.main img{transition: all 0.5s;}はアニメーションコードで、コンテナ内のすべての画像に追加されます。

。主要{
    境界線: 1px 実線 #ccc;
    幅: 90%;
    マージン: 0 自動;
    位置: 相対的;
}
.メイン画像{
    遷移: すべて 0.5 秒;
}

それからjs

/**
 * @param {*} dom はウォーターフォールコンテナを表します* @param {*} imgArr 画像配列* @param {*} wid 画像の幅*/
関数 waterFallFlow(dom, imgArr, wid) {
    var gap; //ギャップ var colNumber; //列数 imgDom();
    画像の位置を設定します。
    //ウィンドウが変更されたとき window.onresize = function(){
        画像の位置を設定します。
    }
    /**var タイマー = null;
     * 上に書いたようにスムーズですが、パフォーマンスに影響しすぎます。ウィンドウをドラッグすると、* 写真を撮り直して配置するために関数が頻繁に呼び出されます * 
     * 手ぶれ補正はこれでもできる* 
     * window.onresize = 関数(){
     * if(タイマー){
     * clearIntval(タイマー);
     * }
     * タイマー = setTimeout(関数(){
     * setImgPos();
     * },300);
     * }
     * 
     */
    // DOM要素を生成する function imgDom() {
        (i = 0 とします; i < imgArr.length; i++) {
            const url = imgArr[i];
            img = document.createElement("img"); とします。
            url = 画像ファイル
            img.style.width = wid + "px";
            img.style.position = "絶対";
            // すべての画像は絶対配置を使用します img.style.left = "";
            スタイルトップ = "";
            img.onload = 関数(){
                setImgPos(); //画像の非同期読み込み}
            dom.appendChild(画像);
        }
    }
    // 各画像の座標を設定する function setImgPos() {
        cal();
        var colY = new Array(colNumber); //各列に次の画像のY座標を格納する colY.fill(0); //配列を0にする
        (i = 0 とします; i < dom.children.length; i++) {
            var imgM = dom.children[i];
            var y = Math.min(...colY); // 最小値を見つける var index = colY.indexOf(y); // 列 var x = (index + 1) * gap + index * wid;
            imgM.style.left = x + "px";
            imgM.style.top = y + "px";
            //配列を更新 colY[index] += parseInt(imgM.height)+gap;
        }
        // 配列内の最大数を見つけて、親 div の折りたたみ問題を解決します var h = Math.max(...colY);
        コンソールログ(h);
        dom.style.height = h + "px";
    }
    // 関連データを計算する function cal() {
        var コンテナの幅 = parseInt(dom.clientWidth);
        colNumber = Math.floor(containerWidth / wid); //列数 var space = containerWidth - colNumber * wid;
        gap = space / (colNumber + 1); //ギャップを計算する}
}

基本的にコメントを書いてあるので、理解できると思います

アイデアを見てみましょう

1. 渡されたパラメータ、コンテナ、画像配列、画像幅を受け入れる

2. 画像要素を作成し、対応するコンテナに追加します。

3. 各画像の幅と高さを設定し、列数と間隔を計算します

4. 絶対位置を使用して画像を配置し、対応する左と上の値、つまり対応するxとy座標を計算します。

最初の3つのステップは問題ありません。4番目のステップを見てみましょう。

アイデアはこうだ

主なアイデアは、次の画像を配置するための最短の列を見つけることです。これで、最短の列が 2 番目の列に表示されます。

この時点で、画像は 2 番目に短い列に追加されます。次に、最も短い列を探し続けて、画像を追加し続けます。

こうして滝の流れの配置は完成しました。具体的な工程を見てみましょう

まず、画像の列数を計算し、列数と同じ長さの配列を作成し、すべてを 0 で埋めて、後で y 座標を格納するために使用します。

コンテナ内のサブ要素を走査し、ループ内の現在の配列の最小値を見つけます。最小値の位置(列番号)がy座標です。

これでx座標を見つけることができます。

x = (列数 + 1) * 間隔 + 現在の列 * 幅 (渡された実際のパラメータ)

だから、場所がある

毎回配列を更新する必要があることに注意してください。つまり、追加された画像の位置の y 座標を変更し、画像を非同期で読み込む必要があります。

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

以下もご興味があるかもしれません:
  • ネイティブ JS ウォーターフォール プラグイン
  • Macy.js、フロントエンドに不可欠なプラグインのための純粋なネイティブJSウォーターフォールフロープラグイン
  • js カスタム ウォーターフォール レイアウト プラグイン

<<:  nginxで複数のサーバーを簡単に構成する方法

>>:  HTML タグ マーキーはさまざまなスクロール効果を実現します (JS 制御なし)

推薦する

JavaScript でシンプルなクリスマス ゲームを実装する

目次序文成果を達成するコードCSSコードJSコードHTMLコードデモンストレーションのプロセス序文ク...

MySQL 5.7.20 zip インストール チュートリアル

MySQL 5.7.20 zipインストール、具体的な内容は次のとおりです(1)圧縮パッケージを解凍...

MySQL スロークエリを通じて MySQL のパフォーマンスを最適化する方法

アクセス数が増えると、MySQL データベースへの負荷が増大します。MySQL アーキテクチャを使用...

Vueのカスタムディレクティブの詳細なガイド

目次1. カスタム指示とは何ですか? 2. 指示をカスタマイズする方法フック機能3. 応用シナリオ入...

ZabbixはLinuxシステムサービスのプロセスを監視

Zabbix は Linux システムのサービス ユニットを監視するためのルールを自動的に検出します...

ノードイベントループにおけるイベント実行の順序

目次イベントループブラウザ環境イベントループノード環境イベントループ6つのステージ(1)setTim...

CSS3アニメーションを使用して、小さい円から大きい円に拡大し、外側に広がる効果を実現する例

序文この記事では、CSS3アニメーションを使用して、円が小さいものから大きく拡大し、外側に広がる効果...

MySQL ベースのシーケンス実装方法

チームは新しいフレームを交換しました。すべての新しいビジネスでは、新しいフレームワークと新しいデータ...

MySQL 8.0.24 リリースノートのいくつかの改善点

目次1. 接続管理2. オプティマイザレベルでの改善3. 機能の改善4. パフォーマンススキーマの最...

IE6のバグと修正は予防戦略です

元記事:究極の IE6 チートシート: 25 以上の Internet Explorer 6 のバグ...

MySQLの水平および垂直テーブルパーティションの説明

前回の記事で、MySQL ステートメントの最適化には限界があると述べました。MySQL ステートメン...

Linux md5sumコマンドの使い方

01. コマンドの概要md5sum - MD5検証コードを計算して検証するmd5sum コマンドは、...

Linuxアカウントファイル制御管理の詳細な手順

Linux システムでは、ユーザーが手動で作成したさまざまなアカウントに加えて、システムまたはプログ...

HTTP サーバーとクライアントのやり取りをシミュレートする Node.js+postman

目次1. NodeがHTTPサーバーを構築する2. HTTPサーバーがリクエストを取得する1. Po...