1. 程式人生 > 實用技巧 >移動端導航佈局

移動端導航佈局

寫在最前:移動端中導航的網格式佈局無處無在,寬高怎麼設定相適應?元素怎麼居中對齊?不同場景怎麼選擇程式碼最高效?巧妙使用margin、padding等基礎屬性,小小技巧可以解決許多煩惱!

一、Float佈局

1、場景

首頁導航佈局(無間距)

2、頁面佈局

<div class="g-grid">
    <div class="g-grid-item">
      <div class="g-grid-imgWrap">
        <img class="item-img" src="img/g1.png" />
      </div>
      <p class="g-grid-label">汽車票船票</p>
    </div>
    <!-- 以下九個子元素佈局相同省略 -->
 </div>

3、樣式程式碼

.g-grid {
    text-align: center;
    overflow: hidden; 
    background: #fff;
}
.g-grid-item {
    position: relative;
    float: left; 
    width: 20%;
    padding: 10px 0;
    text-align: center;
}
.g-grid-imgWrap {
    display: inline-block;
    width: 30%; 
    height: 0; 
    padding-bottom: 30%; 
}
.g-grid-imgWrap img {
    width: 100%;
}
.g-grid-label {
    font-size: 12px;
    color: #333;
}

4、程式碼解析(高度根據寬度進行自適應問題)

①、父元素g-grid通過overflow: hidden建立BFC,使得整體高度從1變成自適應。通常可使用clearfix來清除浮動的副作用

 .clearfix:after{
    display: block;
    clear: both;
    content: "";
    visibility: hidden;
    height: 0;
}
.clearfix{
    zoom:1;
}

②、子元素g-grid-item通過float: left屬性浮動起來,這也是該方法最主要的屬性。

③、移動端比較常見的一個需求是高度根據寬度進行自適應

。這個時候可以使用到padding-bottom。當width和padding-bottom相等時就實現了寬高相等(注意要將height置為0),舉一反三,各種比例下也可以設定。

width: 30%; 
height: 0; 
padding-bottom: 30%; 

引申:vh和vw是css引入視口的概念來代替顯示器的物理尺寸,它們作為單位的時候也可實現該效果,雖然現在相容性慢慢變好,但是Android4.4之前不支援是硬傷。
vw:1vw等於視口寬度的1%。
vh:1vh等於視口高度的1%。

height:1vw;
width:1vw;

一、Display:inline-block佈局

1、場景

首頁導航佈局(有間距)

2、樣式程式碼

頁面佈局與Float佈局相同

.g-grid {
    margin-right: -2%;
    padding: 10px 10px 0;
    font-size: 0;
    background: #fff;
}
.g-grid-item {
    position: relative;
    display: inline-block;
    width: 31.33%;
    padding-bottom: 31.33%;
    margin-right: 2%;
    margin-bottom: 10px;
}
.g-grid-imgWrap {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 20px;
}
.g-grid-imgWrap img {
    width: 100%;
    height: 100%;
}
.g-grid-label {
    position: absolute;
    bottom: 0;
    width: 100%;
    height: 20px;
    line-height: 20px;
    font-size: 12px;
    color: #333;
    text-align: center;
}

3、程式碼解析(去除最後一個元素margin-right值)

①、g-grid-item設定display:inline-block佈局經常會使得元素元素間莫名其妙出現空隙。可以在寫程式碼時使得元素和元素緊緊相連,但不太方便我們編寫程式碼,IDE格式化之後也會自動分開。此處建議設定父元素g-grid的font-size屬性為0就可以去掉空隙。

②、g-grid-item這些子元素之間需要間隔時用到margin-right(或者margin-left),經常要處理最後一行設定為margin-right(或者margin-left)為0。有以下解決方法:

  1. 手動或者js為最後一個元素新增一個margin-right:0
  2. 通過偽類:nth-child(3n)來設定margin-right:0
  3. 在g-grid-item的父元素設定margin-right: -2%;(推薦該方法)

樓上的float佈局也可以使用該方法去設定間隙

③、寬高多少不僅僅可以通過設定值來決定,該例子裡面使用以下程式碼實現了width:100%,高度為父級高度減去20px,根據場景不同來決定寫法。

position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 20px;

④、float佈局和display:inline-block佈局的水平居中通常使用text-align: center;,子元素在父元素裡水平居中要求子元素display不為block

三、Grid佈局

1、場景

網格佈局(無間距)

2、頁面佈局

<div class="g-grid">
    <div class="g-grid-item">
      <img class="item-img" src="img/g1.png" />
      <p class="g-grid-label">汽車票船票</p>
    </div>
    <!-- 以下八個子元素佈局相同省略 -->
 </div>

3、樣式程式碼

.g-grid {
    display: grid;
    grid-template-columns: repeat(3, 33.33%);
    grid-template-rows: repeat(3, 100px);
    background: #fff;
}
.g-grid-item {
    display: inline-grid;
    border-right: 1px solid #eee;
    border-top: 1px solid #eee;
    align-content: center
    justify-items: center;
}
.g-grid-item:nth-child(3n) {
    border-right: none;
}
.g-grid-item img {
    height: 30px;
    width: 30px;
}
.g-grid-label {
    font-size: 12px;
    color: #333;
}

4、程式碼解析

①、grid佈局通過grid-template-columns和grid-template-rows來設定幾列幾行
②、g-grid-item通過設定align-content: center;來使得子元素都處於垂直居中,justify-items: center來使得子元素都處於水平居中

PPT模板下載大全https://www.wode007.com

四、Flex佈局

1、場景

九宮格佈局(有空隙)

2、樣式程式碼

頁面佈局與Grid佈局相同請輸入程式碼

.g-grid {
    display: flex;
    flex-wrap: wrap;
}
.g-grid-item {
    flex: 0 1 31.33%;
    margin: 0px 1% 10px;
    padding: 1.2rem;
    box-sizing: border-box;
    text-align: center;
    background: #eee;
}
.g-grid-item img {
    height: 30px;
    width: 30px;
}
.g-grid-label {
    font-size: 12px;
    color: #333;
}

3、程式碼解析(Flex換行顯式且存在間距)

①、Flex佈局通過flex-wrap: wrap;來進行換行,但當需要元素與元素之間存在間距時,不能使用justify-content: space-between;,減少一個元素會變成下圖:

所以該例子通過margin來設定間距。

②、.g-grid-item設定flex: 0 1 31.33%;意思是元素的本來大小為父元素的31.33%,空間不足時該元素將縮小,存在剩餘空間也不放大。

當該值設為flex: 1 1 31.33%;時,減少一個元素會變成下圖: