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

推薦する

Typescriptを使用してローカルストレージをカプセル化する方法

目次序文ローカルストレージの使用シナリオ使用上の問題解決機能性有効期限を追加データ暗号化を追加する命...

Vueでaxiosを簡単にカプセル化する方法

Vueにaxiosを挿入する 'axios' から axios をインポートします。...

Vueのvue-tree-colorコンポーネントの組織構造図の事例を詳しく解説

目次ネプローダーをインストールするプラグインのインポート始める配置折りたたみディスプレイノードをクリ...

Docker を使用した MySQL のデプロイの詳細説明 (データ永続化)

この記事では、Docker を使用して MySQL をデプロイし、データを保持する方法について簡単に...

CSS3で作られたレインボーボタンスタイル

結果: 実装コード: html <div class="buttons"&...

CSS を使用して 3 列のアダプティブ レイアウト (両側は固定幅、中央はアダプティブ) を実現します。

いわゆる 3 列適応レイアウトとは、両側の幅が固定され、中央のブロックの幅が適応されることを意味しま...

HTML スクロールバーのテキストエリア属性の設定

1.オーバーフローコンテンツのオーバーフロー設定(設定されたオブジェクトにスクロールバーを表示するか...

Linux で MySQL のスケジュールバックアップを実装する方法

実際のプロジェクトでは、緊急事態を防ぐためにデータベースを頻繁にバックアップする必要があります。しば...

JSX を使用してカルーセル コンポーネントを実装する方法 (フロントエンドのコンポーネント化)

JSX を使用してコンポーネント システムを構築する前に、例を使用してコンポーネントの実装原理とロ...

HTML 9グリッドレイアウトの実装方法

ウェブサイトのレイアウトの多様化は、当社のフロントエンドの得意分野です。最近、UC ブラウザのデフォ...

Linux のバックグラウンドで実行するいくつかの方法 (まとめ)

1. ノーフープハングアップ信号を無視してプログラムを実行する追加メモnohup コマンドは、ハン...

WeChatミニプログラムユーザー認証による携帯電話番号の取得(getPhoneNumber)

序文ミニプログラムには、ユーザーを取得するための非常に便利な API があり、getPhoneNum...

tomcat ログ ディレクトリ内のログ ファイルの分析 (概要)

tomcat が起動されるたびに、次のログ ファイルがログ ディレクトリに自動的に生成され、日付順...

DockerでEurekaを設定する方法

ユーレカ: 1. JDKイメージを構築するEurekaコンテナを起動するjdkフォルダと必要なファイ...

HTML ページジャンプコード

次のコードを index.html などのデフォルトのホームページ ファイルとして保存し、ルート デ...