主頁 > 企業開發 > 輕輕松松學CSS:float

輕輕松松學CSS:float

2020-09-10 04:46:20 企業開發

float屬性,會使元素向左或向右移動,其周圍的元素也會重新排列,float不僅自己飄忽不定,還對周圍元素有影響,這種影響力不容小覷,他捉摸不定(浮動規律不好把握),他干涉他國內政(對周圍元素有影響),這些特點就像今天的美國總統特朗普(別名“特不靠譜”),學習float就得了解它的前世今生,它的本質,掌握它的規律才能降妖除魔,為我所用,

一、float的前世今生

          float設計之初,目的就是圖文環繞

如果float一直踏踏實實、本本分分的干好本職作業,那他就是一個“好人”,float本該“不忘初心,牢記使命”,就像我們黨開展的教育活動那樣,可是他后來忘記了自己的初衷,竟參與到網頁布局中,一度還樂此不疲,甚至受到一些程式員青睞,

          最早的網頁布局很簡單,元素的排列就是靠table、tr、td這樣一些標簽,頁面很簡單,float就是用來做圖文環繞的,但是后來程式員發現float用在布局上也不錯,打破了tabel(tr、td)標簽死板的布局方式,float布局更加靈活多樣,這樣float就開始了“華麗轉身”,正式成為網頁布局中的一員大將,

          其實,float有很多毛病,他的浮動規律讓很多人摸不著頭腦,而且周圍元素經常受到影響,稍有不慎原有的排布會支離破碎,所以有人說他是“魔鬼”,說他是“混球”,說他是“不務正業”,說他“跨界太大”,一點也不為過,

隨著瀏覽器版本的升級,float在布局方面的作用逐漸被取代,但是,由于float的兼容性好,盡管他有很多問題,人們還是(不得不)包容他,在研究浮動規律的基礎上,駕馭他、降伏他、利用他,

二、float的浮動規律

(一)float的本質

1、包裹性(與inline-block\block對比)

          包裹性就是在未設定寬度的情況下,根據內容自適應(也可以叫“自收縮”),如下圖:

 

 

具有包裹性的還有display:inline-block、position:absolute、position:fixed等,

 

在布局上float與inline-block很相似,如下圖:

 

 

 

 

雖然很相似,但是仔細觀察上圖還是有些差別,比如li之間的縫隙,inline-block中間有縫,float中間沒縫,在實際布局中,一般都希望中間沒縫,這樣便于計算尺寸,所以,float在這方面有先天優勢(float能去空格,嚴絲合縫適合網頁布局,通常把float布局叫做“碼磚頭”),當然,如果你不介意中間的縫隙,或者采用一些辦法去掉縫隙,也可以采用inline-block,實際情況下,如果代碼稍微復雜些,inline-block可能還會出現垂直對齊(vertical-align)的問題,到時你可以查閱一些資料來解決問題,

 

不要以為floatinline-block比較相似,就以為浮動元素的顯示方式(display)就是inline-block,實際上,浮動元素的顯示方式(display)是block,確切地說是“通常情況下,浮動元素displayblock”,有些情況雖然不是block,比如displaylist-item,本質上也和block差不多,

 

下圖,span元素本來是行內元素(displayinline)浮動(floatleft)后,我們通過瀏覽器右鍵的“審查元素”可以看到displayblock

 

這樣,行內元素(比如span標簽、a標簽)和塊元素(比如div標簽)一旦浮動后都是一樣的效果了,就是說<div style=”float:left;background:#ccc”>浮動元素</div><span style=”float:left;background:#ccc”>浮動元素</span>是完全一樣的,這時再加上display屬性就多余了,加上display屬性(比如display:inline)瀏覽器也不會采用,純屬畫蛇添足,

 

有人就問了“多個浮動元素可以水平排列在同一行,而浮動元素display:block就應該獨占一行呀!,這不是互相矛盾嗎?”,你看到上圖中的那個詞語了嗎?“特殊”的塊元素,因為浮動元素脫離了檔案流(標準流),此時的塊元素(displayblock)已不是標準流中的塊元素了,它自收縮(包裹性),不再占用整行寬度,所以多個浮動元素可以水平排列在同一行,

 

補充一點,浮動元素“脫離標準流”,這里的“脫離標準流”和position:absolute脫離標準流不太一樣,float的脫離標準流,在自由度上受限,不是自由翱翔的那種,而absolute脫離標準流是可以滿世界亂跑的那種,自由度很大,所以,有的資料中不認可“浮動元素脫離標準流”的說法,本文不過于追究細節,籠統地說“浮動元素脫離標準流”,讀者可以粗略這么理解,

 

2、破壞性

 

          破壞性,就是打破規則,并且影響周圍元素,就像特朗普不斷退群,不斷修改規則,盡管讓別的國家不知所措,對美國心生怨恨,但礙于美國實力,只能忍氣吞聲,

 

本文第一張圖的第一部分,圖片浮動前和文字基線對齊,在一行顯示,圖片高度比文字高,所以圖片所在的這行跟別的(純文字)行就不一樣,這行顯得很高,其實就是圖片給撐起來的,

 

圖片浮動(floatleft)后,以往的規則打破了,它像一副軀殼一樣向左移動,它和文字不再基線對齊,打破了原有的規則,破壞性不僅表現在對齊方式的改變,還表現在父元素的高度塌陷上(子元素在浮動前要向父元素匯報高度,父元素把所有子元素的高度收集到后就確定了自己的高度,子元素浮動后,就不再向父元素匯報高度了,因此父元素收集不到子元素的高度就導致自己的高度塌陷),

 

 

(二)浮動規則

1、圖文環繞可以推廣為:行內級內容會被浮動元素推出去(行內級內容包括行內級元素、inline-block元素、塊級元素的文字內容)

 

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7     <title>test</title>
 8 </head>
 9 <style>
10     .floatDiv{
11         float:left;width:200px;height:200px;background:purple;color:#fff;
12     }
13     .inlineElement{
14         background:orange;padding:0 10px;
15     }
16     .inlineBlockElement{
17         display:inline-block;background:red;height:30px;width:130px;
18     }
19 </style>
20 <body>
21     <div class="floatDiv">浮動元素</div>
22     
23     <span class="inlineElement">行內元素</span>
24     <span class="inlineElement">行內元素</span>
25     <span class="inlineElement">行內元素</span>
26     <span class="inlineElement">行內元素</span>
27     <span class="inlineElement">行內元素</span>
28     <span class="inlineElement">行內元素</span>
29     <span class="inlineElement">行內元素</span>
30     <span class="inlineElement">行內元素</span>
31     <span class="inlineElement">行內元素</span>
32     <span class="inlineElement">行內元素</span>
33     
34     <div class="inlineBlockElement">inline-block元素</div>
35     <div class="inlineBlockElement">inline-block元素</div>
36     <div class="inlineBlockElement">inline-block元素</div>
37     <div class="inlineBlockElement">inline-block元素</div>
38     <div class="inlineBlockElement">inline-block元素</div>
39     <div class="inlineBlockElement">inline-block元素</div>
40     <div class="inlineBlockElement">inline-block元素</div>
41     
42     <div style="background:green;width:800px;height:400px;">
43         浮動元素脫離檔案流,div(塊元素)與浮動元素有重疊,但是div(塊元素)里的文字,依然環繞在浮動元素周圍,
44         浮動元素脫離檔案流,div(塊元素)與浮動元素有重疊,但是div(塊元素)里的文字,依然環繞在浮動元素周圍,    浮動元素脫離檔案流,div(塊元素)與浮動元素有重疊,但是div(塊元素)里的文字,依然環繞在浮動元素周圍,
45     </div>
46 </body>
47 </html>
View Code

 

提示讀者,操作時注意調整瀏覽器的寬度

 

2、浮動元素只能在當前行中移動(floatleft,從右向左移動 floatright相反),遇到包含塊(父元素)或其他浮動元素的邊界為止,如果水平方向剩余的空間不夠顯示,浮動元素將向下移動,直到有足夠的空間位置為止,

 

下面的代碼

 

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7     <title>code2</title>
 8 </head>
 9 
10 <body>
11     這是第一部分文字,如果瀏覽器的寬度較小,這段文字會在圖片的上方
12     <img src=https://www.cnblogs.com/shamozhongdelvzhou/p/"img/pic1.jpg" style="float:left;">
13     <span style="color:#000;">第二部分文字,其他內容,其他內容,其他內容,其他內容(更多內容在此省略)</span>
14 </body>
15 </html>
View Code

在瀏覽器寬度較大時,第一部分文字和第二部分文字都在圖片右側排列

 

在瀏覽器寬度較小時,第一部分文字在圖片的上方排列

下面的代碼是幾個div浮動后排布的情況

 

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7     <title>test</title>
 8 </head>
 9 <style>
10     .box1{width:200px;height:400px;background:blue;}
11     .box2{width:300px;height:300px;background:yellow;}
12     .box3{width:400px;height:200px;background:purple;}
13     .box4{width:100px;height:500px;background:red;}
14     .box5{width:500px;height:400px;background:green;}
15     .box6{width:500px;height:100px;background:gray;}
16     .box7{width:100px;height:400px;background:orange;}
17     .box8{width:400px;height:400px;background:#ccc;}
18     div{float:left;}
19 </style>
20 <body>
21     <div class="box1">box1</div>
22     <div class="box2">box2</div>
23     <div class="box3">box3</div>
24     <div class="box4">box4</div>
25     <div class="box5">box5</div>
26     <div class="box6">box6</div>
27     <div class="box7">box7</div>
28     <div class="box8">box8</div>
29 
30 </body>
31 </html>
View Code

代碼結構:八個div都是floatleftbox1box8依次,盡管瀏覽器寬度不同時,浮動元素排布的結果不同,但是都遵循一定的規則,請看下圖

 

 

 

 

 

為了說明問題,稍微刪減部分divdiv仍然都是floatleftdiv的寬、高有所調整

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7     <title>code4</title>
 8 </head>
 9 <style>
10     .box1{width:400px;height:100px;background:blue;}
11     .box2{width:100px;height:500px;background:yellow;}
12     .box3{width:300px;height:200px;background:purple;}
13     .box4{width:300px;height:300px;background:red;}
14     .box5{width:300px;height:300px;background:green;}
15     div{float:left;}
16 </style>
17 <body>
18     <div class="box1">box1</div>
19     <div class="box2">box2</div>
20     <div class="box3">box3</div>
21     <div class="box4">box4</div>
22     <div class="box5">box5</div>
23 
24 </body>
25 </html>
View Code

 

由以上圖可見,浮動元素的排列有相當嚴格的等級制度,后浮動的元素只能與前面的浮動元素在同一水平線上(以頂部為準),前提是后面的空間足夠大,如果后面的空間不夠,就會向下錯位,錯位后如果沒有遇到阻力,還是水平移動(floatleft從右向左移動,floatright相反),移動程序中不會再上移動,水平移動直到遇到阻力,永遠不會出現后面的浮動元素高于前面的浮動元素(以頂部為準),就是說,后浮動的元素要么與前面的浮動元素平起平坐(頂部在同一水平線上),前提是后面的空間足夠大;如果后面的空間不夠,后浮動的元素只能處于下層,永遠不會出現“僭越”,等級森嚴!

 

三、清除浮動

 

float是魔鬼,是混球,是黑惡勢力,清除浮動就是“降妖除魔”,就是“掃黑除惡”,

 

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7     <title>code5</title>
 8 </head>
 9 <style>
10     .wrap{background:red;}
11     .wrap:after{display:block;content:'';clear:both;}
12     .content{float:left;width:300px;height:100px;}
13     .content1{background:lightblue;}
14     .content2{background:lightgreen;}
15     .content3{background:darkblue;}
16     
17     
18     .footer{height:50px;background:#ccc;}
19 </style>
20 <body>
21     <div class="wrap">
22         <div class="content content1"></div>
23         <div class="content content2"></div>
24         <div class="content content3"></div>
25     </div>
26     <div class="footer">footer</div>
27 </body>
28 </html>
View Code

 

方法1、增加一個額外的divclearboth

 

<div >

 

                     <div ></div>

 

                     <div ></div>

 

                     <div ></div>

 

 

 

                     <div style=”clear:both;”></div>

 

</div>

 

<div >footer</div>

 

這種方法就是相當于加了一個防火墻(防魔墻),打了一個隔板,但是因為增加了額外標簽,可讀性不強,所以不怎么推薦,

 

方法2、在父元素(class=”wrap”)填加屬性overflow:hidden

 

.wrap{overflow:hidden;}

 

這種方法的解釋,很難用一句話兩句哈說清楚,所以本文不解釋理由,這種方法兼容性也還可以,所以推薦使用,

 

方法3、使用父元素的偽類選擇器

 

.wrap:after{display:block;content:””;clear:both;}

 

這跟方法1的道理差不多,但是沒有增加額外標簽,兼容性也還可以,所以推薦使用,

 

四、float的未來命運

 

我們使用float浮動做了很多其本職作業以外的事情,目前用float實作的不管是分欄布局,還是串列排列,我們都可以用其他一些CSS屬性代替實作,唯一一個實作不了的就是“文字環繞圖片”,未來,float可能會再回到老本行,只做圖文環繞,把網頁布局交給其他屬性,也就是說float可能會退出網頁布局的歷史舞臺,但那是將來的事,如果你對瀏覽器的兼容性有較高要求,你還不得不掌握它的浮動規律,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/898.html

標籤:Html/Css

上一篇:前端的學習方向

下一篇:CSS影片實體:渦旋

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more