1. 程式人生 > >css整理之-----------佈局相關

css整理之-----------佈局相關

文件流

  文件流指的是元素排版佈局過程中,元素會預設自動從左往右,從上往下的流式排列方式佈局,文件流可以分為定位流、浮動流、普通流三種

普通流(Normal flow)

  • 在常規流中,盒一個接著一個排列,也就是常說的預設的文件流
  • 在塊級格式化上下文裡面, 它們豎著排列
  • 在行內格式化上下文裡面, 它們橫著排列
  • 當position為static或relative,並且float為none時會觸發常規流
  • 對於靜態定位(static positioning),position: static,盒的位置是常規流佈局裡的位置
  • 對於相對定位(relative positioning),position: relative,盒偏移位置由top、bottom、left、right屬性定義。即使有偏移,仍然保留原有的位置,其它常規流不能佔用這個位置
  • 可以通過display 改變元素型別

浮動(Floats)

  • 左浮動元素儘量靠左、靠上,右浮動同理
  • 這導致常規流環繞在它的周邊,除非設定 clear 屬性
  • 浮動元素不會影響塊級元素的佈局
  • 但浮動元素會影響行內元素的佈局,讓其圍繞在自己周圍,撐大父級元素,從而間接影響塊級元素佈局
  • 最高點不會超過當前行的最高點、它前面的浮動元素的最高點
  • 不超過它的包含塊,除非元素本身已經比包含塊更寬
  • 行內元素出現在左浮動元素的右邊和右浮動元素的左邊,左浮動元素的左邊和右浮動元素的右邊是不會擺放浮動元素的

絕對定位(Absolute positioning)

  • 絕對定位方案,盒從常規流中被移除,不影響常規流的佈局
  • 它的定位相對於它的包含塊,相關CSS屬性:top、bottom、left、right;
  • 如果元素的屬性position為absolute或fixed,它是絕對定位元素
  • 對於position: absolute,元素定位將相對於上級元素中最近的一個relative、fixed、absolute,如果沒有則相對於body

塊格式化上下文(BFC)

  BFC(Block formatting context)直譯為"塊級格式化上下文"。是用於佈局塊級盒子的一塊渲染區域,它是一個獨立的渲染區域、容器,簡單的可以理解把BFC理解為是css頁面渲染的一種機制、有一套渲染規則,規定內部元素如何佈局。也可以理解為這個獨立的區域與外部之間的元素互不影響。

BFC佈局規則

  • 內部元素中的塊級元素 Box會在垂直方向,一個接一個地放置。
  • Box垂直方向的距離由外邊距margin決定,屬於同一個BFC的兩個相鄰Box的margin會發生重疊。
  • 每個元素的margin box的左邊,與包含塊border box的左邊相接觸(對於從左往右的格式化,否則相反),即使存在浮動也是如此。
  • BFC的區域不會與float box重疊。
  • BFC就是頁面上的一個隔離的獨立容器,容器裡面的子元素不會影響到外面的元素。反之也如此。
  • 計算BFC的高度時,浮動元素也參與計算(浮動的元素會被父級計算高度)。

BFC 作用

BFC就是頁面上的一個隔離的獨立容器,容器裡面的子元素不會影響到外面的元素。

注意:一個BFC的範圍包含建立該上下文元素的所有子元素,但不包括建立了新BFC的子元素的內部元素。即一個元素不能同時存在於兩個BFC中。因為如果一個元素能夠同時處於兩個BFC中,那麼就意味著這個元素能與兩個BFC中的元素髮生作用,就違反了BFC的隔離作用。

BFC運用

  • 清除內部浮動,造成的高度坍塌(產生一個新的BFC時,浮動元素的高度也參與計算)
  • 防止邊距摺疊
  • 佈局

BFC建立

  • 根元素(<html>)
  • 浮動元素(元素的 float 不是 none
  • 絕對定位元素(元素的 positionabsolutefixed
  • 行內塊元素(元素的 displayinline-block
  • 表格單元格(元素的 displaytable-cell,HTML表格單元格預設為該值)
  • 表格標題(元素的 displaytable-caption,HTML表格標題預設為該值)
  • 匿名錶格單元格元素(元素的 displaytable、table-rowtable-row-group、table-header-group、table-footer-group(分別是HTML table、row、tbody、thead、tfoot 的預設屬性)或 inline-table
  • overflow 計算值(Computed)不為 visible 的塊元素
  • display 值為 flow-root 的元素
  • contain 值為 layoutcontent 或 paint 的元素
  • 彈性元素(displayflexinline-flex 元素的直接子元素)
  • 網格元素(displaygridinline-grid 元素的直接子元素)
  • 多列容器(元素的 column-countcolumn-width 不為 auto,包括 column-count1
  • column-spanall 的元素始終會建立一個新的BFC,即使該元素沒有包裹在一個多列容器中(標準變更,Chrome bug)。

     除了BFC 還有IFC、GFC、FFC原理都類似都有自己的佈局規則。

具體Demo

Flex 彈性盒子佈局

採用Flex佈局的元素,稱為Flex容器(flex container),簡稱”容器”。它的所有子元素自動成為容器成員,稱為Flex專案(flex item),簡稱”專案”。這種佈局就是上面說的FFC。

容器預設存在兩根軸:水平的主軸(main axis)和垂直的交叉軸(cross axis)。主軸的開始位置(與邊框的交叉點)叫做main start,結束位置叫做main end;交叉軸的開始位置叫做cross start,結束位置叫做cross end。

專案預設沿主軸排列。單個專案佔據的主軸空間叫做main size,佔據的交叉軸空間叫做cross size。

容器屬性

六個屬性分別為:flex-direction,flex-wrap,flex-flow,justify-content,align-items,align-content

專案屬性

六個屬性分別為:order,flex-grow,flex-shrink,flex-basis,flex,align-self 

Grid 網格佈局

將網頁劃分成一個個網格,定義行、列可以任意組合不同的網格,做出各種各樣的佈局,這種佈局就是上面說的GFC。

Grid 佈局與 Flex 佈局有一定的相似性,都可以指定容器內部多個專案的位置。但是,它們也存在重大區別。 Flex 佈局是軸線佈局,只能指定"專案"針對軸線的位置,可以看作是一維佈局。Grid 佈局則是將容器劃分成"行"和"列",產生單元格,然後指定"專案所在"的單元格,可以看作是二維佈局。

css中的px

css 中的px是一個相對邏輯單位,相對的是裝置畫素比(DPR) ,其中DPR 可以通過window.devicePixelRatio,簡單的可以理解為使用多少物理畫素繪製單個CSS邏輯畫素。

window.devicePixelRatio DPR = 物理畫素(裝置畫素) / 邏輯畫素(css畫素/裝置獨立畫素) dips

CSS中的 1px 並不等於裝置的1px

從iphone4開始,推出了所謂的Retina屏(一種新型高解析度屏),解析度提高了一倍,變成640*960,但螢幕尺寸卻沒變化,這就意味著同樣大小的螢幕上,畫素卻多了一倍,這時,1個CSS畫素是等於4個物理畫素的。

對於桌面裝置,一個css邏輯畫素通常就等同於物理畫素,不用考慮縮放問題。

  • css 是一個相對單位,是一個邏輯畫素相對於裝置畫素
  • pc端預設一個畫素等於一個物理裝置上的畫素
  • 解析度越高顯示的影象越清晰,因為有更多的點來描述這個影象
  • 用多少個物理畫素渲染1個css 邏輯畫素,很多概念都是高分屏出來之後為了解決佈局、顯示體驗的問題提出的解決方案,之前都是一個css 邏輯畫素顯示一個物理畫素

備註:dpr 涉及到的相關概念比較多可自行查詢如css畫素、裝置畫素比dpr等

常見解析度

螢幕解析度是指縱橫向上的畫素點數,單位是px。顯示解析度就是螢幕上顯示的畫素個數,解析度160×128的意思是水平方向含有畫素數為160個,垂直方向畫素數128個。螢幕尺寸一樣的情況下,解析度越高,顯示效果就越精細和細膩。

1024*600            (常見8、9寸電腦使用)

1024*768            (常見10.4、12.1、14.1、15寸電腦使用)

1280*1024            (常見14.1、15寸電腦使用)

1280*800            (常見10.8、12.1、15.4寸電腦使用)

1280*854            (不常見)

1366*768            (常見15.2寸電腦使用)(主流)

1440*1050            (常見15、16.1寸電腦使用)

1440*900            (蘋果17寸電腦)

1600 * 900            (非主流)

1600*1200            (常見15、16.1寸電腦使用)

1600*1024            (不常見)

1680*1050            (常見15.4、20寸電腦使見)

1920*1080            (主流)

1920*1200            (常見20寸電腦使見)

 1 @media (min-width: 1024px){
 2      body{font-size: 18px}
 3     } /*>=1024的裝置*/
 4 
 5     @media (min-width: 1100px) {
 6      body{font-size: 20px}
 7     } /*>=1100的裝置*/
 8     
 9     @media (min-width: 1280px) {
10      body{font-size: 22px;}
11     } /*>=1280的裝置*/
12 
13     @media (min-width: 1366px) {
14      body{font-size: 24px;}
15     }  
16 
17     @media (min-width: 1440px) {
18      body{font-size: 25px !important;}
19     } 
20 
21     @media (min-width: 1680px) {
22      body{font-size: 28px;}
23     }
24     
25     @media (min-width: 1920px) {
26      body{font-size: 33px;}
27     }

&n