響應式布局下關于gird柵格布局的一些構思

1、傳列數,根據列數計算元素容器寬度

好處是子元素可以寫百分比寬度,不用固定某一種寬度,反正知道列數通過計算間距就能得到外層容器的寬度。
舉個簡單的例子:

(ps:以下用例皆在html中去模擬,就不另外起react或者vue應用了,主打一個輕便。)

在瀑布流下面的柵格布局

  • 先嘗試固定列數3,并且固定寬高100px
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><style>.item {color: white;background-color: violet;width: 100px;height: 100px;margin: 2px;text-align: center;}.waterfall {display: flex;flex-wrap: wrap;}</style></head><body><div class="grid waterfall"></div></body><script>const column = 3;const list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,];const UIList = list.map((item) => {return `<div class="item">${item}</div>`;});const renderList = new Array(column);const finalList = UIList.forEach((item, childIndex) => {const realIndex = childIndex % column;if (!renderList[realIndex]) {renderList[realIndex] = [];}renderList[realIndex].push(item);console.log("renderList", renderList);});const html = renderList.map((item) => {return `<div class="waterfall-item">${item.join("")}</div>`;});document.querySelector(".grid").innerHTML = html.join("");</script>
</html>

得到的結果:
在這里插入圖片描述
好,寫法ok,讓我們試試列數固定(通過api傳入),子元素寬度根據公式計算呢。
理論計算公式:元素寬度 = (屏幕寬度 - 左右間距寬度 - 列之間的間距)/ 列數
注意3列的話,計算列的寬度就是 2個列寬,自己體會。
在這里插入圖片描述
好!理論成立,實踐開始~!

我們修改下css,讓item元素的寬高不在固定。

   .item {color: white;background-color: violet;height: auto;margin: 2px;text-align: center;}

在這里插入圖片描述
于是我們得到了上面一坨,因為寬度和高度根據內容自適應了,所以只包裹了填充的數字。

嗯,在意料之中。
在這里插入圖片描述

那么關鍵的計算來了,且看下面的js:

    const column = 3;   // 列數const screenWith = window.innerWidth; // 屏寬const paddingLeft = 12; // 頁面左間距const paddingRight = 12; // 頁面右間距const columnWith = 8; // 列之間的間距

我們先設定頁面左右間距為12(px),列間距為8(px).
然后我們就可以計算單個元素容器寬度了:

  // 四舍五入并且精確到2位小數,防止列數過多而誤差過大const itemWidth =Math.round(((screenWith - paddingLeft - paddingRight - columnWith * (column - 1)) /column) *100) / 100;

然后將元素的間距設置成和js里寫的一致(當然你也可以把他們開放成動態的api):
完整demo:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><style>* {margin: 0;padding: 0;}.item {color: white;background-color: violet;height: 50px;margin-bottom: 8px;text-align: center;}.item:last-child {margin-bottom: 0;}.waterfall {display: flex;flex-wrap: wrap;padding: 0 12px;}.waterfall-item {margin-left: 8px;}.waterfall-item:first-child {margin-left: 0;}</style></head><body><div class="grid waterfall"></div></body><script>const column = 3;const list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,];const screenWidth = window.innerWidth;const paddingLeft = 12;const paddingRight = 12;const columnWidth = 8;const itemWidth =Math.round(((screenWidth - paddingLeft - paddingRight - columnWidth * (column - 1)) /column) *100) / 100;console.log("itemWidth", itemWidth);const UIList = list.map((item) => {return `<div class="item" style="width: ${itemWidth}px;">${item}</div>`;});const renderList = new Array(column);const finalList = UIList.forEach((item, childIndex) => {const realIndex = childIndex % column;if (!renderList[realIndex]) {renderList[realIndex] = [];}renderList[realIndex].push(item);});const html = renderList.map((item) => {return `<div class="waterfall-item">${item.join("")}</div>`;});document.querySelector(".grid").innerHTML = html.join("");</script>
</html>

效果:
在這里插入圖片描述

測試高度不一樣的柵格效果

增加修改以下代碼,意思是給5的倍數的子元素高度設置到100px

   .more-height {height: 100px;}const UIList = list.map((item, index) => {return `<div class="item ${index % 5 === 0 ? "more-height" : ""}" style="width: ${itemWidth}px;">${item}</div>`;});

效果:
在這里插入圖片描述
不錯,符合預期~

如果我們連列數colum都不想傳了咋辦?能不能自適應屏幕尺寸設置列數

答案當然是肯定的,前提你要和設計師商量好什么尺寸下出多少列。

比如我們規定:
320px以下,展示2列
320~600px, 展示3列
600~920px,展示4列
920px以上,還是4列,但是容器寬度增加,這時候就需要子元素也做了響應式,否則會造成容器空曠很多。
使用以下方法,動態確定colum列數:

 let column = 2;function handleResize() {const screenWidth = window.innerWidth;if (screenWidth < 320) {column = 2;} else if (screenWidth >= 320 && screenWidth < 600) {column = 3;} else {column = 4;}}// 監聽窗口大小變化window.addEventListener("resize", handleResize);// 頁面加載時執行一次屏幕尺寸判斷handleResize();

看看效果:
320以下展示2行:
在這里插入圖片描述

320~600 展示3行:
在這里插入圖片描述
600~920 展示4行:
在這里插入圖片描述
920往上還是4行,但是單元格寬度增加:
在這里插入圖片描述

上面的唯一缺點大概是因為是js控制,頁面只要不刷新,即使尺寸變了也不會去動態的計算列數,在移動端影響不大~

2、根據子元素寬度,自動適應列數

如果是采用這種方案,那么子元素必須顯示的定義了寬度,即只有子元素存在定義的寬度時才能正確計算。

這種方法則對子元素要求很高,需要子元素定寬并且適配了各種各樣屏幕寬度下的尺寸。

我們的計算規則則變成了:
列數 = (屏幕寬度 - 頁面左右間距- (列數-1) *列間距) / 子元素寬度(固定)
該公式解出來變成:
列數 = (屏寬 - 左右間距 + 列間距) / (子元素寬度+列間距)

假定我們各項數據值是:

    const screenWith = window.innerWidth;const paddingLeft = 12;  // 左間距const paddingRight = 12;  // 右間距const columnWidth = 8;  // 列寬const itemWidth = 120; // 子元素寬度

計算規則如下:

    // 列數必須向下取整,否則會放不下column = Math.floor((screenWith - paddingLeft - paddingRight + columnWidth) /(itemWidth + columnWidth));

在這里插入圖片描述
像上面這種就是剩余寬度明顯不夠一列被向下取整給截斷了。
那么有沒有很好的解法呢,目前看來如果子元素定寬,不太好自適應的。

非要定寬可以考慮:
1、列間距自適應
2、整體布局居中

另外在設置子元素寬度時
計算失敗的幾種情況:
1、子元素定義了100%寬度,旨在根據容器寬度去定寬,但是容器也沒有定寬。
2、子元素沒有設置寬度導致計算失敗,這時候會寫一個兼容值,那么固定就會獲取這個兼容值。

以上就是個人碎碎念~

希望有所收獲!

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43154.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43154.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43154.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python 獲取 SQL 指紋和 HASH 值

前言 本文介紹一個提取 SQL 指紋的方法&#xff0c;就是將 SQL 語句的條件轉換為 &#xff1f;可用于脫敏和 SQL 聚類分析的場景。 1. 工具安裝 這里用到的工具&#xff0c;就是 pt 工具集中的 pt-fingerprint 含在 Percona Toolkit 中&#xff0c;安裝方法可參考 Percona T…

python7:裝飾器

目錄 1.調用外部程序os.system-阻塞式調用subprocess-python中的模塊 2.裝飾器前戲作用域&#xff08;1&#xff09;全局和局部-就近原則&#xff08;2&#xff09;嵌套作用域&#xff08;3&#xff09;內置作用域、變量 高階函數&#xff1a;函數是最高級的對象&#xff08;1&…

海外媒體投稿:5個軟文代發經典案例,教大家獲得突破

隨著互聯網的飛速發展&#xff0c;軟文代發成為一種高效的推廣方法。下面我們就詳細介紹五個成功軟文代發推廣實例&#xff0c;致力于幫助讀者把握有關方法&#xff0c;完成突破。 第一實例&#xff1a;社交網絡散播在如今社交媒體時代&#xff0c;軟文代發能夠通過社交平臺迅速…

nodejs實現:支付寶訂單查詢

nodejs實現&#xff1a;支付寶訂單查詢&#xff1b; 原生http請求&#xff0c;不使用三方庫&#xff1b; 代碼如下&#xff1a; const https require(https); const crypto require(crypto); const querystring require(querystring);// 支付寶公共參數 const PRIVATE_KE…

[C++] 輕熟類和對象

類的定義 格式規范 class為定義類的關鍵字&#xff0c;后有類名&#xff0c;類的主體存于{}中&#xff1b;類定義結束時后面的分號不能省略&#xff1b;類體的內容成為類的成員&#xff0c;類中的變量成為成員變量&#xff0c;函數成為方法或成員函數&#xff1b;C兼容C語言的…

微軟 Edge 瀏覽器全解析

微軟 Edge 是微軟推出的一個現代化瀏覽器,繼承了 Internet Explorer(IE)的部分功能,但在速度、安全性和兼容性方面做出了很大改進。下面是對微軟 Edge 瀏覽器的詳細解析,包括其特點、安裝、配置和常見問題的解答。 微軟 Edge 瀏覽器的特點 基于 Chromium 內核 Edge 瀏覽…

SpringBoot配置flyway

背景 目前我們的項目代碼都會交由Git、SVN等版本管理工具進行管理&#xff0c;但是我們的sql腳本&#xff0c;尤其是各類ddl腳本并沒有進行版本的管理&#xff08;python的web框架Django默認就提供了類似的工具&#xff0c;從一開始就鼓勵開發者通過版本管理的方式進行數據庫的…

C++中的多重繼承和虛繼承:橫向繼承、縱向繼承和聯合繼承;虛繼承

多重繼承 A.橫向多重繼承&#xff1a; B.縱向多重繼承&#xff1a; C.聯合多重繼承&#xff1a; 因為 single 和 waiter 都繼承了一個 worker 組件&#xff0c;因此 SingingWaiter 將包含兩個 worker 組件&#xff0c;那么將派生類對象的地址賦給基類指針將出現二義性 那么如何…

idea http client插件上傳文件,并忽略https證書驗證

上傳文件 ### 傳臨時素材 圖片 POST https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token{{access_token}}&typeimage Content-Type: multipart/form-data; boundary----WebKitFormBoundarywKUX3Xj6aL5Wssnb------WebKitFormBoundarywKUX3Xj6aL5Wssnb Conten…

從Helm到 Operator:Kubernetes應用管理的進化

&#x1f9f0;Helm 的作用 在開始前需要先對 kubernetes Operator 有個簡單的認識。 以為我們在編寫部署一些簡單 Deployment 的時候只需要自己編寫一個 yaml 文件然后 kubectl apply 即可。 apiVersion: apps/v1 kind: Deployment metadata: labels: app: k8s-combat …

去水印小程序源碼修復版-前端后端內置接口+第三方接口

去水印小程序源碼&#xff0c;前端后端&#xff0c;內置接口第三方接口&#xff0c; 修復數據庫賬號密碼錯誤問題&#xff0c;內置接口支持替換第三方接口&#xff0c; 文件挺全的&#xff0c;可以添加流量主代碼&#xff0c;搭建需要準備一臺服務器&#xff0c;備案域名和http…

農牧行業CRM洞察:打造營、銷、服一體化數字營銷平臺

01、行業應用背景 保持企業活力&#xff0c;支撐業務單元協調發展&#xff0c;穩定核心產品競爭力&#xff0c;將成為農牧行業企業數字化、數智化建設的指導方向。 積極發揮數據在生產、流通、消費各個環節的決策支撐&#xff0c;為農牧企業特別是多業態集團型企業&#xff0…

JVM:類的生命周期

文章目錄 一、介紹二、加載階段三、連接階段1、驗證階段2、準備階段3、解析階段 四、初始化階段 一、介紹 類的生命周期描述了一個類加載、連接&#xff08;驗證、準備和解析&#xff09;、初始化、使用、卸載的整個過程。 二、加載階段 加載&#xff08;Loading&#xff09…

全棧業務開發入門——登錄業務接口

業務已上傳則資源 實現登錄業務的前后端聯調&#xff0c;前端點擊登錄按鈕向后端發送一個請求&#xff0c;后端調用接口向前端響應結果 效果如下&#xff1a; 設計環境&#xff1a;springbootmybatisvue3axios 一.前端設計 1.基于vue3腳手架創建項目&#xff0c;搭建項目結構…

LAZYNVIM學習使用筆記

文章目錄 1. 前言VIM的模式快捷鍵參考 1. 前言 習慣使用vscode進行代碼編輯&#xff0c;無意中刷到lazynvim&#xff0c;感覺功能強大&#xff0c;于是下載、安裝&#xff0c;學習使用一下&#xff0c;本篇主要記錄學習使用lazynvim的一些要點&#xff0c;防止遺忘。 持續更新…

帝特(DTECH)USB轉RS485/422串口線在Ubuntu系統中的安裝

因為測試需要&#xff0c;買了一根帝特&#xff08;DTECH&#xff09;USB轉RS485/422串口線&#xff0c;今天測試了一下在Ubuntu 22.04系統上的使用。帝特的網站上提供了驅動程序&#xff0c;下載以后發現接口芯片是CP2102&#xff0c;廠商只提供了Linux內核2.6和3.x版本的驅動…

1703:發現它,抓住它

網址如下&#xff1a; OpenJudge - 1703:發現它&#xff0c;抓住它 測&#xff0c;這題差點讓我去世 用了一堆方法來做 后面現學了并查集&#xff0c;用了并查集來做&#xff0c;因為縮短路徑的方法不好&#xff0c;還是超時了 后面換了一種縮短路徑的方法 先上代碼 解法一…

游戲AI的創造思路-技術基礎-情感計算(2)

上一篇我們介紹了情感計算的基本支持&#xff0c;本篇將呈現情感計算在游戲AI中的使用實例~~~ 目錄 7. 情感計算在游戲AI中的運用實例 7.1. RPG游戲中的運用實例 7.1.1. 實例背景 7.1.2. AI情感計算系統 7.1.3. 引導用戶執行任務 7.1.4. 推動游戲劇情發展 7.1.5. 實例效…

用Python玩轉Excel的五大功能!

在日常的數據處理工作中&#xff0c;Excel無疑是一個強大的工具。然而&#xff0c;當數據量較大或需要自動化處理時&#xff0c;Python憑借其強大的庫支持&#xff0c;如pandas和openpyxl&#xff0c;能夠更高效地處理Excel文件。 本文將介紹Python中常用的五種Excel操作**&am…

一個用于在虛擬桌面下跑chrome的docker鏡像

制作了一個用于跑chrome的docker鏡像xvfb-chrome&#xff0c;主要是為了支持能夠通過xvfb或者wayland&#xff0c;給chrome提供一個虛擬的桌面環境。 這個鏡像主要支持&#xff1a; 將chrome --remote-debugging-port映射到docker的host&#xff0c;可以在host直接訪問。支持…