CSS 最核心的幾個概念

本文將講述 CSS 中最核心的幾個概念承边,包括:盒模型、position毡鉴、float等崔泵。這些是 CSS 的基礎(chǔ),也是最常用的幾個屬性猪瞬,它們之間看似獨立卻又相輔相成憎瘸。為了掌握它們,有必要寫出來探討一下陈瘦,如有錯誤歡迎指正幌甘。

元素類型

HTML 的元素可以分為兩種:

  • 塊級元素(block level element)
  • 內(nèi)聯(lián)元素(inline element 有的人也叫它行內(nèi)元素)

兩者的區(qū)別在于以下三點:

  1. 塊級元素會獨占一行(即無法與其他元素顯示在同一行內(nèi),除非你顯示修改元素的 display 屬性),而內(nèi)聯(lián)元素則都會在一行內(nèi)顯示含潘。
  2. 塊級元素可以設(shè)置 width、height 屬性线婚,而內(nèi)聯(lián)元素設(shè)置無效遏弱。
  3. 塊級元素的 width 默認為 100%,而內(nèi)聯(lián)元素則是根據(jù)其自身的內(nèi)容或子元素來決定其寬度塞弊。

最常見塊級元素應(yīng)該是 <div> 吧漱逸,內(nèi)聯(lián)元素有 <span> <a> <img> 等等,完整的元素列表可以谷歌一下游沿。

具體來說一下吧,

.example {
    width: 100px;
    height: 100px;
}

我們?yōu)?<div> 設(shè)置上面的樣式饰抒,是有效果的,因為其是塊級元素诀黍,而對 <span> 設(shè)置上面的樣式是沒用的袋坑。要想讓 <span> 也可以改變寬高,可以通過設(shè)置 display: block; 來達到效果眯勾。當 display 的值設(shè)為 block 時枣宫,元素將以塊級形式呈現(xiàn);當 display 值設(shè)為 inline 時吃环,元素將以內(nèi)聯(lián)形式呈現(xiàn)也颤。

若既想讓元素在行內(nèi)顯示,又能設(shè)置寬高郁轻,可以設(shè)置:

display: inline-block;

inline-block 在我看來就是讓元素對外呈內(nèi)聯(lián)元素翅娶,可以和其他元素共處與一行內(nèi);對內(nèi)則讓元素呈塊級元素好唯,可改變其寬高竭沫。


HTML 代碼是順序執(zhí)行的,一份無任何 CSS 樣式的 HTML 代碼最終呈現(xiàn)出的頁面是根據(jù)元素出現(xiàn)的順序和類型排列的骑篙。塊級元素就從上到下排列输吏,遇到內(nèi)聯(lián)元素則從左到右排列。這種無樣式的情況下替蛉,元素的分布叫普通流贯溅,元素出現(xiàn)的位置應(yīng)該叫正常位置(這是我瞎起的),同時所有元素會在頁面上占據(jù)一個空間躲查,空間大小由其盒模型決定它浅。

盒模型

頁面上顯示的每個元素(包括內(nèi)聯(lián)元素)都可以看作一個盒子,即盒模型( box model )镣煮。請看Chrome DevTools 里的截圖:

可以顯而易見的看出盒模型由 4 部分組成姐霍。從內(nèi)到外分別是:

    content -> padding -> border -> margin

按理來說一個元素的寬度(高度以此類推)應(yīng)該這樣計算:

總寬度 = margin-left + border-left + padding-left + width + padding-right + border-right + margin-right

但是不同瀏覽器(你沒有猜錯,就是那個與眾不同的瀏覽器)對寬度的詮釋不一樣。符合 W3C 標準的瀏覽器認為一個元素的寬度只等于其 content 的寬度镊折,其余都要額外算胯府。于是你規(guī)定一個元素:

.example {
    width: 200px;
    padding: 10px;
    border: 5px solid #000;
    margin: 20px;
}

則他最終的寬度應(yīng)為:

寬度 = width(200px) + padding(10px * 2) + border(5px * 2) + margin(20px * 2) = 270px;

而在 IE(低于IE9) 下,最終寬度為:

寬度 = width(200px) + margin(20px * 2) = 240px;

我個人覺得 IE 的更符合人類思維恨胚,畢竟 padding 叫內(nèi)邊距骂因,邊框算作額外的寬度也說不下去。W3C 最后為了解決這個問題赃泡,在 CSS3 中加了 box-sizing 這個屬性寒波。當我們設(shè)置 box-sizing: border-box; 時,border 和 padding 就被包含在了寬高之內(nèi)升熊,和 IE 之前的標準是一樣的俄烁。所以,為了避免你同一份 css 在不同瀏覽器下表現(xiàn)不同级野,最好加上:

*, *:before, *:after {
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
}

這里還有兩種特殊情況:

  • 無寬度 —— 絕對定位(position: absolute;) 元素
  • 無寬度 —— 浮動(float) 元素

它們在頁面上的表現(xiàn)均不占據(jù)空間(脫離普通流页屠,感覺像浮在頁面上層一樣,移動它們不影響其他元素的定位)蓖柔。這就涉及到另外兩個核心概念 position 和 float卷中。

position

position 這個屬性決定了元素將如何定位。它的值大概有以下五種:

position 值 如何定位
static position的默認值渊抽。元素將定位到它的正常位置(上文提到過)蟆豫,其實也就相當于沒有定位。元素在頁面上占據(jù)位置懒闷。不能使用 top right bottom left 移動元素位置十减。
relative 相對定位,相對于元素的正常位置來進行定位愤估。元素在頁面占據(jù)位置帮辟。可以使用 top right bottom left 移動元素位置。
absolute 絕對定位玩焰,相對于最近一級的 定位不是 static 的父元素來進行定位由驹。元素在頁面不占據(jù)位置。 可以使用 top right bottom left 移動元素位置昔园。
fixed 絕對定位蔓榄,相對于瀏覽器窗口來進行定位。其余和 absolute 一樣默刚,相當于一種特殊的 absolute甥郑。
inherit 從父元素繼承 position 屬性的值。

具體效果可以參考w3school的實例荤西,或者自己寫一下就明白了澜搅。

每個網(wǎng)頁都可以看成是由一層一層頁面堆疊起來的伍俘,如下圖所示。

圖片來自網(wǎng)絡(luò)
圖片來自網(wǎng)絡(luò)

position 設(shè)置為 relative 的時候勉躺,元素依然在普通流中癌瘾,位置是正常位置,你可以通過 left right 等移動元素饵溅。會影響其他元素的位置妨退。

而當一個元素的 position 值為 absolute 或 fixed 的時候,會發(fā)生三件事:

  1. 把該元素往 Z 軸方向移了一層概说,元素脫離了普通流碧注,所以不再占據(jù)原來那層的空間嚣伐,還會覆蓋下層的元素糖赔。
  2. 該元素將變?yōu)閴K級元素,相當于給該元素設(shè)置了 display: block;(給一個內(nèi)聯(lián)元素轩端,如 <span> 放典,設(shè)置 absolute 之后發(fā)現(xiàn)它可以設(shè)置寬高了)。
  3. 如果該元素是塊級元素基茵,元素的寬度由原來的 width: 100%(占據(jù)一行)奋构,變?yōu)榱?auto。

由此觀之拱层,當 position 設(shè)置為 absolute 或 fixed弥臼,就沒必要設(shè)置 display 為 block 了。而且如果你不想覆蓋下層的元素根灯,可以設(shè)置 z-index 值 達到效果径缅。

float

float 顧名思義,就是把元素浮動烙肺,它的取值一共有四個:left right none inherit纳猪,光看名字就懂了,無需多言桃笙。

最初的 float 只是用來實現(xiàn)文字環(huán)繞圖片的效果氏堤,僅此而已。而現(xiàn)在 float 的應(yīng)用已不止這個搏明,前輩們也是寫了無數(shù)博文來深入淺出的講解它鼠锈。
淺如:
經(jīng)驗分享:CSS浮動(float,clear)通俗講解 篇幅不長,通俗易懂星著,可以看完這篇文章再回過頭來看本文脚祟。
深如:
CSS float浮動的深入研究、詳解及拓展(一)
CSS float浮動的深入研究强饮、詳解及拓展(二)
從本質(zhì)上講解了 float 的原理由桌。

我就不班門弄斧寫原理了,只說說 float 的幾個要點就行了:

  1. 只有左右浮動,沒有上下浮動行您。

  2. 元素設(shè)置 float 之后铭乾,它會脫離普通流(和 position: absolute; 一樣),不再占據(jù)原來那層的空間娃循,還會覆蓋下一層的元素炕檩。

  3. 浮動不會對該元素的上一個兄弟元素有任何影響。

  4. 浮動之后捌斧,該元素的下一個兄弟元素會緊貼到該元素之前沒有設(shè)置 float 的元素之后(很好理解笛质,因為該元素脫離普通流了,或者說不在這一層了捞蚂,所以它的下一個元素當然要補上它的位置)妇押。

  5. 如果該元素的下一個兄弟元素中有內(nèi)聯(lián)元素(通常是文字),則會圍繞該元素顯示姓迅,形成類似「文字圍繞圖片」的效果敲霍。(可參考CSS float浮動的深入研究、詳解及拓展(一)中的講解)丁存。這個我還是實踐了一下的肩杈,點這個JSfiddle看看吧。

  6. 下一個兄弟元素如果也設(shè)置了同一方向的 float解寝,則會緊隨該元素之后顯示扩然。

  7. 該元素將變?yōu)閴K級元素,相當于給該元素設(shè)置了 display: block;(和position: absolute; 一樣)聋伦。

這里還有個東西夫偶,就是廣為人知的——清除浮動。具體的方法五花八門嘉抓,可以看這篇:那些年我們一起清除過的浮動索守,我就不多說了。

寫完本文后抑片,腦子中又出現(xiàn)了一系列問題卵佛,假如 position 和 float 同時設(shè)置會出現(xiàn)什么問題?兼容性如何敞斋?哪個屬性會被覆蓋截汪?還沒來得及實踐,改天以排列組合的方式看看到底是什么效果……如果有人實踐過可以偷偷告訴我_


原文地址:CSS 最核心的幾個概念


本作品采用知識共享 署名-非商業(yè)性使用-禁止演繹 4.0 國際 許可協(xié)議進行許可植捎。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衙解,一起剝皮案震驚了整個濱河市绿饵,隨后出現(xiàn)的幾起案子夷恍,更是在濱河造成了極大的恐慌忆矛,老刑警劉巖气破,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異暑椰,居然都是意外死亡霍转,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門一汽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來避消,“玉大人,你說我怎么就攤上這事召夹⊙遗纾” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵监憎,是天一觀的道長纱意。 經(jīng)常有香客問我,道長枫虏,這世上最難降的妖魔是什么妇穴? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任爬虱,我火速辦了婚禮隶债,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘跑筝。我一直安慰自己死讹,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布曲梗。 她就那樣靜靜地躺著赞警,像睡著了一般。 火紅的嫁衣襯著肌膚如雪虏两。 梳的紋絲不亂的頭發(fā)上愧旦,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音定罢,去河邊找鬼笤虫。 笑死,一個胖子當著我的面吹牛祖凫,可吹牛的內(nèi)容都是我干的琼蚯。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼惠况,長吁一口氣:“原來是場噩夢啊……” “哼遭庶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起稠屠,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤峦睡,失蹤者是張志新(化名)和其女友劉穎翎苫,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體榨了,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡拉队,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了阻逮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粱快。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖叔扼,靈堂內(nèi)的尸體忽然破棺而出事哭,到底是詐尸還是另有隱情,我是刑警寧澤瓜富,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布鳍咱,位于F島的核電站,受9級特大地震影響与柑,放射性物質(zhì)發(fā)生泄漏谤辜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一价捧、第九天 我趴在偏房一處隱蔽的房頂上張望丑念。 院中可真熱鬧,春花似錦结蟋、人聲如沸脯倚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽推正。三九已至,卻和暖如春宝惰,著一層夾襖步出監(jiān)牢的瞬間植榕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工尼夺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留尊残,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓汞斧,卻偏偏與公主長得像夜郁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子粘勒,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案竞端? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽?zāi)J的外補...
    _Yfling閱讀 13,728評論 1 92
  • 本文將講述 CSS 中最核心的幾個概念,包括:盒模型庙睡、position事富、float等技俐。這些是 CSS 的基礎(chǔ),也是...
    王鈺峰閱讀 245評論 0 0
  • 本文將講述 CSS 中最核心的幾個概念统台,包括:盒模型雕擂、position、float等贱勃。這些是 CSS 的基礎(chǔ)井赌,也是...
    WEB攻程獅閱讀 359評論 0 21
  • 本文主要是起筆記的作用,內(nèi)容來自慕課網(wǎng). 認識CSS樣式 CSS全稱為“層疊樣式表 (Cascading Styl...
    0o凍僵的企鵝o0閱讀 2,622評論 0 30
  • 1、傅海峰的遺憾:沒能用一個世界冠軍結(jié)束自己的運動生涯 其實傅海峰應(yīng)該是2017年蘇迪曼杯最失意的人戚绕。 最后一次的...
    小說家郭大俠閱讀 456評論 0 2