摘要:前言致謝本文總結(jié)于張?chǎng)涡窭蠋煹纳钊肜斫庵n程,感謝張老師的辛苦付出難學(xué)的作為前端狗的我們,每天都要和網(wǎng)頁打交道。頁面中任何地方,嵌套或直接放入任何空的,都不會(huì)影響原來的布局。比如,給元素聲明,但在中的屬性是。
前言 致謝
本文總結(jié)于 張?chǎng)涡窭蠋煹?CSS深入理解之margin課程,感謝張老師的辛苦付出!
難學(xué)的 CSS作為前端狗的我們,每天都要和網(wǎng)頁打交道。當(dāng) UI 將設(shè)計(jì)稿發(fā)給你時(shí),CSS 的知識(shí)便顯得尤為重要。而 CSS 這一標(biāo)記性的語言,卻時(shí)常讓我很頭疼:毫無邏輯性,并充滿了各種坑爹的潛規(guī)則 ,以至于每次做項(xiàng)目時(shí),大部分時(shí)間精力都浪費(fèi)在了調(diào)整布局與樣式上,詳情可點(diǎn)擊知乎上的為什么 CSS 這么難學(xué)?問題,道出了我的心聲 :(
但誰叫我們是吃這碗飯的呢,不管怎樣,有困難必須迎面解決,學(xué)好 CSS ,向張老師看齊!
正文margin 算是性格剛烈的屬性了,下面,我將從各個(gè)方面講解 margin 的可怕之處。
元素尺寸的影響通常一個(gè)元素的尺寸可分為:可視尺寸 與 占據(jù)尺寸
可視尺寸 - clientWidth (border - padding - size)
占據(jù)尺寸 - outerWidth (border - margin)
margin 又是怎樣影響這兩個(gè)尺寸的呢?
首先,兩個(gè)尺寸都需滿足一定的條件。
可視尺寸的影響條件適用于 沒有設(shè)定 width/height 的塊級(jí)元素 (寬高設(shè)死了,怎么會(huì)影響呢?)
其中不包括 float absolute fixed 元素 ,inline水平 ,table-cell 元素
只適用于水平方向尺寸(margin-left/margin-right)
占據(jù)尺寸的影響條件適用于 block/inline-block 水平元素
適用于 任何方向
與 width/height 值無關(guān)
inline 元素只影響水平方向 (后面會(huì)提到)
影響示例margin 影響元素的可視水平尺寸
margin的可視尺寸示例
margin 影響占據(jù)尺寸 ,這個(gè)可以說是 margin 的本命技能了,就不舉例了。
百分比單位通常而言,margin 的單位中,百分比單位最容易讓人頭暈。
普通元素的百分比 margin 都是相對(duì)于 容器的寬度 計(jì)算的
絕對(duì)定位的百分比 margin 是相對(duì)于 第一個(gè)具有定位屬性的祖先元素的寬度 計(jì)算的(relative/absolute/fixed)
重疊詳解
重疊可謂是 margin 中的最重要的潛規(guī)則了。
發(fā)生情景相鄰的兄弟元素
父級(jí)和第一個(gè)/最后一個(gè)子元素
空的塊級(jí)元素(自己和自己)
重疊條件塊級(jí)元素 (不包括 float 和 absolute 元素)
不考慮 writing-mode,只發(fā)生在垂直方向 (margin-top/margin-bottom)
父子 重疊條件
margin-top 重疊
父元素 非格式化上下文元素 沒有設(shè)置 overflow:hidden
父元素沒有 border-top 設(shè)置
父元素沒有 padding-top 設(shè)置
父元素和第一個(gè)子元素之間沒有inline元素分割
margin-bottom 重疊
父元素 非格式化上下文元素 沒有設(shè)置 overflow:hidden
父元素沒有 border-bottom 設(shè)置
父元素沒有 padding-bottom 設(shè)置
父元素和第一個(gè)子元素之間沒有inline元素分割
父元素沒有 height ,min-height,max-height 限制
空的塊級(jí)元素 margin 重疊條件
1. 元素沒有 border 設(shè)置 2. 元素沒有 padding 設(shè)置 3. 里面沒有 inline 元素 4. 沒有 height,或者 min-height計(jì)算規(guī)則
正正取大值
兩個(gè)元素垂直距離為 : #top元素的 margin-top值
正負(fù)值相加
兩個(gè)元素垂直距離為: #top元素的margin-top值 加上 #bottom元素的margin-bottom值
負(fù)負(fù)最負(fù)值
兩個(gè)元素垂直距離為 : #top元素的 margin-top值
父級(jí)和第一個(gè)/最后一個(gè)子元素 發(fā)生重疊
給子元素設(shè)置垂直方向的 margin ,等同于 給父元素設(shè)置相同的垂直方向的 margin 屬性,
也就是說 父子元素發(fā)生 margin 重疊時(shí), 它們倆共用一個(gè) margin 屬性
連續(xù)段落或列表之類,如果沒有margin重疊,排版會(huì)不自然。
頁面中任何地方,嵌套或直接放入任何空的 div,都不會(huì)影響原來的布局。
遺落空的任意多個(gè) p 元素,不會(huì)影響原來的閱讀排版。
margin auto當(dāng)你使用 margin auto 時(shí),就應(yīng)該聯(lián)想到一個(gè)詞 :填充
一個(gè)沒有設(shè)置寬高的塊級(jí)元素,會(huì)自動(dòng)填充寬度如果 一側(cè)是定值,一側(cè)是 auto,則 auto 為剩余空間的大小
如果兩側(cè)均是 auto,則平分 剩余空間
示例如下:
margin:auto 0 !== 垂直居中
以上,我們可得當(dāng)一個(gè)塊級(jí)元素設(shè)置了 margin: 0 auto 可以實(shí)現(xiàn)水平居中,
而為什么 margin:auto 0 不會(huì)垂直居中?
答:一個(gè)塊級(jí)元素會(huì)自動(dòng)填充可用的水平尺寸,但不會(huì)填充垂直尺寸,是因?yàn)槠涓緵]有任何可用的垂直空間。也就是說 margin: 0 auto , 總是有尺寸可以來填充的! 而 margin: auto 0 是沒有任何尺寸的可以來填充的。
失效情況當(dāng)子元素的寬度大于父元素的寬度 ,是無法通過 margin: 0 auto 實(shí)現(xiàn)居中的
因?yàn)?,這個(gè)時(shí)候已經(jīng)沒有任何空間可以填充了,當(dāng)寬度超出父元素時(shí),margin 已經(jīng)為負(fù)值了。
writing-mode 與垂直居中
絕對(duì)定位元素
失效情景
inline 水平元素的垂直margin 無效(margin-top/margin-bottom)
margin 重疊發(fā)生
絕對(duì)定位元素非定位方位的 margin值 "無效"
因?yàn)?絕對(duì)定位元素 脫離了文檔流,與相鄰元素沒有關(guān)系,所以它不可能像普通元素一樣,設(shè)置margin,推走其他元素
margin 鞭長(zhǎng)莫及
因?yàn)?有某些元素破壞了 文檔流,設(shè)置了 float absolute,造成了假象,margin不會(huì)根據(jù) 這些破壞元素作為標(biāo)準(zhǔn)
display:table-cell/display:table-row 等聲明的margin無效!某些替換元素除外,根據(jù)各個(gè)瀏覽器的實(shí)現(xiàn)方式作為區(qū)分。比如,給 button 元素聲明 display:table-cell,但在 chrome 中,button 的 display 屬性是 inline-block 。
內(nèi)聯(lián)特性導(dǎo)致 margin 失效
margin-top: 負(fù)無窮, 但是,小到 1em 便無效了。
因?yàn)樗莾?nèi)聯(lián)元素,默認(rèn)是基線對(duì)齊,x字母下邊緣對(duì)齊,margin 值再大,也不會(huì)起作用。
margin負(fù)無窮情景解析
margin-start
正常流向,margin-start 等同于 margin-left,兩者重疊不相加
如果水平流向是從右向左,margin-start 等同于 margin-right
在垂直流下 ( writing-mode:vertical-*; ) margin-start 等同于 margin-top
margin-end 與 margin-start 相對(duì)
margin-before 默認(rèn)情況等同于 margin-top
margin-after 默認(rèn)情況等同于 margin-bottom
margin-collapse
margin-collapse:collapse;
(默認(rèn)值) 發(fā)生重疊
margin-collapse:discard;
取消重疊,margin 重疊部分為 0 ,沒有margin
margin-collapse:separate;
不發(fā)生重疊,margin 重疊部分為 margin-top + margin-bottom結(jié)束語
margin 課程就到此結(jié)束了,再次感謝張?chǎng)涡窭蠋煹男量喔冻觯?/p>
深入Web全棧各項(xiàng)技術(shù),堅(jiān)持原創(chuàng),文章更新雖不定,但只為質(zhì)量而生,如果您喜歡此篇文章,歡迎支持關(guān)注。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/115714.html
摘要:思路合并所有改變?nèi)缓笠淮涡蕴幚硎褂脤傩孕薷念惷啃薷漠?dāng)你需要對(duì)元素進(jìn)行一系列操作的時(shí)候,不妨按照如下步驟使元素脫離文檔流對(duì)其應(yīng)用多重改變把元素帶回文檔中上面的這一套組合拳中,第一步和第三部分別會(huì)觸發(fā)一次重排。 前言:隨著vue,react, angular的流行,可能現(xiàn)在我們不必經(jīng)常的操作DOM,三大框架在副交互的操作中發(fā)揮著極大地優(yōu)勢(shì)。因?yàn)槲覀冎烙媚_本對(duì)DOM的操作非常昂貴,本文...
摘要:思路合并所有改變?nèi)缓笠淮涡蕴幚硎褂脤傩孕薷念惷啃薷漠?dāng)你需要對(duì)元素進(jìn)行一系列操作的時(shí)候,不妨按照如下步驟使元素脫離文檔流對(duì)其應(yīng)用多重改變把元素帶回文檔中上面的這一套組合拳中,第一步和第三部分別會(huì)觸發(fā)一次重排。 前言:隨著vue,react, angular的流行,可能現(xiàn)在我們不必經(jīng)常的操作DOM,三大框架在副交互的操作中發(fā)揮著極大地優(yōu)勢(shì)。因?yàn)槲覀冎烙媚_本對(duì)DOM的操作非常昂貴,本文...
摘要:偽元素偽元素能做什么我們要他有何用它能為我們解決什么問題和其他的方法相比她有什么有點(diǎn)我們?yōu)槭裁匆褂盟鼈卧睾蛡晤愐粯?,添加到選擇器,但是不是描述狀態(tài),他允許我們?yōu)樵啬承┎糠衷O(shè)置樣式利用偽元素,我們可以簡(jiǎn)化頁面的標(biāo)簽,同時(shí)用起來也很方便, 偽元素 偽元素能做什么?我們要他有何用?它能為我們解決什么問題?和其他的方法相比她有什么有點(diǎn)?我們?yōu)槭裁匆褂盟?偽元素和偽類一樣,添加到選擇器...
摘要:偽元素偽元素能做什么我們要他有何用它能為我們解決什么問題和其他的方法相比她有什么有點(diǎn)我們?yōu)槭裁匆褂盟鼈卧睾蛡晤愐粯?,添加到選擇器,但是不是描述狀態(tài),他允許我們?yōu)樵啬承┎糠衷O(shè)置樣式利用偽元素,我們可以簡(jiǎn)化頁面的標(biāo)簽,同時(shí)用起來也很方便, 偽元素 偽元素能做什么?我們要他有何用?它能為我們解決什么問題?和其他的方法相比她有什么有點(diǎn)?我們?yōu)槭裁匆褂盟?偽元素和偽類一樣,添加到選擇器...
閱讀 3717·2023-04-26 00:56
閱讀 2708·2021-09-30 10:01
閱讀 977·2021-09-22 15:30
閱讀 3936·2021-09-07 10:21
閱讀 1549·2021-09-02 15:40
閱讀 2777·2021-08-30 09:47
閱讀 1260·2021-08-16 10:57
閱讀 1878·2019-08-30 14:01