淺談聖杯佈局和雙飛翼佈局

来源:https://www.cnblogs.com/helloxiaoduan/archive/2018/03/06/8516699.html
-Advertisement-
Play Games

前不久刷文章的時候看到了一篇關於聖杯和雙飛翼的佈局介紹,自己也是去學習了一下,這篇博文也是我為了總結自己學習的知識,嘻嘻。 國外提出的聖杯佈局和阿裡提出的雙飛翼都是為瞭解決三欄佈局,中間內容部分自適應並且最先被渲染,兩邊的寬度固定。這兩種佈局呈現的結果是一樣的,如下圖所示: 下麵將展示代碼公有部分: ...


前不久刷文章的時候看到了一篇關於聖杯和雙飛翼的佈局介紹,自己也是去學習了一下,這篇博文也是我為了總結自己學習的知識,嘻嘻。

國外提出的聖杯佈局和阿裡提出的雙飛翼都是為瞭解決三欄佈局,中間內容部分自適應並且最先被渲染,兩邊的寬度固定。這兩種佈局呈現的結果是一樣的,如下圖所示:

image

下麵將展示代碼公有部分:

HTML:

<div class="header">header內容</div>
<div class="wrap">
    <div class="center">中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容</div>
    <div class="left"></div>
    <div class="right"></div>
</div>
<div class="footer">footer內容</div>

CSS:

* {
  margin: 0;
  padding: 0;
}   
.header, .footer {
  width: 100%;
  font-size: 20px;
  line-height: 100px;
  text-align: center;
  color: #fff;
  background-color: #666;
}
.center {
  width: 100%;
  height: 200px;
  background-color: yellow;
}
.left {
  width: 200px;
  height: 200px;
  background-color: red;
}
.right {
  width: 150px;
  height: 200px;
  background-color: blue;
}

瀏覽器渲染出來的樣式如下:

image

現在瀏覽器顯示的結果中並沒有實現wrap部分顯示在一行中。在css中利用margin來實現wrap部分顯示在一行中。

CSS:

/* 此處僅顯示修改了的代碼 */

/*
 * 註意: 要清浮動,不然wrap的高度會坍塌
 */
.wrap {
  zoom: 1;
}
.wrap:after {
  content: '';
  display: block;
  clear: both;
}
.center {
  width: 100%;
  height: 200px;
  background-color: yellow;
  float: left;
}
.left {
  width: 200px;
  height: 200px;
  background-color: red;
  float: left;
  margin-left: -100%;   // 是left能夠移到最左邊
}
.right {
  width: 150px;
  height: 200px;
  background-color: blue;
  float: left;
  margin-left: -150px;  // 是left能夠移到最右邊
}

image

此時怎麼感覺就已經做完了,別急我們將left和right設置opacity來觀察一下center中內容的顯示的情況。

image

現在可以看到center的內容被left和right給遮擋了。聖杯和雙飛翼不同之處就是在這個問題的解決方法。

聖杯佈局:

為瞭解決上面一個問題,我們的聖杯佈局就先是使用padding來將wrap內容向中間擠。padding設置的值是[padding: 0 rightWidth 0 leftWidth]

增加padding後顯示的結果是:

image

然後我們使用position:relativeleft和right移動

CSS:

/* 此處僅顯示修改過的代碼 */

.left {
  width: 200px;
  height: 200px;
  background-color: red;
  float: left;
  margin-left: -100%;
  position: relative;
  left: -200px;
}
.right {
  width: 150px;
  height: 200px;
  background-color: blue;
  float: left;
  margin-left: -150px;
  position: relative;
  left: 150px;
}

image

這樣就實現了聖杯佈局。但是聖杯佈局存在一個問題,在這裡為了消除演示的其他影響,我們將center的文字去掉,當屏幕可視區域的寬度小於某個最小值(left-width * 2 + right-width)的時候,佈局會被打亂,如下圖:

image

正是因為聖杯佈局會有這樣的問題,所以阿裡提出了雙飛翼,在介紹雙飛翼之前我們用絕對定位的方式來實現三欄效果。

絕對定位

html代碼和前面的是一樣的

CSS:

* {
  margin: 0;
  padding: 0;
}
.header, .footer {
  width: 100%;
  font-size: 20px;
  line-height: 100px;
  text-align: center;
  color: #fff;
  background-color: #666;
}
// wrap設置成相對定位
.wrap {
  position: relative;
}
.center {
  height: 200px;
  background-color: yellow;
  margin: 0 150px 0 200px;  // 對center設置margin使left和right不遮擋center的內容
}

/*
 * left和right都使用絕對定位來實現left、right、center顯示在一行
 */
.left {
  width: 200px;
  height: 200px;
  background-color: red;
  position: absolute;
  top: 0;
  left: 0;
}
.right {
  width: 150px;
  height: 200px;
  background-color: blue;
  position: absolute;
  top: 0;
  right: 0;
}

這樣實現的效果就和聖杯佈局實現的結果一樣,而且不會有聖杯中的視窗寬度最小值,既然這樣就行了,那為什麼阿裡要提出雙飛翼呢?

絕對定位這種解決方法是解決了聖杯佈局中的問題,但是他又引入了另外一個問題,我們講left中的height設置成height: 300px;

image

這下就知道絕對定位的方式的問題在哪了,絕對定位是的left和right都脫離了文檔流,left和right的高度不會將wrap的高度撐開。

接下來我們介紹阿裡提出的雙飛翼佈局。

雙飛翼

雙飛翼佈局是通過設置margin來實現的。要實現雙飛翼佈局,HTML的dom結構要改變一點,代碼如下:

HTML:

<div class="header">header內容</div>
<div class="wrap">
    <div class="center">
        <div class="center-content">中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容中間內容</div>
    </div>
    <div class="left"></div>
    <div class="right"></div>
</div>
<div class="footer">footer內容</div>

在這裡我們設置center-content的margin: 0 right-width 0 left-width;,代碼如下:

* {
  margin: 0;
  padding: 0;
}
.header, .footer {
  width: 100%;
  font-size: 20px;
  line-height: 100px;
  text-align: center;
  color: #fff;
  background-color: #666;
}
.wrap {
  zoom: 1;
}
.wrap:after {
  content: '';
  display: block;
  clear: both;
}
.center {
  width: 100%;
  height: 200px;
  background-color: yellow;
  float: left;
}
// 對內容設置左右margin值
.center-content {
  margin: 0 150px 0 200px;
}
.left {
  width: 200px;
  height: 200px;
  background-color: red;
  float: left;
  margin-left: -100%;
}
.right {
  width: 150px;
  height: 200px;
  background-color: blue;
  float: left;
  margin-left: -150px;
}

image

小段語言組織能力有限,隨筆語句可能太過雜亂,望大家諒解。

上面的內容純屬小段的個人見解,如果有誤,還請指出,感激。^-^


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 小程式的客服是一個比較強大的功能,可以和用戶進行交流,可以圖文引導用戶打開連接,比如關註公眾號,可以圖文回覆用戶。 需求,不如我有兩個客服按鈕,需要回答不同的自動回覆 客服按鈕A,打開售前客服 客服按鈕B, 打開售後客服 那麼這種情況就需要使用芝麻小客服的帶參數客服 www.xiaokefu.com ...
  • 數據傳遞: 1.通過資料庫進行數據的傳遞 如在fragment中將數據保存在資料庫中,之後其他的fragment或者activity直接讀取資料庫中的數據,資料庫使用還算簡單,這裡就不多說,建議使用litepal,簡單的不要不要的 2.通過Bundle實現兩個fragment的數據傳遞 想必大家看到 ...
  • 第一種報錯(使用的自帶mac命令行) 1、vim ~/.bash_profile ,如果.bash_profile不存在,先touch ~/.bash_profile 2、將如下內容添加到.bash_profile文件中 esc = 輸入wq! = enter 3、source ~/.bash_pr ...
  • 出現這種問題,打開Android monitor的調試信息發現是 android.view.InflateException: Binary XML file line #11: Attempt to invoke virtual method 'boolean。。。 後經過查找,發現: 這裡Vie ...
  • 在高版本的jquery引入prop方法後,什麼時候該用prop?什麼時候用attr?它們兩個之間有什麼區別?這些問題就出現了。 關於它們兩個的區別,網上的答案很多。這裡談談我的心得,我的心得很簡單: 對於HTML元素本身就帶有的固有屬性,在處理時,使用prop方法。 對於HTML元素我們自己自定義的 ...
  • html部分的代碼 css部分代碼 js部分代碼 效果圖如下: 寫地圖巨有用的地址mark: 百度地圖生成器 http://api.map.baidu.com/lbsapi/creatmap/index.html 百度地圖拾取坐標系統 http://api.map.baidu.com/lbsapi/ ...
  • JSONP是什麼?JSON全稱為JSON with Padding,是JSON的一種補充的使用方式,不是官方協議。 使用JSONP伺服器後臺要改動嗎?JSONP不同於一般的ajax請求返回json對象,JSONP返回的是script腳本。所以,使用JSONP時,伺服器後臺需要進行改動,如果依然返回的 ...
  • 首先,沒有第二題,沒有第二題的原因是,JavaScript中根本就沒有那種數據結構,儘管我在playground裡面調試出了正確的結果,但是也許是因為數據結構問題,最終沒能讓我通過。 所以我就拋棄第二題了。 Given a string, find the length of the longest ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...