国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

一文帶你弄懂 CSS 布局知識

開發 前端
最近想著學習點前端知識,于是就學習了關于前端 Web 的布局知識,其實就是 CSS 那些事。關于 CSS 其實很早就接觸過了,但一直沒有沉下心來去學習,所以對于 CSS 布局的東西一直都不成體系。

最近想著學習點前端知識,于是就學習了關于前端 Web 的布局知識,其實就是 CSS 那些事。關于 CSS 其實很早就接觸過了,但一直沒有沉下心來去學習,所以對于 CSS 布局的東西一直都不成體系。這次趁著重學前端,真正花時間學了一下 CSS 布局的知識點,順帶把知識點總結一下。

前言

說到 CSS 布局,有寫過一些 CSS 頁面的同學腦海中可能會浮現一些字眼,例如:float、display、relative、absolute 等等。但這些屬性分別代表什么意思,它們之間都有什么區別,啥時候用 float 啥時候用 relative,你弄得懂嗎?對于我來說,我沒弄懂,有點懵。于是,我花了點時間弄懂它,這也是本文要重點弄懂的問題。簡單來說,看完這篇文章,你應該可以弄清楚如下幾個問題:

1、常用的幾個 CSS 布局屬性作用及區別。 

2、CSS 布局的歷史以及當前流行的布局方式。

要注意的是,本文不會從零開始介紹 CSS 的知識點。只適合學習過 CSS,但是對 CSS 布局各種屬性沒弄明白的同學。如果你還沒學過 CSS 知識,那需要先去學習一下 CSS 基礎知識再來看這篇文章。

關于文檔流

理解文檔流對于我們掌握 CSS 布局非常重要。簡單來說,我們在 HTML 中寫入的每一個元素,都是一個元素塊。默認情況下,它們按照我們在 HTML 中書寫的順序,從上到下、從左到右排列,這就是默認的文檔流。例如,對于如下所示的代碼片段,其在 HTML 中會按照順序顯示,如下圖所示。

<body>
  <p>段落1</p>
  <p>段落2</p>
  <p>段落3</p>
</body>

-w104-w104

核心 CSS 屬性

在 CSS 布局中,有三個常用的 CSS 屬性,分別是:display、float、position。它們具有不同的功能,適用于不同的場景。

display

就像 display 的名字一樣,其用來定義元素塊的展示形式,不同的展示形式會有不同的展示效果。 display 屬性的常用屬性有:

  • inline:表示元素是行內元素,多個元素會共用一行。
  • inline-block:表示元素是行內塊元素,多個元素會共用一行。與 inline 的區別是,inline-block 元素可以設置元素的長和寬,但是 inline 元素不可以設置元素的長和寬。
  • block:表示元素是塊元素,每個塊元素會單獨占用一行。

要注意的是,不同的 HTML 元素,其默認的展示形式是不同的。例如 p 元素(段落)的 display 屬性默認值是 block,而 a 屬性(鏈接)的 display 屬性默認值則是 inine。

下面,我們通過幾個簡單的例子來體會一下上面所說的內容。如下圖所示的代碼,我們設置不同的 CSS 屬性,元素的展示形式會發生變化。

<body>
  <p class="display">段落1</p>
  <p class="display">段落2</p>
  <p class="display">段落3</p>
</body>

設置的 CSS 屬性如下所示:

.display {
  background-color: red;
}

顯示效果如下圖所示。

-w524-w524

如上圖可以看到,在 CSS 代碼中,我只是設置背景顏色。由于 p 元素的默認 display 屬性值是 block,因此每個段落都會占用一行的空間。

如果我們把 p 元素設置成 inline 顯示形式,那么它們就會多個元素排列在一行內。如下圖所示。

.display {
  display: inline;
  background-color: red;
  /* width/height 屬性設置無效 */
  width: 200px;
  height: 200px;
}

-w228-w228

如果我們把 p 元素設置成 inline-block 顯示形式,并且設置了寬高,那么它們就會多個元素排列在一行內,并且寬高設置會生效。如下圖所示。

.display {
  display: inline-block;
  background-color: red;
  /* width/height 屬性設置無效 */
  width: 200px;
  height: 200px;
}

-w639-w639

看到這里,相信大家應該可以弄清楚 display 屬性的作用了。display 屬性其實就是用來設置 HTML 元素的展示形式的,不同的展示形式會有不同的展示效果。給不同的元素設置合適的屬性值,可以幫助我們更好地進行頁布局。

display 屬性除了前面說得這三種屬性值之外,還有 flex、grid、table 等值。但目前用得最多的還是 flex 和 grid 這兩種,它們可以說是目前主流的 CSS 布局方式。關于這塊內容,我們后面再細講,這里就不展開了。

float

就像 float 這個名字一樣,它代表著浮動。

啥意思呢?

要理解這個,就要從 CSS 的歷史說起了。很早之前,display 屬性只有兩個,分別是 block 和 inline。block 雖然支持設置寬高,但是不支持多個元素顯示在一行。inline 雖然支持多個元素顯示在一行,但是卻不能設置寬高。但是實際場景中,我們很多時候需要做多列布局的,即需要多個元素在同一行,并且同一行的元素都可以設置寬度,如下圖所示。

-w1173-w1173

這時候 CSS 就滿足不了我們的訴求了!

那怎么辦呢?

這時候 float 就橫空出世了!

簡單來說,float 就是讓塊級元素(block元素)浮起來。 塊級元素浮起來之后,塊級元素就不固定占用一行了,而是根據其設置的寬度顯示。如果一行的寬度能夠容納得下兩個浮動的塊級元素,那么它們就可以同時顯示在同一個行內。

舉個簡單地例子,下面的 HTML 片段,設置了三個 block 元素塊。

<body>
  <p class="display">段落1</p>
  <p class="display">段落2</p>
  <p class="display">段落3</p>
</body>
.display {
  display: block;
  width: 200px;
  height: 100px;
  background-color: red;
}

在沒有設置浮動之前,每個塊級元素都會占用一行,如下圖所示。

-w264-w264

但是如果我們對元素設置了向左浮動,那么它們就會往左浮動,三個塊級元素都浮動到了同一行,如下圖所示。

.display {
  display: block;
  float: left;
  width: 200px;
  height: 100px;
  background-color: red;
}

-w626-w626

所以,float 元素的出現,是用來解決 block 元素塊無法同行顯示,從而無法實現特定布局場景的問題的。 在 float 出現的很長一段時間,基本上大家都靠 float 來進行頁面布局。

有同學會問:好像 inline-block 也能實現這個效果呀?沒錯,inline-block 也能實現這樣的效果。但實際上,inline-block 是在 float 之后才出現的。 我猜,是 CSS 官方覺得:好像確實需要有這么一個屬性值,可以讓多個元素顯示在同一行,又可以設置它們的寬高。人民群眾既然需要,那么我們就搞一個 inline-block 給大家用吧!

但從回顧過去,貌似大家用 float 更多一些,用 inline-block 更少一些。為啥呢?或許是 inline-block 出現之前,大家都習慣用 float 了。而 inline-block 比起 float 貌似沒什么太大的改變,于是就沒動力去換了吧。

后來 CSS3 的 flex、grid 出現了,CSS 才真正有了一個非常好用的布局工具。到了 2023 年的今天,除非是一些需要兼容古老瀏覽器版本的頁面需要用 float 布局,其他大多數的 Web 頁面布局都使用 flex、grid 進行布局了。

看到這里,信息量貌似有點大,怎么去理解 block -> float -> inline-block -> flex/grid的這種布局變遷呢?知乎某前端大 V 賀師俊的理解,我覺得很好:

言歸正傳,CSS1時代的網頁還很簡陋,但是隨著萬維網的迅猛發展,Web界面也迅速進化,當初簡單的如同書頁般的通欄式網頁迅速絕跡,frameset由于天生存在的一堆問題也很快退出主流,這時CSS在GUI布局方面就顯出了缺陷,開發者被迫使用各種trick。比如歷史悠久的table布局。后來table布局被鄙視,開發者逐漸轉向了float布局。

要說float布局之所以流行,IE“功”不可沒。在IE中,has layout的元素是不會環繞float元素的(因為has layout的元素自己是一個控件,所以總是保持一個矩形區域)。這本來是一個bug,但是其效果卻正好符合常見的雙欄布局的需要。另外IE下float元素會自動撐開其父級container元素(當然前提是container元素也是has layout的),這其實也是bug,但是也恰好符合模塊布局的需求。后來所謂inline-block布局其實正是這些bug的合理化。

站在今天回望過去十多年的CSS實踐,我們可以發現,無論float布局還是后來的inline-block布局,其實都是trick。所謂trick,就是將一些特性挪作他用,以很曲折的方式實現出想要的效果。CSS作為樣式語言,其可維護性的最終來源,就是代碼能清晰的表達出設計意圖。而CSS trick當然不能很好的滿足這一點。

簡單來說,這樣的布局方式變化,其實是 CSS 不斷完善進化的結果。一開始的時候,CSS 的功能比較簡陋,所以需要我們自己用各種 trick 來實現需要的功能。到了后面,各種應用場景日趨完善,CSS 也不斷完善起來,最終我們可以用很簡單的 flex、grid 就實現之前所需要的效果。

以上關于 CSS 變遷的理解,來自于賀師俊的知乎回答,感興趣的同學可以點擊查看原文:在 CSS 中,用 float 和 position 的區別是什么?- 賀師俊的回答 - 知乎

position

如 position 名字的意思一樣,position 主要是用來調整元素位置用的。一般情況下,我們用 display 和 float 做好布局之后,可能需要對元素做一些微調,那么這時候就該 position 登場了。對于 position 來說,其有五個屬性值,分別是:static、relative、absolute、fixed、sticky。

static

static 關鍵字指定元素使用正常的布局行為,即元素在文檔常規流中當前的布局位置。

如下圖所示的 HTML 片段,我們不設置 position 屬性,或者設置 position 屬性為 static,其展示形式都不發生變化。

<div class="parent">
    <div class="box"></div>
</div>
.parent{
  width: 200px;
  height: 200px;
  border: 1px solid red;
}

.box {
  position: static;
  width: 50px;
  height: 50px;
  background-color: black;
}

-w241-w241

relative

relative 表示相對定位,即相對于其父級容器做偏移。偏移位置使用 left/right/top/bottom 屬性來設置。就如上面的例子中,如果我們使用如下的 CSS 設置,我們可以看到對應的塊元素相對父容器做了偏移,如下圖所示。

.parent{
  width: 200px;
  height: 200px;
  border: 1px solid red;
}

.box {
  position: relative;
  left: 20px;
  top: 20px;
  width: 50px;
  height: 50px;
  background-color: black;
}

-w232-w232

absolute

absolute 表示絕對定位。元素會被移出正常文檔流,并不為元素預留空間。通過指定元素相對于最近的非 static 定位祖先元素的偏移,來確定元素位置。絕對定位的元素可以設置外邊距(margins),且不會與其他邊距合并。

如下所示的 HTML 片段,我們使用如下的 CSS 設置進行設置,那么對應元素塊(box類所在元素)的偏移原點就不是其父級元素(son類所在元素),而是最頂層的非 static 定義的祖先元素了(parent類所在元素),如下圖所示。

<body>
  <div class="parent">
    <div class="son">
          <div class="box"></div>
    </div>
  </div>
</body>
.parent{
  position: relative;
  top: 50px;
  left: 800px;
  width: 300px;
  height: 200px;
  border: 1px solid red;
}

.son {
  top: 30px;
  left: 30px;
  width: 100px;
  height: 100px;
  border: 1px solid black;
}

.box {
  position: absolute;
  left: 20px;
  top: 20px;
  width: 50px;
  height: 50px;
  background-color: black;
}

-w1245-w1245

fixed

fixed 也表示絕對定位。元素會被移出正常文檔流,并不為元素預留空間,而是通過指定元素相對于屏幕視口(viewport)的位置來指定元素位置。元素的位置在屏幕滾動時不會改變。其與 absolute 的區別是,fixed 是相對于屏幕 viewport 做偏移的,而 absolute 是相對于最近的一個非 static 祖先元素做偏移的。

如下所示的 HTML 代碼塊,其與上面 absolute 屬性里的代碼塊完全一致,我們只是將 box 類的 position 屬性值改為了 fixed,如下代碼所示。

<body>
  <div class="parent">
    <div class="son">
          <div class="box"></div>
    </div>
  </div>
</body>
.parent{
  position: relative;
  top: 50px;
  left: 800px;
  width: 300px;
  height: 200px;
  border: 1px solid red;
}

.son {
  top: 30px;
  left: 30px;
  width: 100px;
  height: 100px;
  border: 1px solid black;
}

.box {
  position: fixed;
  left: 20px;
  top: 20px;
  width: 50px;
  height: 50px;
  background-color: black;
}

其展示的效果如下圖所示。

-w1184-w1184

從這里我們可以較為清晰地看出 absolute 和 fixed 兩個屬性值的區別。

sticky

sticky 表示粘性布局,其可以被認為是相對定位和固定定位的混合。元素在跨越特定閾值前為相對定位,之后為固定定位。例如:

#one {
  position: sticky;
  top: 10px;
}

上面的代碼表示:在 viewport 視口滾動到元素 top 距離小于 10px 之前,元素為相對定位。等到距離小于 10px 之后,元素將變為 fixed 定位,元素將固定在與 viewport 頂部距離 10px 的位置。直到元素與 viewport 頂部的距離再次大于 10px,將再次變成相對定位。

一般情況下,這個用于一些滾動查看文本時,需要將某些信息置頂再頂部的情況,如下圖所示。

2023091612375620230916123756

在 sticky 屬性之前,我們需要自己做很復雜的設置才能實現這樣的效果。但 sticky 屬性直接幫我們實現了,非常方便。

CSS 布局解決方

看到這里,我們基本上把 CSS 布局所需要了解的知識點都介紹了一遍。那我們在實現 Web 頁面的時候,到底應該用哪些 CSS 屬性呢?是 float + block,還是 inlien-blcok,亦或是 flex 呢?

這里我直接給出答案:如果沒有歷史負擔,不需要去兼容老版本瀏覽器,那么直接上 flex/grid 布局。如果要兼容古老的瀏覽器版本,那么就先用 float,float 解決不了就用 position。

為啥是這樣呢?以為 flex 和 grid 布局是最新的 CSS3 提供的解決方案,是對之前 float + display + position 的總結,是更好的工具。但缺點也明顯,就是一些老版本瀏覽器不兼容,沒法使用。因此要兼容老版本瀏覽器的話,就只能用老古董的 float 這種 tricks 了。

float 布局方式

如果你需要用 float 這種方式去做布局,那可以參考一下這篇文章:【CSS】CSS布局解決方案(終結版) - 掘金。文章里列舉了不少布局方式,還是比較實用的,讓你快速掌握常用的布局方式。

我把文章中涉及到的例子都整理到了 CodePen 上,方便大家嘗試,有需要的可以看看:https://codepen.io/Ronald-Chan/pen/wvRdBGL

flex 布局

對于 flex 布局來說,其使用也非常簡單,基本上把對應的屬性看一篇就知道怎么玩了。不像 float 布局一樣,需要思來想去的,非常麻煩。

考慮到問文章篇幅和主題問題,關于如何使用 flex、grid 進行排版布局,這里就不延展展開了,后續有機會再分享 flex 布局相關內容。

總結

對于 CSS 布局,之前自己只粗淺地知道 float、display 這些屬性,并沒有深入對比彼此的區別。當然也沒有去了解這些屬性背后的 CSS 發展歷程,于是很多時候都會被弄暈。

但這次通過將屬性之間進行對比,再深入了解了一下 CSS 的發展歷程,對 CSS 布局的知識有了整體的了解。知道過去用的是什么方式布局,現在及未來要用什么方式布局,對 CSS 布局就更有底了。

對于 CSS 布局來說,float 方式的布局慢慢會被淘汰,因此不必花大力氣去學習,只在有需要的時候學習一下就好。我們的學習重點應該放在 flex、grid 等布局方式的學習,這也是我后續的學習方向。

關于 CSS 布局知識的分享就到此為止。希望這篇文章也能給你帶來收獲,讓你更好掌握 CSS 布局技能。

責任編輯:華軒 來源: 樹哥聊編程
相關推薦

2023-09-18 08:02:45

CSS布局屬性

2023-12-12 07:31:51

Executors工具開發者

2022-08-03 08:01:16

CDN網站服務器

2022-09-05 09:25:53

KubernetesService

2023-03-30 08:52:40

DartFlutter

2023-03-27 17:58:34

MySQL加鎖間隙鎖

2023-04-04 08:01:47

2022-04-08 09:01:14

CSS自定義屬性前端

2024-10-16 10:11:52

2022-09-09 10:00:13

KubernetesConfigMap

2023-10-26 16:33:59

float 布局前段CSS

2023-11-28 09:31:55

MySQL算法

2022-08-09 09:10:43

Kubernetes容器

2022-09-01 08:01:56

Pythongunicorn

2024-05-09 10:11:30

2023-07-31 08:18:50

Docker參數容器

2021-05-29 10:11:00

Kafa數據業務

2022-11-11 19:09:13

架構

2023-11-06 08:16:19

APM系統運維

2023-11-20 08:18:49

Netty服務器
點贊
收藏

51CTO技術棧公眾號

精品国产av无码一区二区三区| 狠狠色丁香久久婷婷综合丁香| 国产呦萝稀缺另类资源| 欧美性生活大片视频| 亚洲a∨日韩av高清在线观看| 在线观看免费国产小视频| 日韩一区电影| 欧美大片顶级少妇| 午夜精品视频在线观看一区二区| 神马久久午夜| 成人app下载| 成人有码在线视频| 日韩欧美四区| 热久久美女精品天天吊色| 日韩最新中文字幕| 影音先锋久久久| 亚洲一区二区三区四区视频| 欧美人与牛zoz0性行为| wwwxxx在线观看| 老**午夜毛片一区二区三区| 在线观看一区二区视频| 精品无码久久久久国产| 国产羞羞视频在线播放| 欧美日本一道本| 成人影院在线视频| 国产亚洲一级高清| 欧美顶级毛片在线播放| 91精品国产色综合| 精品黄色一级片| 91视频99| 激情小说亚洲一区| 日本中文字幕高清| 欧美综合欧美视频| 欧美wwww| 国产精品美女免费视频| 欧美日韩精品| 欧美一级爽aaaaa大片| 亚洲美女视频| 国产精品久久久久久婷婷天堂| 精品日韩av| av激情亚洲男人天堂| 亚洲国产成人精品一区二区| 国产一区二区精品在线| 成人乱码手机视频| 亚洲免费伊人电影在线观看av| 水中色av综合| 午夜国产精品影院在线观看| 国产91美女视频| 久久久久久久久久久黄色 | 电影av在线| 一区二区三区日韩在线观看| 老汉色影院首页| 欧美电影院免费观看| 久久天堂av综合合色| 涩涩视频网站在线观看| 久久九九免费视频| 精品国产欧美日韩一区二区三区| 成人性生交大片免费看中文网站| 青青草国产精品一区二区| 国产黄色大片在线观看| 亚洲另类中文字| 99热亚洲精品| 久久午夜国产精品| 香蕉视频在线观看免费| 51精品秘密在线观看| 丝袜美腿综合| 国产成人久久婷婷精品流白浆| 日韩福利影视| 国产传媒一区二区| 欧美日韩五月天| 一区二区亚洲| 成年网站在线| 成人欧美一区二区三区视频xxx| 亚洲欧洲日产国码二区| 日韩免费高清视频网站| 丁香婷婷综合激情| 亚洲高清av在线| 在线高清一区| 四虎国产精品成人免费4hu| 欧美性感美女h网站在线观看免费| av在线免费一区| 国模私拍一区二区三区| 国产91精品一区二区麻豆亚洲| 久久久亚洲精华液精华液精华液| 超碰97人人做人人爱少妇| 羞羞视频在线观看欧美| 中文av一区二区三区| 欧美无乱码久久久免费午夜一区| 在这里有精品| 亚洲视频小说| 久久综合久久八八| 欧美日韩黑人| 男女视频网站在线观看| 国产精品久久久av久久久| 亚洲精品视频自拍| 精品裸体bbb| 欧美久久免费观看| gogo在线高清视频| 精品国产麻豆免费人成网站| 免费人成黄页在线观看忧物| 亚洲国产精品人人爽夜夜爽| 国产日韩欧美一区在线| 牛牛电影国产一区二区| 小泽玛利亚av在线| 日韩免费av片在线观看| 91精品国产品国语在线不卡| 一区二区在线看| 四虎影视精品| 91在线色戒在线| 日韩国产欧美一区| 一色屋精品亚洲香蕉网站| 欧美成人日本| 日韩一级电影| 国产直播在线| 精品久久久久一区二区三区 | 欧美日韩一级二级三级| 亚洲自拍另类| 蜜桃精品视频| av美女在线| 精品久久久久久乱码天堂| 亚洲一区在线播放| 午夜精品免费| 欧美韩日亚洲| 97影院理论| 久久久免费看| 中文欧美日本在线资源| 久久免费视频一区| 欧美一区国产| 国产高清视频在线播放| 99久热re在线精品视频| 日韩欧美亚洲另类制服综合在线| 狠狠狠色丁香婷婷综合激情| 免费观看一级特黄欧美大片| 国产日韩欧美一区二区三区在线观看| 三级网站在线| 亚洲自拍av在线| 欧洲永久精品大片ww免费漫画| 欧美一级日韩不卡播放免费| 国产精品麻豆一区二区| 奇米影视777在线欧美电影观看| 久久久久久77777| 欧美国产日本在线| 中文字幕一区在线| 日本一区二区在线看| 美足av综合网| 成人18网址在线观看| 国产精品高清一区二区三区| 亚洲电影免费观看高清| 麻豆精品在线观看| 久久悠悠精品综合网| 国产写真视频在线观看| 色一情一乱一伦一区二区三区| 欧美猛男男办公室激情| 久久久国产亚洲精品| 性欧美freesex顶级少妇| www.xxx亚洲| 亚洲v日韩v欧美v综合| 九九九久久国产免费| 欧美性猛交xxxx黑人猛交| 免费在线欧美视频| 国产国产一区| 超碰96在线| 国产日产亚洲精品| 欧美性xxxx在线播放| 国产日韩欧美三级| 老司机午夜av| 婷婷精品国产一区二区三区日韩| 色八戒一区二区三区| 99视频一区二区| 国产精品亚洲产品| 亚洲欧美专区| 黄动漫在线免费观看| 亚洲free嫩bbb| 91地址最新发布| 精品日韩欧美一区二区| 欧美午夜片欧美片在线观看| 亚洲少妇自拍| 1024成人| 欧美私人啪啪vps| baoyu135国产精品免费| 欧美日本三级| 我要色综合中文字幕| 一区二区三区免费在线看| 欧美亚洲国产精品久久| 久久99伊人| 99久久精品网站| 欧美**字幕| 国产国产精品| 国产综合自拍| 国产一区二区三区国产| aⅴ色国产欧美| 天堂成人娱乐在线视频免费播放网站| 98在线视频| 欧美午夜黄色| 在线免费福利| 久久久999视频| 91丝袜脚交足在线播放| 亚洲美女福利视频网站| 亚洲国产第一页| 丁香六月久久综合狠狠色|