CSS藝術之 負margin之美

2022-09-17 22:48:17 字數 4284 閱讀 5942

css中負邊距(nagative margin)是布局中常常使用的乙個技巧。僅僅要運用得當時常會產生奇異的效果。勘稱css中的奇淫巧計,非常多css布局方法都依賴於負邊距,掌握它對於前端童鞋來說還是非常重要的。

文件流

(自己的理解是從頭到尾依照文件的順序。該在什麼位置就在什麼位置,也能夠依照上面的意思理解。自上而下。自左到右的順序)

那些沒有脫離文件流的元素(指不是浮動元素也不是絕對定位、固定定位的元素等),其在頁面中的位置是尾隨者文件流的變化而變化的。看以下這幅圖:

負邊距對這些由文件流控制的元素的作用是,會使它們在文件流中的位置發生偏移,但這樣的偏移不同於相對定位,通過相對定位偏移後。其仍然會堅守著它原來占領的空間。不會讓文件流的其他元素乘虛而入。而通過負邊距進行偏移的元素,它會放棄偏移前占領的空間,這樣它後面文件流中的其他元素就會「流」過來填充這部分空間。

還是通過樣例來說明吧。

如今我們把上圖中的塊狀元素、行內元素以及inline-block元素都設乙個負邊距 margin:-10px; 看看會發生什麼:

具體發生了什麼變化自己體會體會,負的邊距好像能減小元素在文件流中的尺寸一樣。但其實,它的尺寸大小並沒變,僅僅是文件流在計算元素位置的時候,會覺得負邊距把元素的尺寸減小了,因此位置也就發生變化了。

所以,一切僅僅要是由文件流決定的東西。負邊距就能起作用了。

總之中的乙個句話,在文件流中,元素的終於邊界是由margin決定的。margin為負的時候就相當於元素的邊界向裡收,文件流認的僅僅是這個邊界,不會管你實際的尺寸是多少。

負邊距對元素寬度的影響

負邊距不僅能影響元素在文件流中的位置。還能新增元素的寬度!

這個作用能實現的前提是:該元素沒有設定width屬性(當然width:auto是能夠的)。

比方下圖的綠色部分是乙個塊狀元素,它沒有設定寬度。它被包裹在乙個寬度為400px,且水平居中的父元素中。

如今給這個元素的設乙個margin-right:-100px;

我們看到它的寬度的確變長100px;然後再給它設乙個margin-left:-100px;

我們看到它變得更寬了。

怎麼理解呢?子塊狀元素的寬度設定為width:auto;或者不設定(預設width:auto;)的時候,是會依據其margin邊界來填充父元素的,若正常設定為margin:100px;那麼子元素的寬度必定減小200px;反之若設定margin:-100px;那麼其為了正常填充整個父元素其寬度須要新增200px。

1、左右列固定,中間列自適應布局

此例適用於左右欄寬度固定,中間欄寬度自適應的布局。

因為網頁的主體部分一般在中間。非常多網頁都須要中間列優先載入。而這樣的布局剛好滿足此需求。

css:

body

.container

.main

.left,.right

.left

.right

html:

class="container">

class="main">

main

div>

div>

class="left">

left

div>

class="right">

right

div>

效果:

2、去掉列表右邊框

專案中常常會使用浮動列表展示資訊,為了美觀通常為每乙個列表之間設定一定的間距(margin-right),當父元素的寬度固定式。每一行的最右端的li元素的右邊距就多餘了,去除的方法一般是為最右端的li加入class,設定margin-right:0; 這樣的方法須要動態推斷為哪些li元素加入class,麻煩!

。!利用負margin就能夠實現以下這樣的效果:

css:

*

ul,li

.test

.test

ul .test

ulli

.clearfix

:after

html:

class="test clearfix">

子元素1li>

子元素2li>

子元素3li>

子元素4li>

子元素5li>

子元素6li>

ul>

div>效果:

3、負邊距配合絕對定位水平垂直居中

這個前提條件是已知子元素的寬高。

4、多列等高

此例關鍵是給每乙個框設定大的底部內邊距,然後用數值類似的負外邊距消除這個高度。

這會導致每一列溢位容器元素,假設把外包容器的overflow屬性設為hidden。列就在最高點被裁切。

css:

*

.container

.left,.mid,.right

.left

.mid

.right

p

html:

class="container">

class="left">

style="height:50px">height:50pxp>

div>

class="mid">

style="height:100px">height:100pxp>

div>

class="right">

style="height:200px">height:200pxp>

div>

div>效果:

5、去除列表最後乙個li元素的border-bottom

列表中我們常常會加入border-bottom值,最後乙個li的border-bottom往往會與外邊框重合,視覺上**觀,往往要移除。

css:

*ul,li

.container

ulli

html:

class="container">

testli>

testli>

testli>

testli>

testli>

ul>

div>效果:

注意:當中具有邊框的父元素假設不加overflow:hidden;會導致出現邊框與子元素li標籤的邊框重疊的情況,例如以下:

我相信這個微小的瑕疵會逼死無數像我這樣的強迫症患者..

具體資源能夠參考:the definitive guide to using negative margins

有什麼好的問題或者資源歡迎補充

負值之美 負margin在頁面布局中的應用

負數給人總是一種消極 否定 拒絕之感,不過有時利用負margin可以達到奇妙的效果,今天就表一表負值在頁面布局中的應用。這裡說的負值主要指的是負margin。關於負margin的原理建議大家看看這篇文章 本文不講原理,主要展示幾個應用。此例適用於左右欄寬度固定,中間欄寬度自適應的布局。由於網頁的主體...

CSS知識梳理之 margin

梳理完position,來到margin,每個知識點乙個乙個攻破啦 雖然margin可以應用到所有元素,但display屬性不同時,表現也不同 1.block元素可以使用四個方向的margin值 2.inline元素使用上下方向的margin值無效 3.inline block使用上下方向的marg...

CSS之margin樣式屬性

相對於同級的標籤設定偏移量 doctype html utf 8 title span in style head border 1px solid red height 300px width 300px margin bottom 20px in style background color b...