摘要:大多數(shù)情況下,我們采用的都是正數(shù)的值,可能有時(shí)候會(huì)用到負(fù)的值。但是,本文要說(shuō)明的就是,負(fù)的值并不是,這是正常范圍內(nèi)的寫(xiě)法。所以,具體行為按照以下幾種情況說(shuō)明。我們?yōu)樵O(shè)置了兩個(gè)的負(fù)值,分別是,以及。
本文樣式代碼采用 SCSS。
瀏覽器兼容性為 IE6+。
你的網(wǎng)頁(yè)中,不可能沒(méi)有使用過(guò) margin。大多數(shù)情況下,我們采用的都是正數(shù)的 margin 值,可能有時(shí)候會(huì)用到負(fù)的 margin 值。在我們的印象中,負(fù)的 margin 值就類(lèi)似于瀏覽器的 hack 一樣,不被人接受。但是,本文要說(shuō)明的就是,負(fù)的 margin 值并不是 hack,這是正常范圍內(nèi)的寫(xiě)法。
Negative values for margin properties are allowed, but there may be implementation-specific limits. —— W3C
根據(jù) W3C,margin 是能夠接受負(fù)值的,只是在具體實(shí)現(xiàn)上有一些區(qū)別。
那么,設(shè)置 margin 為負(fù)值究竟會(huì)是什么樣的效果呢?
與設(shè)置正值不同,margin 設(shè)置負(fù)值需要根據(jù)設(shè)置的方向以及元素是否浮動(dòng)以及其定位方式來(lái)判斷最終的行為。
所以,具體行為按照以下幾種情況說(shuō)明。
第一種情況:元素沒(méi)有設(shè)置浮動(dòng)且沒(méi)有設(shè)置定位或者 position 為 static如果元素沒(méi)有設(shè)置浮動(dòng)并且沒(méi)有設(shè)置定位或者 position 屬性為 static 的情況下,對(duì)元素的 margin 設(shè)置負(fù)值會(huì)有以下的效果:
設(shè)置的 margin 的方向?yàn)?top 或者 left
當(dāng)設(shè)置負(fù)值的 margin 的方向?yàn)?top 或者 left 的時(shí)候,元素會(huì)按照設(shè)置的方向移動(dòng)相應(yīng)的距離。
比如,設(shè)置 margin-left: -100px;。 那么,元素會(huì)往左移動(dòng) 100px。對(duì)于設(shè)置 margin-top 也是一樣的道理。
設(shè)置的 margin 的方向?yàn)?bottom 或者 right
當(dāng)設(shè)置負(fù)值的 margin 的方向?yàn)?bottom 或者 right 的時(shí)候,元素本身并不會(huì)移動(dòng),元素后面的其他元素會(huì)往該元素的方向移動(dòng)相應(yīng)的距離,并且覆蓋在該元素上面。
比如,設(shè)置 margin-right: -100px;。那么,元素本身并不會(huì)移動(dòng),后面的元素會(huì)向左移動(dòng) 100px 到該元素上。對(duì)于設(shè)置 margin-bottom 也是同樣的道理。
同時(shí),在元素不指定寬度的情況下,如果設(shè)置 margin-left 或者 margin-right 為負(fù)值的話,會(huì)在元素對(duì)應(yīng)的方向上增加其寬度。效果就和設(shè)置 padding-left 或者 padding-right 一樣。
第二種情況:元素沒(méi)有設(shè)置浮動(dòng)且 position 為 relative如果元素沒(méi)有設(shè)置浮動(dòng),但是設(shè)置了相對(duì)定位,設(shè)置 margin 為負(fù)值的時(shí)候,表現(xiàn)如下:
設(shè)置的 margin 的方向?yàn)?top 或者 left
當(dāng)設(shè)置負(fù)值的 margin 的方向?yàn)?top 或者 left 的時(shí)候,元素也會(huì)按照設(shè)置的方向移動(dòng)相應(yīng)的距離。
設(shè)置的 margin 的方向?yàn)?bottom 或者 right
當(dāng)設(shè)置 margin-bottom/left 的時(shí)候,元素本身也不會(huì)移動(dòng),元素后面的其他元素也會(huì)往該元素的方向移動(dòng)相應(yīng)的距離,但是,該元素會(huì)覆蓋在后面的元素上面 (當(dāng)然,此處說(shuō)的情況肯定是后面的元素沒(méi)有設(shè)置定位以及 z-index 的情況)。
第三種情況:元素沒(méi)有設(shè)置浮動(dòng)且 position 為 absolute如果元素沒(méi)有設(shè)置浮動(dòng),但是設(shè)置了絕對(duì)定位,設(shè)置 margin 為負(fù)值的時(shí)候,表現(xiàn)如下:
設(shè)置的 margin 的方向?yàn)?top 或者 left
當(dāng)設(shè)置負(fù)值的 margin 的方向?yàn)?top 或者 left 的時(shí)候,元素也會(huì)按照設(shè)置的方向移動(dòng)相應(yīng)的距離。
設(shè)置的 margin 的方向?yàn)?bottom 或者 right
由于設(shè)置絕對(duì)定位的元素已經(jīng)脫離了標(biāo)準(zhǔn)文檔流,所以,設(shè)置 margin-right/bottom 對(duì)后面的元素并沒(méi)有影響。
第四種情況:元素設(shè)置了浮動(dòng)肯定沒(méi)有既設(shè)置了浮動(dòng)又設(shè)置絕對(duì)定位的情況,那樣太荒唐了。
設(shè)置了浮動(dòng)的元素,再設(shè)置 postion: relative; 的話,元素的行為和多帶帶設(shè)置 float 是一樣的。
對(duì)于設(shè)置了浮動(dòng)的元素,設(shè)置 margin 為負(fù)值的時(shí)候,表現(xiàn)如下:
如果設(shè)置的 margin 的方向與浮動(dòng)的方向相同,那么,元素會(huì)往對(duì)應(yīng)的方向移動(dòng)對(duì)應(yīng)的距離。
比如:
.elem { float: right; margin-right: -100px; }
該元素則會(huì)向右移動(dòng) 100px。
如果設(shè)置 margin 的方向與浮動(dòng)的方向相反,則元素本身不動(dòng),元素之前或者之后的元素會(huì)向鈣元素的方向移動(dòng)相應(yīng)的距離。
比如:
.elem { float: right; margin-left: -100px; }
位于該元素左邊的元素則會(huì)向右移動(dòng) 100px,同時(shí)覆蓋在該元素上。
如果后面的元素也設(shè)置了浮動(dòng)的話,我們以一個(gè)具體的例子來(lái)說(shuō)明。
.container { min-height: 300px; margin: 30px auto; overflow: hidden; border: 1px solid #000000; .left { float: left; width: 400px; height: 200px; margin-right: -300px; background: purple; } .right { float: left; width: 300px; height: 200px; background: #cccccc; } }
.left 和 .right 都設(shè)置了浮動(dòng),在 .left 上設(shè)置了 margin-right: -300px;,那么,.right 會(huì)向左移動(dòng) 300px,從而覆蓋在 .left 上。這種行為與沒(méi)有既沒(méi)有設(shè)置浮動(dòng)也沒(méi)有設(shè)置定位的表現(xiàn)類(lèi)似。
到此,我們把設(shè)置負(fù) margin 的各種情況以及在各種情況下的表現(xiàn)都大概了解了一遍。那么,我們真正運(yùn)用到實(shí)際中會(huì)是什么樣子呢。
半遮擋的標(biāo)題原諒我措辭不好,大概就是下圖的效果:
按照一般的思想,肯定是直接給 title 設(shè)置絕對(duì)定位,然后再將其調(diào)整過(guò)去。
但是,按照我們現(xiàn)在所說(shuō)的,其實(shí)很簡(jiǎn)單就能實(shí)現(xiàn)這個(gè)效果。
這里只寫(xiě)了主要部分的代碼。
Hey This is title!Hah! This is content.
.title { position: relative; width: 200px; height: 60px; margin-bottom: -30px; margin-left: -20px; background: #000000; } .content { max-width: 800px; height: 400px; padding: 0 50px; background: yellow; }
我們?yōu)?title 設(shè)置了兩個(gè) margin 的負(fù)值,分別是 margin-bottom: -30px;,以及 margin-left: -20px;。
設(shè)置 margin-bottom 是為了讓 content 向上移動(dòng),設(shè)置 margin-left 是為了讓 title 向左移動(dòng)一小段距離。
還有個(gè)需要注意的地方就是,需要給 title 設(shè)置 position: relative;,根據(jù)我們的第二種情況所說(shuō)的,這樣,才能保證 title 覆蓋在 content 之上。
簡(jiǎn)單的一列定寬的兩列流式布局根據(jù)我們的最后一種情況,通過(guò)設(shè)置 margin 為負(fù)值,我們可以很容易的實(shí)現(xiàn)一列定寬的兩列流式布局。
.left { float: left; width: 100%; height: 200px; margin-right: -300px; background: purple; } .right { float: left; width: 300px; height: 200px; background: #cccccc; }
唯一需要注意的地方就是設(shè)置了 100% 寬度的元素上的 margin 負(fù)值的絕對(duì)值一定要和定寬的元素的寬度相同。
兩邊固定,中間自適應(yīng)的三列布局這是一個(gè)很老的話題了,以前也有各種實(shí)現(xiàn)的方式,比如雙飛翼布局,或者圣杯布局。
我們此處就以雙飛翼布局來(lái)作示例。
先設(shè)置頁(yè)面結(jié)構(gòu):
此處我們沒(méi)有把 center 放在中間,具體原因后面會(huì)解釋。
然后,我們?cè)O(shè)置這三列都浮動(dòng):
.left, .right, .center { float: left; height: 500px; }
同時(shí)為他們指定寬度:
.left { width: 300px; background: #000000; } .right { width: 400px; background: #00FFFF; } .center { width: 100%; background: #93c759; }
現(xiàn)在我們要讓 left 在左邊,相當(dāng)于就是讓它覆蓋在 center 的上面,所以,只需要這樣一句:
margin-left: -100%;
同時(shí),要讓 right 在右邊,同理,這樣設(shè)置:
margin-left: -400px;
注意,此處的 margin 值的絕對(duì)值與 right 的寬度值相同。
其實(shí),這樣設(shè)置,我們的三列布局就基本完成了。
那么,我們?yōu)槭裁匆?center 放在 left 和 right 之前呢?
這個(gè)其實(shí)涉及到元素的堆疊順序的知識(shí) (這里就不詳細(xì)講解了,后面有時(shí)間的話專(zhuān)門(mén)拿一篇文章來(lái)講解吧),此處簡(jiǎn)單說(shuō)明一下。
由于我們的三列都設(shè)置了浮動(dòng),所以,從某種意義上說(shuō),它們?nèi)齻€(gè)是在同一個(gè)平面的 (相當(dāng)于 z-index 相同),那么,這里就不能根據(jù) CSS 來(lái)判斷堆疊順序了。所以,此處的 HTML 結(jié)構(gòu)就決定了它們的堆疊順序:所謂后來(lái)居上。
我們要讓 left 在 center 之上,所以,肯定需要讓 left 元素放在 center 之前。
所以,三列布局完整的 SCSS 代碼如下:
.container { overflow: hidden; .left, .right, .center { float: left; height: 500px; } .left { width: 300px; margin-left: -100%; background: #000000; } .right { width: 400px; margin-left: -400px; background: #00FFFF; } .center { width: 100%; background: #93c759; } }References
margin-properties | W3C
The Definitive Guide to Using Negative Margins
雙飛翼布局和圣杯布局的對(duì)比
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/111640.html
摘要:之后仔細(xì)的百度了一下,發(fā)現(xiàn)了這么一個(gè)叫做內(nèi)外補(bǔ)丁負(fù)值法的東西。在這個(gè)解決方案中,又涉及到了傳說(shuō)中的負(fù)。深入研究之后又發(fā)現(xiàn)了圣杯布局雙飛翼布局等很多示例,確實(shí)要好好研究負(fù)邊距這個(gè)東西了。相關(guān)推薦那些年,奇妙的圣杯與雙飛翼,還有負(fù)邊距 2015-04-22 時(shí)候?qū)懙睦衔模驗(yàn)橄M盟阅昧顺鰜?lái)。 那天被一個(gè)同學(xué)問(wèn)了一個(gè)問(wèn)題,三列的div,要求父div的高度和三個(gè)div的高度都和三個(gè)中字?jǐn)?shù)...
摘要:屬性指定了盒的區(qū)的寬度。簡(jiǎn)寫(xiě)屬性一次性設(shè)置四周的,而其它屬性只設(shè)置它們各側(cè)的。 margin屬性指定了盒的margin區(qū)的寬度。margin簡(jiǎn)寫(xiě)屬性一次性設(shè)置四周的margin,而其它margin屬性只設(shè)置它們各側(cè)的。這些屬性適用于所有元素,但非替換行內(nèi)元素上的豎直margin將不會(huì)產(chǎn)生任何效果 margin與容器尺寸 margin與可視尺寸 margin與可視尺寸 只適用于沒(méi)有設(shè)定...
摘要:清單一些說(shuō)明注意文檔的書(shū)寫(xiě)順序,先寫(xiě)兩側(cè)欄,再寫(xiě)主面板,更換后則側(cè)欄會(huì)被擠到下一列圣杯布局和雙飛翼布局都會(huì)用到。可以通過(guò)設(shè)置的屬性或使用雙飛翼布局避免問(wèn)題。雙飛翼布局不用設(shè)置相對(duì)布局,以及對(duì)應(yīng)的和值。 本文首發(fā)于知乎專(zhuān)欄:前端指南 CSS布局 布局是CSS中一個(gè)重要部分,本文總結(jié)了CSS布局中的常用技巧,包括常用的水平居中、垂直居中方法,以及單列布局、多列布局的多種實(shí)現(xiàn)方式(包括傳統(tǒng)的...
摘要:語(yǔ)法規(guī)則注釋層疊優(yōu)先級(jí)繼承值塊格式化上下文盒模型層疊上下文可替換元素外邊距合并包含塊視覺(jué)格式化模型布局模式語(yǔ)法屬性值聲明聲明塊規(guī)則規(guī)則集規(guī)則規(guī)則一個(gè)語(yǔ)句定義樣式表使用的字符集告訴引擎引入一個(gè)外部樣式表嵌套規(guī)則如果滿足媒介查詢的條件則條件規(guī)則 1、CSS語(yǔ)法 2、@規(guī)則 3、注釋 4、層疊 5、優(yōu)先級(jí) 6、繼承 7、值 8、塊格式化上下文 9、盒模型 10、層疊上下文 11、可替換元素 12、...
摘要:結(jié)果的邊界寬度是相鄰邊界寬度中最大的值。但是邊界的重疊也有例外情況水平邊距永遠(yuǎn)不會(huì)重合。外邊距重疊示例外邊距重疊是指兩個(gè)垂直相鄰的塊級(jí)元素,當(dāng)上下兩個(gè)邊距相遇時(shí),起外邊距會(huì)產(chǎn)生重疊現(xiàn)象,且重疊后的外邊距,等于其中較大者。邊距重疊解決方案(BFC) 首先要明確BFC是什么意思,其全英文拼寫(xiě)為 Block Formatting Context 直譯為塊級(jí)格式化上下文 ? 兩個(gè)或多個(gè)塊級(jí)盒子的垂直...
閱讀 3061·2021-11-23 09:51
閱讀 1040·2021-09-02 15:21
閱讀 3005·2019-08-30 13:56
閱讀 1828·2019-08-29 14:12
閱讀 707·2019-08-29 13:53
閱讀 1663·2019-08-29 11:32
閱讀 1325·2019-08-29 11:25
閱讀 1492·2019-08-28 17:51