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 制御なし)

推薦する

WeChatアプレットが計算機機能を実装

WeChatミニプログラムはますます人気が高まっています。多くの大学生が独学で学んでいるのも見てきま...

雨滴効果を実現する JavaScript キャンバス

この記事では、雨滴効果を実現するためのJavaScriptキャンバスの具体的なコードを参考までに紹介...

デスクトップ仮想化を実現するために Hyper-V を展開する手順 (グラフィック チュートリアル)

Hyper-V を展開するためのハードウェア要件は次のとおりです。 64 ビット プロセッサ、具体...

Linuxの一般的なコマンドでLinuxのmoreコマンドを使用する方法

more は、最もよく使用されるツールの 1 つです。最も一般的な使用方法は、出力コンテンツを表示し...

vueの実践的な応用におけるvuexの永続性の詳細な説明

目次vuex 永続性要約するvuex 永続性vuex: ブラウザを更新すると、vuexの状態は初期状...

CSS を使用して ul と li の水平配置を実現する 2 つの方法

li はブロックレベル要素であり、デフォルトで 1 行を占めるため、水平方向の配置を実現する場合は、...

MySQL 起動時に報告される ERROR:2002 の分析と解決方法

序文この記事は主にMySQL起動エラー2002の分析と解決方法を紹介しています。参考と勉強のために共...

Apple 電卓の JS 実装

この記事の例では、Appleの電卓を実装するためのJSの具体的なコードを参考までに共有しています。具...

HTMLでキーワードを強調表示するのに最適なソリューション

最近、プロジェクトに取り組んでいるときに、Web ページ上のキーワードを強調表示する機能に遭遇しまし...

Navicat を仮想マシン MySQL に接続する際によくあるエラーと解決策

質問1 解決するサービスを開始します: service mysqld start; /sbin/ip...

vue3 のストアを使用してスクロール位置を記録する例

目次全体的な効果コンテナのスクロールイベントをリッスンするストア内の構成ページが戻るときのスクロール...

MySQL で特定の親行のすべての子行を見つけるソリューション

序文注: テストデータベースのバージョンはMySQL 8.0ですテーブルを作成し、ユーザー scot...

Nginx 静的サービス設定の詳細な説明 (ルートとエイリアスの指示)

静的ファイルNginx は高いパフォーマンスで知られており、フロントエンドのリバース プロキシ サー...

Vue プロジェクトでよく使用されるツール機能の概要

目次序文1. カスタムフォーカスコマンド1. 方法1 2. 方法2 3. 方法3 2. 入力ボックス...