目次
ウォーターフォール フロー レイアウトとは何ですか?
Magic solution は、本質的には純粋な CSS ソリューションとみなすこともできます。 is
信頼性の低いソリューション も純粋な CSS ソリューションです。上記のソリューションと比較すると、このソリューションは許容可能ですが、まだいくつか問題があります。
获取图片高度
absolute 计算高度方案
根据下标,来渲染到不同的通道 idx % 4
通过高度计算,然后分通道,避免 absolute
总结
ホームページ ウェブフロントエンド CSSチュートリアル JSやCSSを使ってウォーターフォールフローレイアウトを実装する方法、いくつかの解決策を紹介

JSやCSSを使ってウォーターフォールフローレイアウトを実装する方法、いくつかの解決策を紹介

Jul 16, 2021 pm 07:45 PM
css javascript 滝の流れのレイアウト

この記事では、ウォーターフォール フローのレイアウトを説明し、信頼できる 3 つの JS ソリューションと信頼できない CSS ソリューションを 3 つ紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。

JSやCSSを使ってウォーターフォールフローレイアウトを実装する方法、いくつかの解決策を紹介

実用性の精神で、今日は ウォーターフォール フロー レイアウト (昨日、弟に作り方を尋ねられました。長い間探しても見つかりませんでした。どうやらイントラネット ) に書かれていたことが分かりました。

デモ アドレス: http://www.lilnong.top/static/html/waterfall.html

ウォーターフォール フロー レイアウトとは何ですか?

たとえば、huapetal.comMogujie (以下に写真を掲載しました) では、これらの Web サイトはコンテンツを表示するときにウォーターフォール フロー レイアウトを使用します。

デザインドラフトを表示するページも作成したいと考えています (固定幅、可変高さ)。ウォーターフォール フローは優れたソリューションです。

ウォーターフォール フロー レイアウトの核心はグリッド レイアウトに基づいており、各行に含まれる項目リストの高さはランダムです (高さは独自のコンテンツに応じて動的に変化します)。リストはスタックに配置されます。最も重要なことは、スタック間に不要なスペースがないことです。上の写真を見て、私たちが話している滝の流れのレイアウトがどのようなものかを見てみましょう。

#ウェブサイトMogujie花ペットネットJDVVスクリーンショット スキームサブチャネル絶対
JSやCSSを使ってウォーターフォールフローレイアウトを実装する方法、いくつかの解決策を紹介 JSやCSSを使ってウォーターフォールフローレイアウトを実装する方法、いくつかの解決策を紹介 JSやCSSを使ってウォーターフォールフローレイアウトを実装する方法、いくつかの解決策を紹介 JSやCSSを使ってウォーターフォールフローレイアウトを実装する方法、いくつかの解決策を紹介


##grid、inline、float

Magic solution は、本質的には純粋な CSS ソリューションとみなすこともできます。 is

文書の流れに応じて

、左から右、上から下へ。

#スキームgridinlinefloatbootstrap-gridスクリーンショット

ドキュメント フロー レイアウトには、非常に明白な line という概念があり、行を伸ばすと空白が残り、行は重なりません。ここで最も不思議なのは、フロートのレイアウトです。

DOM 構造

div.list     // 设置 gird 或者 block,注意清除浮动
  div.item   // 设置为 inline 或者 float,使其能流动
    img      // 设置定宽,高度自适应,间距等。
ログイン後にコピー

grid ソリューションの説明

.wrap-waterfall--grid img{vertical-align: top;width: 100px}
.wrap-waterfall--grid .list{
    display: grid;
    grid-gap: 10px;
    /* 可以看到,网格大小,占据位置是需要提前设定的 */
    grid-template-columns: repeat(4, 1fr);
    grid-auto-rows: minmax(50px, auto);
}
ログイン後にコピー
grid は、場合によっては flex よりも使用する方が適しています。たとえば、

行制限を突破する必要があります

が、これは以下のレイアウトなどの固定レイアウトにのみ適用されます。グリッドを使用しない場合は、どのように実装しますか?

JSやCSSを使ってウォーターフォールフローレイアウトを実装する方法、いくつかの解決策を紹介

gird がウォーターフォール フロー レイアウトを実装する計画があります

が、カラー ブロックや画像の変形とトリミングが含まれているものをいくつか見ました。高さの設定には nth-child を使用します。 は怖すぎます

列、フレックス CSS 実装

信頼性の低いソリューション も純粋な CSS ソリューションです。上記のソリューションと比較すると、このソリューションは許容可能ですが、まだいくつか問題があります。

順序は最初に垂直、次に水平です
  • (列)互換性の問題
  • (フレックス)には固定の高さを与える必要があり、設定された列は設定値を超えており、設定欄は入力できません。
JSやCSSを使ってウォーターフォールフローレイアウトを実装する方法、いくつかの解決策を紹介 JSやCSSを使ってウォーターフォールフローレイアウトを実装する方法、いくつかの解決策を紹介 JSやCSSを使ってウォーターフォールフローレイアウトを実装する方法、いくつかの解決策を紹介 JSやCSSを使ってウォーターフォールフローレイアウトを実装する方法、いくつかの解決策を紹介
スキームスクリーンショット
フレックス
JSやCSSを使ってウォーターフォールフローレイアウトを実装する方法、いくつかの解決策を紹介 1JSやCSSを使ってウォーターフォールフローレイアウトを実装する方法、いくつかの解決策を紹介
列スキーム

は当然サポートされており、親の

columns: 4; column-gap: 6px;

に設定するだけで済みます。

フレックス スキーム

flex-flow: 列の折り返し;高さ: 2300px;

デフォルトは水平配置ですが、垂直配置に変更できます。配置と折り返しを許可し、コンテンツを固定の高さで折り返します。 絶対チャネル高さ計算スキーム

信頼性の高いスキーム

## スキームabsolute残りのチャンネル高さチャンネルの計算ヘッドのスクリーンショット
1JSやCSSを使ってウォーターフォールフローレイアウトを実装する方法、いくつかの解決策を紹介 1JSやCSSを使ってウォーターフォールフローレイアウトを実装する方法、いくつかの解決策を紹介 1JSやCSSを使ってウォーターフォールフローレイアウトを実装する方法、いくつかの解決策を紹介#

这里的方案就靠谱起来了,可以满足我们使用要求。

我们来回忆一下我们的需求:展示一些内容,内容有特性定宽,不定高。不定高一般是因为内容长度或者高度不一致导致的,常见内容又分为两种文字和图片

  • 文字的话,在没有异步字体的情况下,可以理解为同步就可以获取到盒子高度。

  • 图片的话,因为加载是异步的,所以获取盒子的真实高度也是异步的。但是这里一般分为两种情况

  • 无高度,那么可以通过onload来监听图片加载完成。等图片加载完成再去获取高度。

  • 有高度,这种方案一般用在封面图、或者文章中,在上传图片的时候会保存原图尺寸,这个时候我们就可以直接使用已有数据。

获取图片高度

// 用于获取图片的真实高度
naturalHeight: 1180
// 用于获取图片的真实宽度
naturalWidth: 1200

//用户获取图片当前的渲染高度(会受 css 影响)
height: 98
//用户获取图片当前的渲染宽度(会受 css 影响)
width: 100

// 可返回浏览器是否已完成对图像的加载。如果加载完成,则返回 true,否则返回 fasle。
complete 属性
// 可以监听到图片加载完成的动作
onload
ログイン後にコピー

基于上面的内容,那我们可以先判断 complete 属性,

function getImageSize(img){
    if(img.complete){
        return Promise.resolve({
            naturalHeight: img.naturalHeight,
            naturalWidth: img.naturalWidth,
            height: img.height,
            width: img.width,
        })
    }else{
        return new Promise((resolve, reject)=>{
            img.addEventListener('load', ()=>{
                resolve({
                    naturalHeight: img.naturalHeight,
                    naturalWidth: img.naturalWidth,
                    height: img.height,
                    width: img.width,
                })
            })
        })
    }
}
/*
// 测试用例
el = document.createElement('img');
el.src = 'http://cors-www.lilnong.top/favicon.ico?'+Math.random()

getImageSize(el).then(console.log).catch(console.error)
setTimeout(()=>getImageSize(el).then(console.log).catch(console.error), 1000)
*/
ログイン後にコピー

absolute 计算高度方案

因为普通的布局已经无法满足我们的需求,所以我们可以考虑通过 position: absolute 来使内容通过绝对定位来显示

核心操作就是维护每个元素的 left、top,然后使用 left 和 top 去渲染到正确位置。

getListPosition(){
    // 视口宽度 / 每列宽度 得出划分为几列
    let col = this.screenWidth / this.itemWidth >> 0;
    var arr = [];
    for(var i = 0; i < col; i++) arr.push({
        list: [],
        height: 0,
    })
    // 遍历所有元素
    this.listInfo.forEach((item,idx)=>{
        // 找到最低的一列
        var colIndex = 0;
        for(var i = 1; i < col; i++){
            if(arr[colIndex].height > arr[i].height){
                // colItem = arr[i]
                colIndex = i
            }
        }
        // 修改元素的信息
        // 所属列
        item.line = colIndex;
        // 计算之后的 top 距离
        item.top = arr[colIndex].height+ &#39;px&#39;;
        // 计算之后的 left 距离
        item.left = colIndex * (this.itemWidth + 10) + &#39;px&#39;

        // 累加操作
        arr[colIndex].list.push(item);
        arr[colIndex].height += item.height + 10;
    })
    return arr
},
ログイン後にコピー

通过计算,我们可以到,瀑布流布局下每个元素的位置,通过绝对定位就可以实现。

根据下标,来渲染到不同的通道 idx % 4

因为上个方案用到了绝对定位,那么有没有不用绝对定位的方案呢?回到我们的问题点上 定宽,不定高,那我们完全可以通过分开渲染放弃 absolute 来实现。

jsGroupList(){
    return this.list.reduce((s,n,idx)=>{
        // 根据下标,直接分配所属列
        s[idx % 4].push({idx: idx, item: n})
        return s
    }, [[],[],[],[],])
},
ログイン後にコピー

看开头是实现类似的功能的,但是有一个弊端(快来评论区回复呀)。

通过高度计算,然后分通道,避免 absolute

因为上一个方案是按下标分类的,其实瀑布流是按高度分类的,所以我们分类条件换成最低的列。

jsGroupHeightList(){
    var list = [
        {height: 0, list: []},{height: 0, list: []},
        {height: 0, list: []},{height: 0, list: []},
    ]
    // 遍历每个元素
    for(var i = 0; i < this.list.length; i++){
        // 当元素有大小的时候在进行操作。
        if(!this.listInfo[i].height) return list;
        // 默认第一个通道是最小高度列
        var minHeightItem = list[0];
        // 计算最小高度列
        list.forEach(v=>{
            if(v.height < minHeightItem.height) minHeightItem = v
        })
        // 把新的元素高度累加到列中。
        minHeightItem.height += this.listInfo[i].height
        // 把新的元素push到列中
        minHeightItem.list.push({idx: i, item: this.list[i]})
    }
    return list;
},
ログイン後にコピー

总结

好了,到这里我能想到的方案就都介绍了。你还有什么方案吗?咱们可以在评论区讨论一下可行性。接下来就是我们的方案总结了。

方案 优点 缺点 点评
columns 实现简单、纯 CSS 方案 兼容性 -
flex - 需要固定高度,填充难以控制等问题 -
float、inline、bootstrapGrid - - 没点大都用不出这方案
grid - - 可以nth-child模拟实现、或者等待兼容性 masonry
absolute 效果好 - JS计算无限可能
js普通通道 - 填充难以控制 -
js优化通道 效果好、无绝对定位 在出现夸列等操作的时候不是很好控制 -

更多编程相关知识,请访问:编程入门!!

以上がJSやCSSを使ってウォーターフォールフローレイアウトを実装する方法、いくつかの解決策を紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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)

Vue におけるプレースホルダーの意味 Vue におけるプレースホルダーの意味 May 07, 2024 am 09:57 AM

Vue.js では、placeholder 属性は、input 要素のプレースホルダー テキストを指定します。これは、ユーザーがコンテンツを入力していないときに表示され、入力のヒントや例を提供し、フォームのアクセシビリティを向上させます。その使用方法は、input 要素にプレースホルダー属性を設定し、CSS を使用して外観をカスタマイズすることです。ベスト プラクティスには、入力に関連すること、短く明確にすること、デフォルトのテキストを避けること、アクセシビリティを考慮することが含まれます。

jsでのスパンの意味は何ですか jsでのスパンの意味は何ですか May 06, 2024 am 11:42 AM

スパン タグは、テキストにスタイル、属性、または動作を追加できます。 色やフォント サイズなどのスタイルを追加するために使用されます。 idやclassなどの属性を設定します。クリック、ホバーなどの関連する動作。さらに処理または引用するためにテキストにマークを付けます。

jsでレムは何を意味しますか jsでレムは何を意味しますか May 06, 2024 am 11:30 AM

CSS の REM は、ルート要素 (html) のフォント サイズに対する相対単位です。次の特性があります: ルート要素のフォント サイズに相対し、親要素の影響を受けません。ルート要素のフォント サイズが変更されると、REM を使用する要素もそれに応じて調整されます。任意の CSS プロパティとともに使用できます。 REM を使用する利点は次のとおりです。 応答性: さまざまなデバイスや画面サイズでもテキストを読みやすい状態に保ちます。一貫性: Web サイト全体でフォント サイズが一貫していることを確認します。スケーラビリティ: ルート要素のフォント サイズを調整することで、グローバル フォント サイズを簡単に変更できます。

vueに画像を導入する方法 vueに画像を導入する方法 May 02, 2024 pm 10:48 PM

Vue に画像を導入するには、URL、require 関数、静的ファイル、v-bind ディレクティブ、CSS 背景画像の 5 つの方法があります。動的画像は Vue の計算プロパティまたはリスナーで処理でき、バンドルされたツールを使用して画像の読み込みを最適化できます。パスが正しいことを確認してください。そうでないと、読み込みエラーが表示されます。

プロンプトをjsでラップする方法 プロンプトをjsでラップする方法 May 01, 2024 am 06:24 AM

JavaScript でプロンプト() メソッドを使用する場合、次の 3 つの方法で改行を実現できます。 1. 改行する位置に「\n」文字を挿入します。 2. 行に改行文字を使用します。プロンプトテキスト; 3. CSS の "white" -space: pre" スタイルを使用して改行を強制します。

jsのノードとは何ですか jsのノードとは何ですか May 07, 2024 pm 09:06 PM

ノードは、HTML 要素を表す JavaScript DOM 内のエンティティです。これらはページ内の特定の要素を表し、その要素にアクセスして操作するために使用できます。一般的なノード タイプには、要素ノード、テキスト ノード、コメント ノード、ドキュメント ノードなどがあります。 getElementById() などの DOM メソッドを通じて、ノードにアクセスし、プロパティの変更、子ノードの追加/削除、ノードの挿入/置換、ノードのクローン作成などの操作を行うことができます。ノードトラバーサルは、DOM 構造内を移動するのに役立ちます。ノードは、ページ コンテンツ、イベント処理、アニメーション、およびデータ バインディングを動的に作成するのに役立ちます。

ブラウザのプラグインは何語で書かれていますか? ブラウザのプラグインは何語で書かれていますか? May 08, 2024 pm 09:36 PM

ブラウザ プラグインは通常、次の言語で作成されます。 フロントエンド言語: JavaScript、HTML、CSS バックエンド言語: C++、Rust、WebAssembly その他の言語: Python、Java

vscodeで不明な属性を設定する方法 vscodeで不明な属性を設定する方法 vscodeで不明な属性を設定する方法 vscodeで不明な属性を設定する方法 May 09, 2024 pm 02:43 PM

1. まず、左下隅にある設定アイコンを開き、設定オプションをクリックします。 2. 次に、ジャンプしたウィンドウで CSS 列を見つけます。 3. 最後に、不明なプロパティ メニューのドロップダウン オプションをエラー ボタンに変更します。 。

See all articles