負margin技術原理與運用 | CSS

在CSS中尘吗,margin的值可以是正數(shù),也可以是負數(shù)。
當margin為負數(shù)的時候源譬,對普通文檔流元素和對浮動元素的影響是不一樣的。

margin的兩種情況

  1. 當元素的margin-top或者margin-left為負數(shù)時宇整,“當前元素”會被拉向指定方向瓶佳。
  2. 當元素的margin-bottom或者margin-right為負數(shù)時,“后續(xù)元素”會被拉向指定方向鳞青。

我們來看看下面的例子:

<style>
  .container div {
    width: 300px;
    height: 60px;
    line-height: 60px;
    text-align: center;
    color: #fff;
  }
  .first { background-color: red; }
  .second { background-color: purple; }
  .third { background-color: blue; }
</style>
<div class="container">
  <div class="first">1</div>
  <div class="second">2</div>
  <div class="third">3</div>
</div>
未設置margin的情況

margin-topmargin-left舉例

當元素的margin-top或者margin-left為負數(shù)時霸饲,“當前元素”會被拉向指定方向。

此時我們將第2個div的margin-top進行設置:.second { margin-top: -30px; }臂拓,效果如下:

第2個div設置margin-top為-30px

可以看到厚脉,當前元素(第2個div)被拉向top方向30px,并且覆蓋了div1胶惰。

如果是margin-left同理(可以理解為上圖逆時針旋轉(zhuǎn)90°)傻工,將第2個div設置為:.second { margin-left: -30px; },效果如下:

第2個div設置margin-left為-30px

當前元素(第2個div)被拉向tleft方向30px孵滞,并且覆蓋了div1中捆。

margin-bottommargin-right舉例

當元素的margin-bottom或者margin-right為負數(shù)時,“后續(xù)元素”會被拉向指定方向坊饶。

我們試著將第2個div的margin-bottom進行設置:.second { margin-bottom: -30px; }泄伪,效果如下:

第2個div設置margin-bottom為-30px

可以看到后續(xù)元素(即第2個div)被拉向上一個元素(即第2個div)的方向,且覆蓋了上一個元素匿级。
margin-right也一樣:

第2個div設置margin-right為-30px

運用場景

了解了負margin的規(guī)則蟋滴,我們來聊聊具體使用的場景染厅。
比較常用的技巧有:

  1. 圖片與文字對齊
  2. 自適應兩列布局
  3. 元素垂直居中
  4. tab選項卡

圖片與文字對齊

當圖片與文字排在一起的時候,在底部水平方向上往往都是不對齊的津函。如:

<img src="./icon.png" alt="icon">這是一個圖標
底部沒有對齊

這是因為肖粮,圖片與文字默認是基線對齊(vertical-align:baseline;)。

如果想要實現(xiàn)圖片與文字底部水平方向?qū)R尔苦,除了使用vertical-align:text-bottom;這個方法之外涩馆,還可以使用兼容性比較好的負margin來實現(xiàn):margin-bottom: -3px;,效果如下:

margin-bottom: -3px;

這個3px正是文本中baselinebottom的距離蕉堰。

自適應兩列布局

自適應兩列布局通常指的是一列寬度固定凌净,另一列寬度自適應的布局方式。利用負margin技術可以很好地實現(xiàn)這種布局屋讶。

<style>
  div {
    float: left;
    color: #fff;
    height: 500px;
  }
  .siderBar {
    width: 200px;
    background-color: purple;
  }
  .content {
    width: 100%;
    margin-right: -200px;
    background-color: plum;
  }
</style>
<body>
    <div class="siderBar">側(cè)邊欄冰寻,寬度固定200px</div>
    <div class="content">內(nèi)容區(qū),寬度自適應</div>
</body>
自適應兩列布局

這時候改變?yōu)g覽器的寬度皿渗,可以看出右側(cè)內(nèi)容區(qū)可以自動適應瀏覽器斩芭。

元素垂直居中

用負margin+position:absolute可以實現(xiàn)block元素、inline元素以及inline-block元素的垂直居中乐疆。

.father {
    position: relative; // 控制子元素在父元素之內(nèi)
    width: 500px;
    height: 500px;
    background-color: cornflowerblue;
}
.son {
    position: absolute;
    top: 50%;
    left: 50%;
    margin-top: -100px; // 元素height一半的負數(shù)
    margin-left: -50px; // 元素
    width: 100px;
    height: 200px;
    background-color: white;
}
元素垂直居中

原理是:絕對定位的top: 50%; left:50%;只是定位了son元素左上角的點的位置划乖,而margin-topmargin-left將自己拉回了寬高一半,將自己的中心點變成中心挤土。

tab選項卡

利用負margin技術可以實現(xiàn)選項卡的樣式設計琴庵。
如下代碼:

<style>
  ul, li {
    list-style: none;
  }
  .tab {
    width: 400px;
  }
  .tabHd {
    margin-bottom: -1px;
    padding: 0 10px 0 0;
    border: 1px solid #6c92ad;
    border-bottom: none;
    background: #eaf0fd;
    height: 28px;
  }
  .tabList {
    float: left;
    margin-left: -1px;
    padding: 0 15px;
    line-height: 28px;
    border-left: 1px solid #6c92ad;
    border-right: 1px solid #6c92ad;
    color: #005590;
    text-align: center;
  }
  .tabList.current {
    position: relative;
    background: #fff;
  }
  .tabBd {
    border: 1px solid #6c92ad;
  }
  .tabBd .roundBox {
    padding: 15px;
  }
  .tabContent {
    display: none;
  }
  .tabContent.current {
    display: block;
  }
</style>
<div id="tab" class="tab">
  <ul class="tabHd">
    <li class="tabList current">tab 1</li>
    <li class="tabList">tab 2</li>
    <li class="tabList">tab 3</li>
    <li class="tabList">tab 4</li>
  </ul>
  <div class="tabBd">
    <div class="roundBox">
      <div class="tabContent current">選項內(nèi)容1</div>
      <div class="tabContent">選項內(nèi)容2</div>
      <div class="tabContent">選項內(nèi)容3</div>
      <div class="tabContent">選項內(nèi)容4</div>
    </div>
  </div>
</div>

效果如下:

負margin實現(xiàn)選項卡

代碼中用到了兩個負margin,一個用于tabList仰美,通過向右邊“拉”用來重疊每個tab項的border迷殿。
另一個用于tabHd,通過向上“拉”咖杂,并且設置當前選項的背景色為白色摸吠,將選項內(nèi)容覆蓋住當前選項的下border怀读,而其余tab項由于沒有設置背景色默認為透明,于是不會被遮罩住捞镰。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末滓窍,一起剝皮案震驚了整個濱河市免猾,隨后出現(xiàn)的幾起案子捌袜,更是在濱河造成了極大的恐慌被盈,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伍绳,死亡現(xiàn)場離奇詭異撩匕,居然都是意外死亡,警方通過查閱死者的電腦和手機墨叛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門止毕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人漠趁,你說我怎么就攤上這事扁凛。” “怎么了闯传?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵谨朝,是天一觀的道長。 經(jīng)常有香客問我甥绿,道長字币,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任共缕,我火速辦了婚禮洗出,結果婚禮上,老公的妹妹穿的比我還像新娘图谷。我一直安慰自己翩活,他們只是感情好,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布便贵。 她就那樣靜靜地躺著菠镇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪承璃。 梳的紋絲不亂的頭發(fā)上利耍,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機與錄音盔粹,去河邊找鬼隘梨。 笑死,一個胖子當著我的面吹牛玻佩,可吹牛的內(nèi)容都是我干的出嘹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼咬崔,長吁一口氣:“原來是場噩夢啊……” “哼税稼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起垮斯,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤郎仆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后兜蠕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扰肌,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年熊杨,在試婚紗的時候發(fā)現(xiàn)自己被綠了曙旭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盗舰。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖桂躏,靈堂內(nèi)的尸體忽然破棺而出钻趋,到底是詐尸還是另有隱情,我是刑警寧澤剂习,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布蛮位,位于F島的核電站,受9級特大地震影響鳞绕,放射性物質(zhì)發(fā)生泄漏失仁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一们何、第九天 我趴在偏房一處隱蔽的房頂上張望萄焦。 院中可真熱鬧,春花似錦垂蜗、人聲如沸楷扬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烘苹。三九已至,卻和暖如春片部,著一層夾襖步出監(jiān)牢的瞬間镣衡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工档悠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留廊鸥,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓辖所,卻偏偏與公主長得像惰说,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子缘回,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355