成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

理解并運用CSS的負margin值

開發 前端
你的網頁中,不可能沒有使用過 margin。大多數情況下,我們采用的都是正數的 margin 值,可能有時候會用到負的 margin 值。在我們的印象中,負的 margin 值就類似于瀏覽器的 hack 一樣,不被人接受。但是,本文要說明的就是,負的 margin 值并不是 hack,這是正常范圍內的寫法。

本文樣式代碼采用 SCSS。

瀏覽器兼容性為 IE6+。

你的網頁中,不可能沒有使用過 margin。大多數情況下,我們采用的都是正數的 margin 值,可能有時候會用到負的 margin 值。在我們的印象中,負的 margin 值就類似于瀏覽器的 hack 一樣,不被人接受。但是,本文要說明的就是,負的 margin 值并不是 hack,這是正常范圍內的寫法。

Negative values for margin properties are allowed, but there may be implementation-specific limits. —— W3C

根據 W3C,margin 是能夠接受負值的,只是在具體實現上有一些區別。

那么,設置 margin 為負值究竟會是什么樣的效果呢?

與設置正值不同,margin 設置負值需要根據設置的方向以及元素是否浮動以及其定位方式來判斷最終的行為。

所以,具體行為按照以下幾種情況說明。

***種情況:元素沒有設置浮動且沒有設置定位或者 position 為 static

如果元素沒有設置浮動并且沒有設置定位或者 position 屬性為 static 的情況下,對元素的 margin 設置負值會有以下的效果:

設置的 margin 的方向為 top 或者 left

當設置負值的 margin 的方向為 top 或者 left 的時候,元素會按照設置的方向移動相應的距離。

比如,設置 margin-left: -100px;。 那么,元素會往左移動 100px。對于設置 margin-top 也是一樣的道理。

設置的 margin 的方向為 bottom 或者 right

當設置負值的 margin 的方向為 bottom 或者 right 的時候,元素本身并不會移動,元素后面的其他元素會往該元素的方向移動相應的距離,并且覆蓋在該元素上面。

比如,設置 margin-right: -100px;。那么,元素本身并不會移動,后面的元素會向左移動 100px 到該元素上。對于設置 margin-bottom 也是同樣的道理。

同時,在元素不指定寬度的情況下,如果設置 margin-left 或者 margin-right 為負值的話,會在元素對應的方向上增加其寬度。效果就和設置 padding-left 或者 padding-right 一樣。

第二種情況:元素沒有設置浮動且 position 為 relative

如果元素沒有設置浮動,但是設置了相對定位,設置 margin 為負值的時候,表現如下:

設置的 margin 的方向為 top 或者 left

當設置負值的 margin 的方向為 top 或者 left 的時候,元素也會按照設置的方向移動相應的距離。

設置的 margin 的方向為 bottom 或者 right

當設置 margin-bottom/left 的時候,元素本身也不會移動,元素后面的其他元素也會往該元素的方向移動相應的距離,但是,該元素會覆蓋在后面的元素上面 (當然,此處說的情況肯定是后面的元素沒有設置定位以及 z-index 的情況)。

第三種情況:元素沒有設置浮動且 position 為 absolute

如果元素沒有設置浮動,但是設置了絕對定位,設置 margin 為負值的時候,表現如下:

設置的 margin 的方向為 top 或者 left

當設置負值的 margin 的方向為 top 或者 left 的時候,元素也會按照設置的方向移動相應的距離。

設置的 margin 的方向為 bottom 或者 right

由于設置絕對定位的元素已經脫離了標準文檔流,所以,設置 margin-right/bottom 對后面的元素并沒有影響。

第四種情況:元素設置了浮動

肯定沒有既設置了浮動又設置絕對定位的情況,那樣太荒唐了。

設置了浮動的元素,再設置 postion: relative; 的話,元素的行為和單獨設置 float 是一樣的。

對于設置了浮動的元素,設置 margin 為負值的時候,表現如下:

如果設置的 margin 的方向與浮動的方向相同,那么,元素會往對應的方向移動對應的距離。

比如:

  1. .elem { 
  2.  
  3.   floatright
  4.  
  5.   margin-right: -100px; 
  6.  
  7.  

該元素則會向右移動 100px。

如果設置 margin 的方向與浮動的方向相反,則元素本身不動,元素之前或者之后的元素會向鈣元素的方向移動相應的距離。

比如:

  1. .elem { 
  2.  
  3.   floatright
  4.  
  5.   margin-left: -100px; 
  6.  
  7.  

位于該元素左邊的元素則會向右移動 100px,同時覆蓋在該元素上。

如果后面的元素也設置了浮動的話,我們以一個具體的例子來說明。

  1. <div class="container"
  2.     <div class="left"></div> 
  3.     <div class="right"></div> 
  4. </div>  
  1. .container { 
  2.     min-height: 300px; 
  3.     margin: 30px auto; 
  4.     overflow: hidden; 
  5.     border: 1px solid #000000; 
  6.     
  7.     .left { 
  8.         floatleft
  9.         width: 400px; 
  10.         height: 200px; 
  11.         margin-right: -300px; 
  12.         background: purple; 
  13.     } 
  14.      
  15.     .right { 
  16.         floatleft
  17.         width: 300px; 
  18.         height: 200px; 
  19.         background: #cccccc; 
  20.     } 
  21.  

.left 和 .right 都設置了浮動,在 .left 上設置了 margin-right: -300px;,那么,.right 會向左移動 300px,從而覆蓋在.left 上。這種行為與沒有既沒有設置浮動也沒有設置定位的表現類似。

到此,我們把設置負 margin 的各種情況以及在各種情況下的表現都大概了解了一遍。那么,我們真正運用到實際中會是什么樣子呢。

半遮擋的標題

原諒我措辭不好,大概就是下圖的效果:

[[173801]]

按照一般的思想,肯定是直接給 title 設置絕對定位,然后再將其調整過去。

但是,按照我們現在所說的,其實很簡單就能實現這個效果。

這里只寫了主要部分的代碼。 

  1. <div class="title">Hey This is title!</div> 
  2.  
  3. <div class="content">Hah! This is content.</div>  
  1. .title { 
  2.     position: relative
  3.     width: 200px; 
  4.     height: 60px; 
  5.     margin-bottom: -30px; 
  6.     margin-left: -20px; 
  7.     background: #000000; 
  8.  
  9. .content { 
  10.     max-width: 800px; 
  11.     height: 400px; 
  12.     padding: 0 50px; 
  13.     background: yellow; 
  14.  

我們為 title 設置了兩個 margin 的負值,分別是 margin-bottom: -30px;,以及 margin-left: -20px;。

設置 margin-bottom 是為了讓 content 向上移動,設置 margin-left 是為了讓 title 向左移動一小段距離。

還有個需要注意的地方就是,需要給 title 設置 position: relative;,根據我們的第二種情況所說的,這樣,才能保證 title 覆蓋在 content 之上。

簡單的一列定寬的兩列流式布局

根據我們的***一種情況,通過設置 margin 為負值,我們可以很容易的實現一列定寬的兩列流式布局。

  1. <div class="container"
  2.  
  3. <div class="left"></div> 
  4.  
  5. <div class="right"></div> 
  6.  
  7. </div>  
  1. .left { 
  2.     floatleft
  3.     width: 100%; 
  4.     height: 200px; 
  5.     margin-right: -300px; 
  6.     background: purple; 
  7. .right { 
  8.     floatleft
  9.     width: 300px; 
  10.     height: 200px; 
  11.     background: #cccccc; 
  12.  

唯一需要注意的地方就是設置了 100% 寬度的元素上的 margin 負值的絕對值一定要和定寬的元素的寬度相同。

兩邊固定,中間自適應的三列布局

這是一個很老的話題了,以前也有各種實現的方式,比如雙飛翼布局,或者圣杯布局。

我們此處就以雙飛翼布局來作示例。

先設置頁面結構:

  1. <div class="container"
  2.  
  3. <div class="center"></div> 
  4.  
  5. <div class="left"></div> 
  6.  
  7. <div class="right"></div> 
  8.  
  9. </div>  

此處我們沒有把 center 放在中間,具體原因后面會解釋。

然后,我們設置這三列都浮動:

  1. .left
  2. .right
  3. .center { 
  4.     floatleft
  5.     height: 500px; 
  6.  

同時為他們指定寬度:

  1. .left { 
  2.     width: 300px; 
  3.     background: #000000; 
  4.  
  5. .right { 
  6.     width: 400px; 
  7.     background: #00FFFF; 
  8.  
  9. .center { 
  10.     width: 100%; 
  11.     background: #93c759; 
  12.  

現在我們要讓 left 在左邊,相當于就是讓它覆蓋在 center 的上面,所以,只需要這樣一句:

  1. margin-left: -100%; 

同時,要讓 right 在右邊,同理,這樣設置:

  1. margin-left: -400px; 

注意,此處的 margin 值的絕對值與 right 的寬度值相同。

其實,這樣設置,我們的三列布局就基本完成了。

那么,我們為什么要把 center 放在 left 和 right 之前呢?

這個其實涉及到元素的堆疊順序的知識 (這里就不詳細講解了,后面有時間的話專門拿一篇文章來講解吧),此處簡單說明一下。

由于我們的三列都設置了浮動,所以,從某種意義上說,它們三個是在同一個平面的 (相當于 z-index 相同),那么,這里就不能根據 CSS 來判斷堆疊順序了。所以,此處的 HTML 結構就決定了它們的堆疊順序:所謂后來居上。

我們要讓 left 在 center 之上,所以,肯定需要讓 left 元素放在 center 之前。

所以,三列布局完整的 SCSS 代碼如下:

  1. .container { 
  2.     overflow: hidden; 
  3.      
  4.     .left
  5.     .right
  6.     .center { 
  7.         floatleft
  8.         height: 500px; 
  9.     } 
  10.      
  11.     .left { 
  12.         width: 300px; 
  13.         margin-left: -100%; 
  14.         background: #000000; 
  15.     } 
  16.      
  17.     .right { 
  18.         width: 400px; 
  19.         margin-left: -400px; 
  20.         background: #00FFFF; 
  21.     } 
  22.      
  23.     .center { 
  24.         width: 100%; 
  25.         background: #93c759; 
  26.     } 
  27.  

References

margin-properties | W3C

The Definitive Guide to Using Negative Margins

雙飛翼布局和圣杯布局的對比

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2010-08-25 09:30:56

marginCSS

2010-08-25 10:21:49

CSSmargin

2010-08-30 12:54:59

CSSmargin

2010-08-26 10:08:50

CSSmargin

2017-01-13 09:54:52

2010-09-03 10:31:31

CSSmargin

2010-08-25 09:25:13

CSSmargin

2010-08-26 13:32:05

CSSmargin參數

2010-08-24 13:14:36

CSSmargin

2010-08-25 08:57:33

marginpadding

2010-08-25 10:38:35

margin-leftCSS

2010-08-25 10:46:53

margin-topCSS

2010-09-08 14:00:08

marginCSS

2010-08-25 11:13:49

CSS margin-righ

2010-09-03 10:43:05

CSSmargin

2010-09-03 10:24:01

CSSmargin

2010-08-27 11:10:30

CSSmargin

2010-08-31 08:51:58

marginCSS

2010-09-06 11:02:59

CSSmargin

2010-08-26 09:33:46

CSSmargin-bott
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一级黄色录像毛片 | 国产欧美日韩一区 | 综合久久综合久久 | 中文字幕日韩一区二区 | 九色porny自拍视频 | 伊人久久在线 | 一起操网站 | 激情a| 一级在线毛片 | 欧美一区二区在线播放 | 亚洲一区免费 | 97成人免费| 亚洲乱码国产乱码精品精的特点 | 99久久99热这里只有精品 | 羞羞的视频免费在线观看 | 一区二区三区精品视频 | www.色婷婷 | 亚洲精品一区二区 | 九九九久久国产免费 | 国产精品1区 | 日韩av一区在线观看 | av无遮挡| 狠狠躁躁夜夜躁波多野结依 | 99色综合 | 一区二区三区免费网站 | 亚洲精品久久久久久久久久久久久 | 婷婷精品 | 国产精品色 | 日韩在线视频一区二区三区 | av在线播放网站 | 日韩视频一区二区三区 | 国产区免费视频 | 欧美日韩一区不卡 | 亚洲一区二区三区在线观看免费 | 国内精品在线视频 | 国产精品久久久久无码av | 97偷拍视频 | 日韩国产在线 | 国产精品久久久久久久久久三级 | 久久久久久精 | 亚洲午夜小视频 |