天天看點

初識負外邊距在布局中的影響(1):基礎理論

1.引言

開篇前需聲明一點:本人前端的菜鳥一枚,也是在自學的過程中碰到了負邊距(Negative Margin)布局問題,是以花了近一天的時間去找資料寫Demo測試,文章是我綜合其他大牛的思路而成,目的并不在于向諸位“傳道”,而主要是為了友善自己以後查閱複習,當然如果能夠幫到你那就更好了。文中若有錯誤,歡迎指正,不必留情。

2.負外邊距的表現

有人說div+css布局方式主要有三種:

  1. 浮動(float:left;float:right)
  2. 定位(絕對定位:absolute;相對定位:relative)
  3. 負邊距(margin:-100px);

這種說法我也不知道對不對(畢竟是菜鳥),但是可以肯定的是既然有這種說法,足見負外邊距對于布局的影響還是挺大的,或者在某些特定的布局中需要依仗它。下面将從兩個方面通過代碼示例來說明負外邊距的表現:

2.1 對于靜态元素的影響

這裡所謂的靜态元素指的的沒有脫離文檔流的元素,它在頁面位置是跟随文檔流變化而變化的。不妨看看下面這個示例:

初識負外邊距在布局中的影響(1):基礎理論
<div class="container">
        <div class="top"></div>
        <span class="behind">君不見,黃河之水天上來,奔流到海不複回。君不見,高堂明鏡悲白發,朝如青絲暮成雪。人生得意須盡歡,莫使金樽空對月。天生我材必有用,千金散盡還複來。烹羊宰牛且為樂,會須一飲三百杯。<span class="inner">岑夫子,丹丘生,将進酒,杯莫停。</span>與君歌一曲,請君為我傾耳聽。鐘鼓馔玉不足貴,但願長醉不複醒。古來聖賢皆寂寞,惟有飲者留其名。陳王昔時宴平樂,鬥酒十千恣歡谑。主人何為言少錢,徑須沽取對君酌。五花馬,千金裘,呼兒将出換美酒,與爾同銷萬古愁。</span>
    </div>

    <style type="text/css">
        body,div,p{
            margin: ;
            padding: ;
        }
        .container{
            width: px;
            height: px;
            margin: px auto;
            font-size: px;
            border: px solid #0094ff;
        }
        .top{
            width: px;
            height: px;
            background-color: yellowgreen;
            /*
            margin-top: -50px;
            margin-left: -50px;
            margin-right: -50px;
            margin-bottom: -50px;
            */
        }

        /*
        .inner{
            display: inline-block;
            width: 100px;
            height: 100px;
            background-color: royalblue;
            color: white;

            margin-right: -50px;
            margin-bottom: -50px;
        }
        */
    </style>
           

如果給上面的黃綠色div塊(.top)分别加上負外邊距看看有什麼效果:

(1)margin-top: -50px; 很顯然div塊往上挪動了50px,後面的span标簽裡面的文字流也跟着往上挪動50px。

初識負外邊距在布局中的影響(1):基礎理論

(2)margin-left: -50px;div塊往左邊挪動了50px,後面的span标簽内容與位置沒有發生變化

初識負外邊距在布局中的影響(1):基礎理論

(3)margin-right: -50px;直接加似乎看不出效果,如果把上面的div塊改成display: inline-block;就可以看出效果,div的位置和大小都沒有發生變化,但是後面的“文字流”頂上去了。

初識負外邊距在布局中的影響(1):基礎理論

(4)margin-bottom: -50px;“文字流”整體上挪,但是div塊的大小和位置依然沒變

初識負外邊距在布局中的影響(1):基礎理論

說明:上面4種負邊距的設定,個人認為margin-top和margin-left負邊距好了解,就是把元素向上和向左移動,但是margin-right和margin-bottom負邊距并不是把元素向右和向下移動,因為文檔流隻能向上或者向左流動。我對于margin-right和margin-bottom負邊距的了解就是它會把元素的文檔流邊界向左或者向上挪動,而元素的位置和大小不變(見下圖),這也解釋了為什麼margin-right: -50px和margin-bottom: -50px;的文檔流都向左和向上流動進而壓蓋住了原有的div塊。

初識負外邊距在布局中的影響(1):基礎理論
初識負外邊距在布局中的影響(1):基礎理論

此外,對于沒有設定寬度(width:auto也可以)的元素,margin-left和margin-righ的負邊距會增加元素的寬度。

<div class="container">
        <div class="content"></div>
    </div>

    .container{
       width: px;
       height: px;
       margin: px auto;
       border: px solid salmon;
   }
   .content{
       height: px;
       background-color: seagreen;
       margin-left: -px;
       margin-right: -px;
  }
           
初識負外邊距在布局中的影響(1):基礎理論

2.2 對于浮動元素的影響

實際上負邊距對于浮動元素的影響和靜态元素是類似的,可以想象浮動的元素也會有一個“浮動流”,類似文檔流,四個方向的負邊距的影響和靜态元素是一樣的,看下面的示例:

<div class="container">
        <div class="div-one">div1</div>
        <div class="div-two">div2</div>
        <div class="div-three">div3</div>
    </div>

.div-one,.div-two,.div-three{
            width: px;
            height: px;
            float: left;
            color: white;
            font-size: px;
        }
        .container{
            width: px;
            height: px;
            margin: px auto;
            border: px solid salmon;
        }
        .div-one{
            background-color: seagreen;
            margin-left: -px;
            margin-top: -px;
        }
        .div-two{
            background-color: slateblue;
            margin-right: -px;
        }
        .div-three{
            background-color:saddlebrown;
        }
           
初識負外邊距在布局中的影響(1):基礎理論

div1塊向上和向左挪動,後面的“浮動流”跟上,而div2的浮動流邊界向左收縮,所有div3不管div2的實際大小,直接壓蓋上來。

說到負邊距浮動布局,這裡有小小的Demo:

初識負外邊距在布局中的影響(1):基礎理論
<div class="container">
        <ul>
            <li>1</li>
            <li>2</li>
            <li>3</li>
            <li>4</li>
            <li>5</li>
            <li>6</li>
            <li>7</li>
            <li>8</li>
            <li>9</li>
        </ul>
    </div>
           

父元素的寬度和每個li的寬度是固定的,正常操作全部浮動,通過計算給定每個li一個margin-right值,第3,6,9個元素會被相應的“擠下來”,這裡或者js代碼計算一下,選出3,6,9元素去掉margin-right值,就可以達到效果。實際上呢,完全可以通過負邊距來給li的無寬父元素增加一個margin-right負邊距使得3,6,9“正位”,然後把超出的部分隐藏。

ul,li{
            list-style: none;
        }
        .container{
            height: px;
            width: px;
            margin: px auto;
            border: px solid #0094ff;
        }
        ul{
            height: px;
            overflow: hidden;
            margin-right: -px;
            /*對于無寬的父元素margin-right:-10px會使得父元素向右伸展10px,進而有足夠的空間容納3,6,9元素*/
        }
        li{
            height: px;
            width: px;
            background-color:salmon;
            color: white;
            font-size: px;
            margin:  px px ;
            float: left;
        }
           

3.總結

語言表達能力和水準有限,啰嗦了半天也總覺得沒有說清楚。不過我覺的這個需要自己寫幾個Demo去體會一下,尤其是對margin-right和margin-bottom負邊距的了解,這個很重要。後續的篇章中會基于本篇中的理論來展開,主要是使用負邊距的一些布局,其中包括著名的“聖杯布局”和“雙飛翼布局”,未完待續哦!

4.參考文章

  1. css布局奇淫巧計之強大的負邊距
  2. css負邊距詳解