日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

一文帶你弄懂 CSS 布局知識

來源: 責編: 時間:2023-09-18 21:40:24 278觀看
導讀大家好,我是樹哥。最近想著學習點前端知識,于是就學習了關于前端 Web 的布局知識,其實就是 CSS 那些事。關于 CSS 其實很早就接觸過了,但一直沒有沉下心來去學習,所以對于 CSS 布局的東西一直都不成體系。這次趁著重學前端

大家好,我是樹哥。RKU28資訊網——每日最新資訊28at.com

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

前言

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

1、常用的幾個 CSS 布局屬性作用及區別。 RKU28資訊網——每日最新資訊28at.com

2、CSS 布局的歷史以及當前流行的布局方式。RKU28資訊網——每日最新資訊28at.com

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

關于文檔流

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

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

RKU28資訊網——每日最新資訊28at.com

核心 CSS 屬性

在 CSS 布局中,有三個常用的 CSS 屬性,分別是:display、float、position。它們具有不同的功能,適用于不同的場景。RKU28資訊網——每日最新資訊28at.com

display

就像 display 的名字一樣,其用來定義元素塊的展示形式,不同的展示形式會有不同的展示效果。 display 屬性的常用屬性有:RKU28資訊網——每日最新資訊28at.com

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

要注意的是,不同的 HTML 元素,其默認的展示形式是不同的。例如 p 元素(段落)的 display 屬性默認值是 block,而 a 屬性(鏈接)的 display 屬性默認值則是 inine。RKU28資訊網——每日最新資訊28at.com

下面,我們通過幾個簡單的例子來體會一下上面所說的內容。如下圖所示的代碼,我們設置不同的 CSS 屬性,元素的展示形式會發生變化。RKU28資訊網——每日最新資訊28at.com

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

設置的 CSS 屬性如下所示:RKU28資訊網——每日最新資訊28at.com

.display {  background-color: red;}

顯示效果如下圖所示。RKU28資訊網——每日最新資訊28at.com

-w524-w524RKU28資訊網——每日最新資訊28at.com

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

如果我們把 p 元素設置成 inline 顯示形式,那么它們就會多個元素排列在一行內。如下圖所示。RKU28資訊網——每日最新資訊28at.com

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

-w228-w228RKU28資訊網——每日最新資訊28at.com

如果我們把 p 元素設置成 inline-block 顯示形式,并且設置了寬高,那么它們就會多個元素排列在一行內,并且寬高設置會生效。如下圖所示。RKU28資訊網——每日最新資訊28at.com

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

-w639-w639RKU28資訊網——每日最新資訊28at.com

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

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

float

就像 float 這個名字一樣,它代表著浮動。RKU28資訊網——每日最新資訊28at.com

啥意思呢?RKU28資訊網——每日最新資訊28at.com

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

-w1173-w1173RKU28資訊網——每日最新資訊28at.com

這時候 CSS 就滿足不了我們的訴求了!RKU28資訊網——每日最新資訊28at.com

那怎么辦呢?RKU28資訊網——每日最新資訊28at.com

這時候 float 就橫空出世了!RKU28資訊網——每日最新資訊28at.com

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

舉個簡單地例子,下面的 HTML 片段,設置了三個 block 元素塊。RKU28資訊網——每日最新資訊28at.com

<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;}

在沒有設置浮動之前,每個塊級元素都會占用一行,如下圖所示。RKU28資訊網——每日最新資訊28at.com

-w264-w264RKU28資訊網——每日最新資訊28at.com

但是如果我們對元素設置了向左浮動,那么它們就會往左浮動,三個塊級元素都浮動到了同一行,如下圖所示。RKU28資訊網——每日最新資訊28at.com

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

-w626-w626RKU28資訊網——每日最新資訊28at.com

所以,float 元素的出現,是用來解決 block 元素塊無法同行顯示,從而無法實現特定布局場景的問題的。 在 float 出現的很長一段時間,基本上大家都靠 float 來進行頁面布局。RKU28資訊網——每日最新資訊28at.com

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

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

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

看到這里,信息量貌似有點大,怎么去理解 block -> float -> inline-block -> flex/grid 的這種布局變遷呢?知乎某前端大 V 賀師俊的理解,我覺得很好:RKU28資訊網——每日最新資訊28at.com

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

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

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

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

以上關于 CSS 變遷的理解,來自于賀師俊的知乎回答,感興趣的同學可以點擊查看原文:在 CSS 中,用 float 和 position 的區別是什么?- 賀師俊的回答 - 知乎RKU28資訊網——每日最新資訊28at.com

position

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

static

static 關鍵字指定元素使用正常的布局行為,即元素在文檔常規流中當前的布局位置。RKU28資訊網——每日最新資訊28at.com

如下圖所示的 HTML 片段,我們不設置 position 屬性,或者設置 position 屬性為 static,其展示形式都不發生變化。RKU28資訊網——每日最新資訊28at.com

<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-w241RKU28資訊網——每日最新資訊28at.com

relative

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

.parent{  width: 200px;  height: 200px;  border: 1px solid red;}.box {  position: relative;  left: 20px;  top: 20px;  width: 50px;  height: 50px;  background-color: black;}

-w232-w232RKU28資訊網——每日最新資訊28at.com

absolute

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

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

<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-w1245RKU28資訊網——每日最新資訊28at.com

fixed

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

如下所示的 HTML 代碼塊,其與上面 absolute 屬性里的代碼塊完全一致,我們只是將 box 類的 position 屬性值改為了 fixed,如下代碼所示。RKU28資訊網——每日最新資訊28at.com

<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;}

其展示的效果如下圖所示。RKU28資訊網——每日最新資訊28at.com

-w1184-w1184RKU28資訊網——每日最新資訊28at.com

從這里我們可以較為清晰地看出 absolute 和 fixed 兩個屬性值的區別。RKU28資訊網——每日最新資訊28at.com

sticky

sticky 表示粘性布局,其可以被認為是相對定位和固定定位的混合。元素在跨越特定閾值前為相對定位,之后為固定定位。例如:RKU28資訊網——每日最新資訊28at.com

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

上面的代碼表示:在 viewport 視口滾動到元素 top 距離小于 10px 之前,元素為相對定位。等到距離小于 10px 之后,元素將變為 fixed 定位,元素將固定在與 viewport 頂部距離 10px 的位置。直到元素與 viewport 頂部的距離再次大于 10px,將再次變成相對定位。RKU28資訊網——每日最新資訊28at.com

一般情況下,這個用于一些滾動查看文本時,需要將某些信息置頂再頂部的情況,如下圖所示。RKU28資訊網——每日最新資訊28at.com

圖片圖片RKU28資訊網——每日最新資訊28at.com

在 sticky 屬性之前,我們需要自己做很復雜的設置才能實現這樣的效果。但 sticky 屬性直接幫我們實現了,非常方便。RKU28資訊網——每日最新資訊28at.com

CSS 布局解決方案

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

這里我直接給出答案:如果沒有歷史負擔,不需要去兼容老版本瀏覽器,那么直接上 flex/grid 布局。如果要兼容古老的瀏覽器版本,那么就先用 float,float 解決不了就用 position。RKU28資訊網——每日最新資訊28at.com

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

float 布局方式

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

我把文章中涉及到的例子都整理到了 CodePen 上,方便大家嘗試,有需要的可以看看:https://codepen.io/Ronald-Chan/pen/wvRdBGLRKU28資訊網——每日最新資訊28at.com

flex 布局

對于 flex 布局來說,其使用也非常簡單,基本上把對應的屬性看一篇就知道怎么玩了。不像 float 布局一樣,需要思來想去的,非常麻煩。RKU28資訊網——每日最新資訊28at.com

考慮到問文章篇幅和主題問題,關于如何使用 flex、grid 進行排版布局,這里就不延展展開了,后續有機會再分享 flex 布局相關內容。RKU28資訊網——每日最新資訊28at.com

總結

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

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

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

關于 CSS 布局知識的分享就到此為止。希望這篇文章也能給你帶來收獲,讓你更好掌握 CSS 布局技能。如果這篇文章對你有幫助,記得一鍵三連支持我!RKU28資訊網——每日最新資訊28at.com

參考資料

  • CSS 中,position:absolute、float、display:inline-block 都能實現相同效果,區別是什么?- 一絲的回答 - 知乎
  • CSS3 box-sizing 屬性 | 菜鳥教程
  • 官網資料!布局和包含塊 - CSS:層疊樣式表 | MDN
  • 介紹 CSS 布局 - 學習 Web 開發 | MDN
  • 【CSS】CSS布局解決方案(終結版) - 掘金

本文鏈接:http://www.www897cc.com/showinfo-26-10418-0.html一文帶你弄懂 CSS 布局知識

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 消息隊列三劍客:RabbitMQ、RocketMQ、Kafka全面對決

下一篇: 為什么說MyBatis默認的DefaultSqlSession是線程不安全?

標簽:
  • 熱門焦點
  • 天貓精靈Sound Pro體驗:智能音箱沒有音質?來聽聽我的

    這幾年除了手機作為智能生活終端最主要的核心之外,第二個可以成為中心點的產品是什么?——是智能音箱。 手機在執行命令的時候有兩種操作方式,手和智能語音助手,而智能音箱只
  • 7月安卓手機性價比榜:努比亞+紅魔兩款新機入榜

    7月登場的新機有努比亞Z50S Pro和紅魔8S Pro,除了三星之外目前唯二的兩款搭載超頻版驍龍8Gen2處理器的產品,而且努比亞和紅魔也一貫有著不錯的性價比,所以在本次的性價比榜單
  • 容量越大越不壞?24萬塊硬盤故障率報告公布 這些產品零故障

    8月5日消息,云存儲服務商Backblaze發布了最新的硬盤故障率報告,年故障率有所上升。Backblaze發布的硬盤季度統計數據,其中包括故障率等重要方面。這些結
  • K8S | Service服務發現

    一、背景在微服務架構中,這里以開發環境「Dev」為基礎來描述,在K8S集群中通常會開放:路由網關、注冊中心、配置中心等相關服務,可以被集群外部訪問;圖片對于測試「Tes」環境或者
  • 如何通過Python線程池實現異步編程?

    線程池的概念和基本原理線程池是一種并發處理機制,它可以在程序啟動時創建一組線程,并將它們置于等待任務的狀態。當任務到達時,線程池中的某個線程會被喚醒并執行任務,執行完任
  • 2天漲粉255萬,又一賽道在抖音爆火

    來源:運營研究社作者 | 張知白編輯 | 楊佩汶設計 | 晏談夢潔這個暑期,旅游賽道徹底火了:有的「地方」火了&mdash;&mdash;貴州村超旅游收入 1 個月超過 12 億;有的「博主」火了&m
  • 超級標準版旗艦!iQOO 11S全球首發iQOO超算獨顯芯片

    上半年已接近尾聲,截至目前各大品牌旗下的頂級旗艦都已悉數亮相,而下半年即將推出的頂級旗艦已經成為了數碼圈爆料的主流,其中就包括全新的iQOO 11S系
  • 聯想的ThinkBook Plus下一版曝光,鍵盤旁邊塞個平板

    ThinkBook Plus 是聯想的一個特殊筆記本類別,它在封面放入了一塊墨水屏,也給人留下了較為深刻的印象。據有人爆料,聯想的下一款 ThinkBook Plus 可能更特殊,它
  • 北京:科技教育體驗基地開始登記

      北京“科技館之城”科技教育體驗基地登記和認證工作日前啟動。首批北京科技教育體驗基地擬于2023年全國科普日期間掛牌,后續還將開展常態化登記。  北京科技教育體驗基
Top 主站蜘蛛池模板: 石河子市| 盐源县| 绥宁县| 云和县| 和龙市| 灵宝市| 黄平县| 镇巴县| 临高县| 奉新县| 杭锦旗| 怀仁县| 洱源县| 通榆县| 桃江县| 舟山市| 隆林| 霸州市| 山东省| 个旧市| 渭源县| 调兵山市| 桂平市| 图木舒克市| 山东省| 德兴市| 罗田县| 鹤壁市| 岳阳县| 海城市| 灵寿县| 张家川| 张北县| 凤翔县| 华池县| 安新县| 淄博市| 中方县| 丹凤县| 阜平县| 霍山县|