1. 程式人生 > >佈局“負數”的妙用——少年自負凌雲筆(未完待續)

佈局“負數”的妙用——少年自負凌雲筆(未完待續)

佈局中巧妙運用"負數"

簡介

在我們日常的網頁佈局中,我們鮮少使用負 margin padding ,殊不知,我們可以利用它們解決很多佈局的問題,達到極好的視覺體驗。


溫馨提示

本文參考以下網址:http://www.topcss.org


負值的應用場景

  • 標籤的水平垂直居中
  • 去除列表的右邊距
  • 去除列表末尾元素的border-bottom
  • 自適應佈局
  • 等高佈局

1、標籤的水平垂直居中

網頁設計中,元素的水平居中,也是很常見的佈局;其中,標籤的大小可能不確定,但是對於大小確定的元素,我們可以使用一下方式進行佈局,實現標籤的水平垂直居中。

實現思路

使用 絕對定位 ,將 container 的定點定位到 body 的中心,然後使用負 margin (container 寬高的1/2),將 container 的中心拉回到 body 的中心,已到達 水平垂直居中 的效果。

HTML程式碼
	<div class="container">垂直居中對齊</div>
CSS程式碼
.container {
    width: 400px;
    height: 400px;
    position: absolute;
    top: 50%;
    left: 50%;
    margin-left
: -210px; margin-top: -210px; border: 1px dashed rgb(28, 19, 163); background: #eee; border-radius: 10px; padding: 10px; font-size: 30px; line-height: 400px; text-align: center; }
效果圖



2、去除列表的右邊距

對於專案中需要列表展示的檢視,為了美觀,我們需要在元素之間新增間隙 margin 。但是,會存在的問題是,對於每一個元素新增 右margin

時,顯然, 每行末尾元素 的右邊框是多餘,需要特別處理。一般來講,我們只需要找到對應的元素,設定 margin-right:0; 即可。採用新增對應的 className 或者利用 nth-child(An + B) 選擇到元素,但是如果頁面結構發生變化,我們的佈局不能適應其變化,會產生錯亂的情況。推薦使用 負margin 解決該佈局問題:

實現思路

對於按按排列的單個元素 li ,我們均設定 margin-right:10px;margin-bottom: 10px; ,並且給對應的父級元素 ul 設定 margin-right: -10px; 即可。

HTML程式碼
<div id="sudoku">
    <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>
CSS程式碼
 * {
     padding: 0;
     margin: 0;
     list-style: none;
 }

 #sudoku {
     width: 320px;
     height: 320px;
     background: rgb(228, 120, 120);
     margin: 100px auto;
 }

 #sudoku>ul {
     margin-right: -10px;
 }

 #sudoku>ul>li {
     width: 100px;
     height: 100px;
     background: rgb(56, 80, 216);
     margin-right: 10px;
     margin-bottom: 10px;
     float: left;
     text-align: center;
     line-height: 100px;
     font-size: 24px;
 }
效果圖


思考

佈局完成後,通過 F12 檢視元素的盒模型,發現 sudoku為320x320 ,而 ul為330x0 ,最後一行 margin-bottom: 10px; 神奇的不見了?這是為什麼呢? 期待你的答案……


3、去除列表末尾元素的border-bottom

在專案中,我們往往需要使用選單欄 menu ,並且需要使用 ul + li ,避免不了的是需要使用 border-bottom 來分割各個 li ,最後一個 li 的表邊框與 ul 的邊框重合,不美觀,我們可以使用 負margin 來解決該問題。

實現思路
  1. ul 新增 margin-bottom: -1px; 即可。
  2. 注意:我們使用的邊框寬度值 等於 margin-bottom的寬度的絕對值。
HTML程式碼
<ul id="container">
    <li style='font-weight:bold;font-size:20px;'>西江月 宋江</li>
    <li>自幼曾攻經史</li>
    <li>長成亦有權謀</li>
    <li>恰猛虎臥荒丘如</li>
    <li>潛伏爪牙忍受</li>
    <li>不幸刺文雙頰</li>
    <li>那堪配在江州</li>
    <li>他年若得報冤仇</li>
    <li>血染潯陽江口</li>
    <li>心在山東身在吳</li>
    <li>飄蓬江海謾嗟吁</li>
    <li>他時若遂凌雲志</li>
    <li>敢笑黃巢不丈夫</li>
</ul>
CSS程式碼
#container {
    margin: 20px auto;
    width: 270px;
    background: #f5f5f5;
    border-radius: 5px;
    border: 2px solid rgb(51, 13, 224);
}

#container>li {
    height: 25px;
    line-height: 25px;
    padding: 5px;
    border-bottom: 1px dashed rgb(197, 44, 44);
    margin-bottom: -1px;
    text-align: center;
}
效果圖



4、自適應佈局

請參考“雙飛翼佈局”,網址:點選此處學習“雙飛翼佈局”


5、等高佈局

在一些列表中,需要巢狀圖片和文字描述,但是文字描述的 字數 不同,導致標籤的 高度不統一 ;如果給元素列表設定相同的高度,顯然是不符合應用場景的。所以,我們必須解決 高度自適應 ,且 多列等高 的問題。

實現思路

問題的關鍵是給每個專案元素設定大的 padding-bottom ,然後用 數值相似的負margin-bottom 消除這個高度。這會導致每一列 溢位容器 元素,如果把 外包容器 的新增樣式 overflow:hidden; ,列就在式 最高點被裁切。

HTML程式碼