BFC之寬度自適應佈局篇

来源:http://www.cnblogs.com/giggle/archive/2016/03/04/5236982.html
-Advertisement-
Play Games

針對BFC的特性之一:BFC之間互不影響原則,so,我們可以實現超級無敵的寬度自適應佈局。詳情見隨筆


說到自適應佈局,我們曾在“拋磚引玉之寬度自適應佈局”一文中學習過。當時的核心思想主要是利用float+margin的形式。利用塊狀元素的流體特性,然後計算出float元素的寬度,並賦予到塊狀元素的相應margin中。但是這麼做是有個缺點的,就是我們每次都得知道float元素的寬度,然後賦予到塊狀元素的margin。

然而,我們在”BFC之淺析篇”中學習到BFC有一特性:BFC的區域不會與外部浮動元素重疊。並且利用了這一特性,實現了兩欄自適應佈局。我們再來回顧下。

<!DOCTYPE html> 
    <head>
        <title>BFC</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <style>
             .leftDiv {
                 width:100px;
                 height:100px;
                 background:green;
                 float:left;
             }
             .normalDiv {
                 height:100px;
                 background:pink;
                 /*添加overflow:hidden,觸發元素BFC*/
                 overflow:hidden;
             }
        </style>
    </head>
    <body>
        <div class="leftDiv"></div>   
        <div class="normalDiv">

        </div>
    </body>
</html>

 運行代碼,截圖為下

可以看見浮動元素(綠色方塊)與div.noramDiv元素的確木有發生重疊,而且我也沒有加margin哦。

你也可以自己運行下上述代碼,伸縮頁面寬度,可以發現也的確是自適應滴。

(PS:上面所示的BFC實現兩欄自適應的例子,可以和“float實例講解”對比學習下,效果會更加哦。)

我們上面是利用的overflow:hidden;來觸發div.normalDiv的BFC。在“BFC之淺析篇”中,我們學習到要觸發元素成為BFC,有如下幾種方法:

1、  float屬性不為none

2、  position為absolute或fixed

3、  overflow的值不為visible

4、  display的值為table-cell,table-caption,inline-block中的任何一個。

拋開第三點,overflow的值不為visible,其他幾種也適合實現BFC自適應佈局?

當然不是咯。

首先,針對第一點float,由於float觸發元素BFC後,自身float又帶有特性,如將元素包裹化了,破壞了塊級元素的流體性,所以不能用來自適應佈局。

針對第二點position,又由於position將元素脫離文檔流比較嚴重,因此,更加不能用來自適應佈局。

針對,第四點中 display:table-cell,當你設置一個比寬度無線大時,它也不會超過它容器的寬度。

嘖嘖嘖!這不就完美了麽。那麼我們設置它的寬度為很大很大時,也就可以用來自適應佈局了嘛。

看看如下代碼

<!DOCTYPE html> 
    <head>
        <title>BFC</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <style>
             .leftDiv {
                 width:100px;
                 height:100px;
                 background:green;
                 float:left;
             }
             .normalDiv {
                 height:100px;
                 background:pink;
                 /*添加display:table-cell,且將寬度設置為很大,如9000px*/
                 display:table-cell;
                 width:9000px;
             }
        </style>
    </head>
    <body>
        <div class="leftDiv"></div>   
        <div class="normalDiv"></div>
    </body>
</html>
View Code

運行代碼後,效果圖見上。

ps:自己運行後的體會更深哦,然後伸縮瀏覽器,哈哈哈,試了就知道,是可以的哦。

針對第四點中的display:table-caption,直接濾過!

針對第四點鐘的display:inline-block,由於和float一樣具有包裹性,所以濾過。但是,我們曾在"BFC之清除浮動篇&clear"中提到過IE6、7有個hasLayout嘛,在IE6、7中它可是具有流體特性的哦。所以可以解決IE6、7的自適應佈局。代碼如下

.floatElm {
    float: left;
}
.bftContent {
    display: inline-block;
}

so, 對觸發BFC的方法,能用在自適應佈局中的方法如下

overflow(hidden/auto)

缺點:

1、  overflow:hidden當內容過多時,帶有剪裁功能

2、  overflow:auto當內容過多時,會出現滾動條

display:inline-block

缺點:

只適用於IE6、7

display:table-cell

缺點:

只適用於IE8+和其他瀏覽器

終上所述,我們可以得到利用BFC實現自適應佈局的通用方法如下:

.floatElm {
    float:left;
}
.bfcContent {
    display:table-cell;
    width:9000px;/*寬度大到屏幕寬度即可*/
    /*hack手段,針對IE6、7*/
    *display:inline-block;
    *width:auto;
}

好了,我們利用這個方法來實現實現三欄佈局玩玩。代碼如下:

<!--
    左右寬度為100px,中間自適應
-->
<!DOCTYPE html> 
    <head>
        <title>BFC</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <style>
            .floatLeft,.floatRight {
                width:100px;
                height:100px;
            }
            .floatLeft {
                /*左浮動觸發BFC*/
                float:left;
                background:green;
            }
            .floatRight {
                /*右浮動觸發BFC*/
                float:right;
                background:yellow;
            }
            .bfcContent {
                /*table-cell觸發BFC*/
                display:table-cell;
                width:9000px;/*寬度大到屏幕寬度即可*/
                /*hack手段,針對IE6、7*/
                *display:inline-block;
                *width:auto;
                height:100px;
                background:pink;
            } 
        </style>
    </head>
    <body>
        <div class="floatLeft"></div>
        <div class="floatRight"></div>
        <div class="bfcContent bfcContentStl"></div>
    </body>
</html>
View Code

 

不信,自己運行代碼,拉動瀏覽器看看啦。 

 


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

-Advertisement-
Play Games
更多相關文章
  • 1 package com.shejimoshi.behavioral.Iterator; 2 3 4 /** 5 * 功能:我們的迭代器介面 6 * 時間:2016年3月4日上午9:17:36 7 * 作者:cutter_point 8 */ 9 public interface MyIterat
  • 1、概念:裝飾模式是在不必改變原類文件和使用繼承的情況下,動態的擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象,又叫做包裝模式。 2、在java的IO流這個章節中,我們會發現有底層流,比如說位元組和字元流,有緩衝流等等: FileOutputStream:基本的文件輸出流 B
  • 引言 用過ASP.NET WebApi2.0, 上次去面試被問到什麼是Restful ,一時間竟不知道從何說起,所以搜集資料,做個備註,有時間好多來看看加深理解。 什麼是Restful 一種軟體架構風格,設計風格而不是標準,只是提供了一組設計原則和約束條件。它主要用於客戶端和伺服器交互類的軟體。基於
  • 面向對象原則綜述 七大原則總脈絡圖: 註:1,2,3,4,5顯示的重要等級 常用的面向對象設計原則包括7個,這些原則並不是孤立存在的,它們相互依賴,相互補充。 下麵就是面向對象七個原則的一一解析 一、開閉原則 1. 開閉原則定義 :一個軟體實體應當對擴展開放,對修改關閉。也就是說在設計一個模塊的時候
  • 1 package com.shejimoshi.behavioral.Interpreter; 2 3 4 /** 5 * 功能:演奏文本 6 * 時間:2016年3月3日上午9:26:19 7 * 作者:cutter_point 8 */ 9 public class PlayContext 1
  • 在沒有瞭解到面向對象設計的7大原則前,我只是一隻豆子! 但豆子終將會成長不是嗎? 1.開閉原則:一個軟體實體應當對擴展開放,對修改關閉。也就是說在所涉及一個模塊的時候,應當使這個模塊可以在不被修改的前提下被擴展,即實現在不修改源代碼的情況下改變這個模塊的行為。 在開閉原則的定義中,軟體實體可以指一個
  • 定時器開之前一定要清,這是我之前疏忽的,導致頁面倒計時占用記憶體,頁面崩潰。
  • 文件夾treeview的效果 這樣的treeview在實際項目中使用的場景較多。 既然用的多,那就DIY一遍,雖沒有面面俱到,但也要將其基本實現完成一遍。 1.先準備圖標素材 file.gif,文件圖標 folder.gif,文件夾打開中的圖標 folder-closed.gif,文件夾關閉著的圖標
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...