CSS布局奇淫巧计之-强大的负边距
生活随笔
收集整理的這篇文章主要介紹了
CSS布局奇淫巧计之-强大的负边距
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
負的邊距好像能減小元素在文檔流中的尺寸一樣,但事實上,它的尺寸大小并沒變,只是文檔流在計算元素位置的時候,會認為負邊距把元素的尺寸減小了,因此位置也就發生變化了。
實例:
因為P為block元素且沒有指定width,則p的width+padding+border+margin=父級div的width(這里都是說的水平方向)。這里假定padding,border為0。父級div的width為400px。p的width為inherit,如果不設置margin,則p的width為400px。正如text-block。當margin-left:-100px;,p.width + (-100px) = 400px。所以p的width就變成了500px。這里說的p都是假定為inherit width即沒有指定確定的width值。相反如果指定了p的width,則margin-left,margin-right為負值則會引起的不是p元素的大小,而是會引起p元素位置的變化。這里和浮動元素上應用負的margin-left和margin-right得到的效果是相同的
1. 負邊距在普通文檔流中的作用和效果
那些沒有脫離文檔流的元素(指不是浮動元素也不是絕對定位、固定定位的元素等),其在頁面中的位置是跟隨者文檔流的變化而變化的。看下面這幅圖
負邊距對這些由文檔流控制的元素的作用是,會使它們在文檔流中的位置發生偏移,但這種偏移不同于相對定位,通過相對定位偏移后,其仍然會堅守著它原來占據的空間,不會讓文檔流的其它元素乘虛而入。而通過負邊距進行偏移的元素,它會放棄偏移前占據的空間,這樣它后面文檔流中的其它元素就會“流”過來填充這部分空間
還是通過例子來說明吧。現在我們把上圖中的塊狀元素、行內元素以及inline-block元素都設一個負邊距 margin:-10px; 看看會發生什么
我們看到,黑灰色的塊狀元素好像向左和向上都分別嵌入了瀏覽器窗口的邊界里10px,然后塊狀元素下面的文字也爬到了它身上,行內元素向左移動蓋住了它前面的一個字,它后面的文字也有一部分覆蓋在了它身上,inline-block的位置變化也很明顯
好了,這點相信大家早就心知肚明了,就是負的邊距好像能減小元素在文檔流中的尺寸一樣,但事實上,它的尺寸大小并沒變,只是文檔流在計算元素位置的時候,會認為負邊距把元素的尺寸減小了,因此位置也就發生變化了。這只是打個很形象的比喻,幫助大家理解一下。還要注意的是,文檔流只能是后面的流向前面的,即文檔流只能向左或向上流動,不能向下或向右移動
比如,一個沒有設定高度的塊狀元素,其高度是自動的,具體來說就是由它里面的文檔流最后的位置決定的。假設它里面有一個出于文檔流中的子元素,高度為100px;那這時這個父元素的高度就等于子元素的高度100px了,如果子元素繼續增高,那么父元素也會跟著增高。可是如果這時子元素設一個負的margin-bottom,比如-20px,因為負邊距會影響到文檔流,本來文檔流的高度是從父元素的最頂端到子元素的最底端這段高度,現在子元素有一個margin-bottom:-20px;就相當于文檔流要向上退后20px,這樣整個文檔流的高度就減少了20px了,那么父元素的高度也會跟著減少20px。在IE8+以及那些標準瀏覽器中,這還需要父元素擁有一個overflow:hidden的屬性,因為父元素的高度變了,但子元素的高度并沒有變,所以需要使子元素超出隱藏,但即使不設置overflow:hidden,父元素的高度也是變小了的,只不過這時子元素的高度會超出父元素。在IE6中則不需要,但需要觸發它的hasLayout屬性。所以以前所說的多列等高布局就是利用這個原理來實現的
2. 左和右的負邊距對元素寬度的影響
負邊距不僅能影響元素在文檔流中的位置,還能增加元素的寬度!
這個作用能實現的前提是:該元素沒有設定width屬性(當然width:auto是可以的)
比如下圖的黑灰色部分是一個塊狀元素,它沒有設定寬度。它被包裹在一個寬度為400px,且水平居中的父元素中
現在給這個元素的設一個margin-right:-100px
我們看到它的寬度的確變長100px;然后再給它設一個margin-left:-100px
負的margin會改變元素的寬度,這的確很讓人費解,如果說負邊距會改變元素在文檔流中的位置還是很好理解的話,那改變寬度這種現象還真的蠻讓人不可思議的
那這貨有什么用途呢?我就舉一個例子吧
想要創建上圖中黑框內的幾個元素按順序排下來,中間帶些間隔的布局要怎么做?,當然最簡單省事的方法就是利用浮動了。我們把黑框里面的子元素向左浮動,然后設一個合適的margin-right,是不是就辦到了呢?但因為外邊黑框的寬度是固定的,就是里面四個子元素的寬度加上三列間隔的寬度,所以靠近右邊邊界的子元素就不應該有正向的margin-right了,否則這一行就只能容納三個子元素了。有人說那這還不簡單,給靠近右邊界的那些子元素加一個class,把它的margin-right設為0不就行了。這當然可以,但如果這些子元素是在模板中通過循環動態輸出的,那在循環的時候還得判斷哪些子元素是靠近右邊邊界的,如果是就加上一個class。這樣做的話是不是就有點麻煩了?所以解決辦法是加大子元素的父容器的寬度,讓它能夠容納一行中有四個子元素加上四列間隔的寬度,然后最外面的的黑框的那個容器設一個overflow:hidden就行了。上面說了負的左右邊距能加大元素的寬度,所以給子元素的父容器設一個合適的負的margin-right就可以了。當然你也可以直接在css中把子元素的父容器的寬度設寬一些,舉這個例子只是為了說明負邊距也是一種方法
3. 負邊距對浮動元素的影響
負邊距對浮動元素的影響與負邊距對文檔流中元素的影響其實是差不多的。文檔流中元素的位置由文檔流的走向決定,浮動的元素也可以看成有一個“浮動流”存在,不過浮動流既可以向左,也可以向右
比如下圖是三個向左浮動的元素,寬高都是100px
現在把它們都設一個margin-right:-50px; 然后會變成這樣子
我們看到后面的元素疊到了前面的元素上
我們把瀏覽器縮小了,然后因為寬度不夠,元素3掉下來了。我們給元素3設一個margin-left:-80px;看看會怎么樣
這時元素3完全覆蓋住了元素2,當元素3設為:margin-left:-200px時
我們看到元素3繼續向左移動并覆蓋住了元素1
現在想必大家都明白了負邊距對浮動元素位置的影響了吧。所以那些說得很好聽的什么圣杯布局、雙飛翼布局啊什么的,都是利用這個原理實現的。就是某個元素雖然是寫在了后面,但可以通過負邊距讓它在瀏覽器顯示的時候是在前面的
4. 負邊距對絕對定位元素的影響
絕對定位的元素定義的top、right、bottom、left等值是元素自身的邊界到最近的已定位的祖先元素的距離,這個元素自身的邊界指的就是margin定義的邊界,所以,如果margin為正的時候,那它的邊界是向外擴的,如果margin為負的時候,則它的邊界是向里收的。利用這點,就有了經典的利用絕對定位來居中的方法
注1:關于left的偏移問題:
1. 當position設置為absolute或時fixed, left屬性指定元素的左邊緣和其包含塊的左邊緣之間的距離
2. 當position設置為relative,left屬性指定元素的左邊緣從正常位置向右移動的距離
3. 當position設置static,left屬性沒有影響
注2:關于left的取值問題:
1. 如果是數值,那么就是指定偏移的固定距離
2. 如果是百分比,那么就是相對父容器的寬度來計算
總結
以上是生活随笔為你收集整理的CSS布局奇淫巧计之-强大的负边距的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【开源系列】三国演义LBS (二)游戏策
- 下一篇: html中如何设置ttf,CSS怎么引用