關於css浮動框是否脫離文檔流的分析

来源:http://www.cnblogs.com/shouce/archive/2016/01/29/5167958.html
-Advertisement-
Play Games

在瞭解浮動屬性之前,首先我們先瞭解一下html中關於display屬性的相關知識。 display屬性常用的有inline, block, inline-block. inline也就是內聯的意思。 常見的html標簽中如 span, font, a, b, em 都是內聯元素。 所謂內聯,簡單理解


在瞭解浮動屬性之前,首先我們先瞭解一下html中關於display屬性的相關知識。

 

display屬性常用的有inline, block, inline-block.

 

inline也就是內聯的意思。 常見的html標簽中如 span, font, a, b, em 都是內聯元素。

所謂內聯,簡單理解就是不會換行的元素

複製代碼
<body>
  <b>bold element</b>
  <a href="http://www.google.com">google</a>
  <font color='red'>red font</font>
  <span style="height: 230px;width:100px;">span</span>
</body>
複製代碼

結果如下:

這個例子很簡單,也說明瞭inline屬性的特點,即不會換行。 頁面上4個元素的文本都是連在一起的。 

這裡需要註意一點。 inline元素是不支持寬、高屬性的。 如例子中的span元素設置了寬和高,但是沒有起作用。

 

block是“塊”的意思。 block元素與inline元素相反,它會自動換行。 常見的html標簽中如 div, form, ul, li, p, h1都是塊元素。

複製代碼
<body>
  <form name="testForm" action="">
    <input type="text" name="demo"/>
  </form>
  <div>
      div content
  </div>
  <h1>h1</h1>
  <p>p</p>
  <ul>
    <li>123</li>
    <li>123</li>
    <li>123</li>
  </ul>
  <span>span!</span>
  <span>span!</span>
</body>
複製代碼

結果如下:

圖中很明顯的看見,這個塊元素都預設換行了。

 

inline-block本文不討論。

 

那麼有什麼方法可以讓block元素變成內斂元素呢。

肯定有是的,有兩種方法。

 

第一種就是通過css改變塊元素的display屬性, 改成inline即可。

複製代碼
<body>

  <div style="width: 40px; height: 40px; margin-right: 10px;display:inline;">
      div1
  </div>
  <div style="width: 40px; height: 40px; margin-right: 10px;display:inline;">
      div2
  </div>
  <div style="width: 40px; height: 40px; margin-right: 10px;display:inline;">
      div3
  </div>

</body>
複製代碼

但是由於inline屬性會忽略寬和高,因此這種方法在實際運用場合上上基本不會用的。 直接忽略!

 

第二種就是本文要討論的浮動屬性了。

複製代碼
<body>

  <div style="width: 40px; height: 40px; margin-right: 10px;float: left">
      div1
  </div>
  <div style="width: 40px; height: 40px; margin-right: 10px;float: left">
      div2
  </div>
  <div style="width: 40px; height: 40px; margin-right: 10px;float: left">
      div3
  </div>

</body
複製代碼

 

我們可以看w3c上對浮動的說明。   點擊查看->

 

具體的例子這篇文章已經很詳細了。

 

我們看 開頭的一句話:

浮動的框可以向左或向右移動,直到它的外邊緣碰到包含框或另一個浮動框的邊框為止。

由於浮動框不在文檔的普通流中,所以文檔的普通流中的塊框表現得就像浮動框不存在一樣。

 

說的很明確, 浮動的框會直到它的外邊緣碰到“包含框”或“另一個浮動框的邊框“為止。

我們分析一下w3c的第一個例子:

框1右浮,並且它的邊緣碰到了包含寬的邊框,因此停留在瞭如圖所在的位置。

 

再看第二個例子:

左圖框1左浮,也碰到了包含框的邊框。 由於浮動的元素脫離的文檔流,不占據空間,所以接下來框2會無視掉框1,但是由於浮動元素優先順序較高,因此框2在框1的下麵,被遮住了。框3由於沒有浮動,是block元素, 因此自動換行,在框2的下方。

 

這2個例子說明2個原理。 

  一, 浮動的元素脫離文檔元素, 不占據空間。 不浮動的元素會直接無視掉這個元素。

  二,浮動元素浮動的依據跟包含框和附近另外1個浮動的框,碰到了就會停止下來。

 

這裡有一個註意點:

我們先看浮動框定義的第二句話的後半句  (所以文檔的普通流中的塊框表現得就像浮動框不存在一樣

請註意,普通流中的 "塊框" 表現得就像浮動框不存在一樣。 這裡指的是塊框, 而不是內聯元素。

 

比如以下例子:

複製代碼
#container {
    background-color: red;
    padding: 10px;
    height: 200px;
    width: 200px;
}

.left {
    float: left;
    width: 50px;
    height: 50px;
}

.right {
    float: right;
    width: 60px;
    height: 60px;
}
.green {
    background-color: green;
}

.blue {
    background-color: blue;
}
複製代碼 複製代碼
<body>
    <div id="container">
        <div class="left blue"></div>
        <div class="right blue"></div>
        <span>This is inline element</span>
    </div>
</body>
複製代碼

 

結果如下:

我們可以看到。 span這個內聯元素不會忽略兩個浮動元素的。

我們將以上代碼的span元素替換成div塊框元素。

修改後的html代碼如下:

複製代碼
<body>
    <div id="container">
        <div class="left blue"></div>
        <div class="right blue"></div>
        <div style="width: 50px; height: 60px;" class="green"></div>
    </div>
</body>
複製代碼

結果:

很明顯地看到,這個綠色的塊框元素忽略的浮動元素。

 

但是如果我們將html代碼改成如下:

複製代碼
<body>
    <div id="container">
        <div style="width: 50px; height: 60px;" class="green"></div>
        <div class="left blue"></div>
        <div class="right blue"></div>
    </div>
</body>
複製代碼

結果卻是這樣:

從結果可以很明顯地看出, 塊框元素在container容器中占據了第高度為60像素的那塊區域。 兩個浮動的元素都是在這塊框區域下開始渲染的。

這樣是不是違背了w3c的定義:浮動框會無視普通流中的塊框。

根據個人的理解:

  這可能是由於html的渲染順序導致的。html代碼中先寫了塊框, 導致先渲染了這個塊框的區域。

  之後渲染兩個浮動框, 渲染浮動框的時候發現上面已經被塊框渲染過了。 於是從塊框之後開始渲染。

 

我們在上個例子中container容器中最後1個div後再加1個div

<div style="width: 50px; height: 60px;" class="green"></div>

在渲染最後1個div的時候。此時發現已經有兩個浮動框, 這時候就會忽略這2個浮動框,從第一個塊框開始繼續渲染,也就跑到了第一個塊框之後的位置。

 

 所在在w3c定義浮動的那句話有點小問題。

第二句話的後半句應該改成:

  所以文檔的普通流中的塊框在浮動框渲染之後會表現得就像浮動框不存在一樣。

 

綜上所述,感覺浮動框並沒有脫離文檔流。

 

不知道個人的理解是否正確, 文中難免有一些錯誤, 希望讀者發現並指出。


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

-Advertisement-
Play Games
更多相關文章
  • 當完成一項前端的工作之後,許多人都會忘記該項目的結構與細節。然而代碼並不是馬上就能完全定型,在餘下的時間里還有不斷的維護工作,而這些工作也許不會是你自己完成。所以,結構優良的代碼能很大程度上優化它的可維護性。下麵列出五種提高CSS文件可維護性的方法,也就是一種較好的CSS樣式指南。1.分解你的樣式對
  • http://120.24.90.140:2368/emberru-men-zhi-nan-jiao-cheng-mu-lu/
  • 首先是angular-ui-router的基本用法。■ 如何引用依賴angular-ui-router angular.module('app',["ui.router"]) .config(function($stateProvider){ $stateProvider.state(stateNa
  • 來源:w3cplus - 南北(@ping4god) 網址:http://www.w3cplus.com/tools/dev-tips.html 谷歌瀏覽器如今是Web開發者們所使用的最流行的網頁瀏覽器。伴隨每六個星期一次的發佈周期和不斷擴大的強大的開發功能,Chrome變成了一個必須的工具。大多數
  • 本篇主要通過分析Tony Parisi的sim.js庫(原版代碼托管於:https://github.com/tparisi/WebGLBook/tree/master/sim),總結基礎Web3D框架的編寫方法。在上一篇的基礎上,要求讀者具有簡短英文閱讀或者查字典的能力。 限於水平和時間,本文難免
  • <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.o
  • 最近在研究css~當設置一個元素width後~有時候也會對他設定padding,margin,border值, 每次這樣我就心裡琢磨,那這個元素的width會變嗎,js獲取元素的寬度width()指的是哪個寬度,還有innerWidth()?outerWidth()?outerWidth(true)
  • SVG 基本內容 SVG並不屬於HTML5專有內容 HTML5提供有關SVG原生的內容 在HTML5出現之前,就有SVG內容 SVG,簡單來說就是矢量圖 SVG文件的擴展名為".svg" SVG使用的是XML語法 概念 SVG是一種使用XML技術描述二維圖形的語言 SVG的特點 SVG繪製圖形可以被
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...