響應式網格(柵格化)佈局

来源:http://www.cnblogs.com/jecyu/archive/2017/08/08/7302385.html
-Advertisement-
Play Games

響應式網格系統 ======================================== 響應式網格系統的概念 把網頁劃分成列、行、外邊距、隔離帶(各列與各行之間的空白)等由一系列相交的水平軸和垂直軸組成的網格。 網格佈局的作用在於更有效地控制元素在網頁中所占比例的大小。比如,博客中有一個留 ...


響應式網格系統

響應式網格系統的概念

  • 把網頁劃分成列、行、外邊距、隔離帶(各列與各行之間的空白)等由一系列相交的水平軸和垂直軸組成的網格。
  • 網格佈局的作用在於更有效地控制元素在網頁中所占比例的大小。比如,博客中有一個留言板模塊,在比較大的屏幕上,我們希望它占了右邊 25% 的寬度,在手機等比較小的屏幕上,我們希望它占 100% 的寬度,出現在博客文章下方。網格佈局是一種實現這一需求的辦法,它的好處是,把所有的寬度分為固定欄數(常用 12 欄),從而更高效的控制元素寬度。

響應式系統的基本構成

通過BootStrap 官網可以更加詳細地瞭解響應式網格是如何實現的,通常主體部分由以下構成:

  • container
  • rows
  • columns
  • gutter(列與列之間的空白)
  • breakpoint(通過media query實現響應式)

創建網格系統之前需要知道的事情

1.應該使用等寬的列嗎?

按理來說,我們可以使用等寬的列或不等寬列來劃分網格,這要決定於我們的網頁複雜程度,一般都是使用等寬列,更加靈活和實用,像Bootstrap框架,通過元素所占的列數很方便計算出元素的寬度。

2.應該使用多少列?

如上圖,我們可以使用8欄、10欄、12欄都可以,通常取決於設計圖的佈局類型和內容,如一列、兩列、三列佈局等,如果不清楚佈局類型和內容的話,一般使用靈活的12欄佈局。

3.應該設置多大的列寬和間距?

  • 解法一:由上而下,例如容器寬度為1140px,gutter為20px,則列寬為)1140px / 12 -20px。(通常使用這種方法)
  • 解法二:由下往上,通常列寬設為間距的倍數,如gutter為20px,則列寬為60px。

4.如何讓網格適應不同視窗的大小?

隨著用戶代理的大小變化,列寬和間距需要在斷點處breakpoint做出相應的改變以得到更好的視覺體驗。
列寬使用百分數,而間距gutter固定的大小px或rem。如Bootstrap

/* Bootstrap */
.col-md-4 {
  width: 33.33333%;
  padding-left: 15px;
  padding-right: 15px;
  float: left;
}

5.是否使用預置類?

  • 使用預定類col-*(HTML grid systems),直接在html結構里添加

    <div class="row">
        <div class="col-md-8 col-lg-6"></div>
        <div class="col-md-4 col-lg-6"></div>
    </div>
    • 優點:直觀、直接知道多少元素所占的列數
    • 缺點:HTML結構膨脹,需要預先知道佈局
  • 不使用預定義類(CSS grid systems)

    <div class="content"></div>
    <div class="sidebar"></div>
    • 優點:可維護性強、不用更改HTML、直接在CSS指定樣式
    • 缺點:不夠直觀
  • 使用第二種維護性好,應用性更強,當需求更改的時候,不用直接更改HTML的類名。詳細點擊這裡響應式的話,應該使用相對單位remem替代px

    .l-guest-article {
      @include clearfix;
      .l-main {
        margin-top: 20px;
        @media (min-width: 700px) {
          width: percentage(8/12);
          margin-top: 0;
          float: left;
        }
      }
      .l-sidebar {
        margin-top: 20px;
        @media (min-width: 700px) {
          width: percentage(8/12);
          float: right;
        }
      }
    }

開始創建你自己的響應式網格系統

下麵開始構建響應式網格系統,理解Boostrap網格系統是如何實現的。
在開始構建容器之前,需要對所有容器設置box-sizing屬性,以免後期設置邊框或間距的時候影響了元素的大小。

html {
  box-sizing: border-box;
}

*,
*:before,
*:after {
  box-sizing: inherit;
}

1.Grid container

.grid-container {
    width: 100%;
    max-width: 1200px; /*這裡根據實際情況是否設置*/
    margin-right: auto;
    margin-left: auto;
}

2.Rows

因為對每一列設置了浮動,所以容器row需要清理浮動。

 /*-- our cleafix hack -- */ 
.row:before, 
.row:after {
    content:"";
    display: table ;
     clear:both;
}

3.Columns

這裡的列寬度,取決於你設定的網格欄數,如6欄,則每一欄大約為1/6。此處沒有減去gutter的大小。

 [class*='col-'] {
    float: left;
    min-height: 1px; 
    width: 16.66%; 
}
  • 現象:浮動列為空的時候水平方向上發生摺疊現象。
  • 原因:height: 0,width不為0的時候)float帶來的影響。
  • 解決:列本身設有border或padding,否則需要設置min-height: 1px。

如果要預定義多個類的話,類似Bootstrap這樣

.col-1{
    width: 16.66%; 
}
.col-2{
    width: 33.33%; 
}
.col-3{
    width: 50%; 
}
.col-4{
    width: 66.664%;
}
.col-5{
    width: 83.33%;
}
.col-6{
    width: 100%;
}

4.gutter的處理

  • one-sided gutter
    • margin-right(需要額外處理最後一個邊距的問題)

      /* For a 3-column grid */
      .grid-item:nth-child(3n+3) {
          margin-right: 0;
          float: right;
      }
    • padding-right(造成最後一個元素的寬度比前面的小,因為設置了box-sizing: border;)

  • Split gutters(使用這種方法就能避免以上的問題)
    • marging-left 和 margin-right(需要使用calc減去gutter的大小)

      .grid-item {
        width: calc((100% - 20px * 3) / 3);
        margin-right: 10px;
        margin-left: 10px;
        float: left;
      }
      • 優點:HTML結構簡潔,不需要額外的子元素。
      • 缺點:IE9+,比較麻煩,要設置col-1~col-12每列都要這樣設置,CSS代碼冗餘,而且改動邊距的話需要全改。
    • padding-left 和 padding-right,需要在HTML結構列加入額外子元素。

       <div class="row">
          <div class="col-md-4 col-sm-6"><div class="inner"></div></div>
          <div class="col-md-4 col-sm-6"><div class="inner"></div></div>
          <div class="col-md-4 col-sm-12"><div class="inner"></div></div>
      </div>
      
      [class*="col-"] {
          padding-left: 10px;
          padding-right: 10px;
      }
      • 優點:CSS代碼:直接是分數,簡潔,無需減去gutter。因為這是在容器col裡面設置內邊距。
      • 缺點:需要額外的子元素

5.make your layouts responsive


通過設置利用media設置斷點

  • 這裡沒有使用預定義類。

    .l-guest-article {
      @include clearfix;
      .l-guest {
        @media (min-width: 700px) {
          width: percentage(4/12);
          float: left;
        }
    
        @media (min-width: 1200px) {
          width: percentage(2/12);
        }
      }
      .l-main {
        margin-top: 20px;
        @media (min-width: 700px) {
          width: percentage(8/12);
          margin-top: 0;
          float: left;
        }
        @media (min-width: 1200px) {
          width: percentage(7/12);
        }
      }
      .l-sidebar {
        margin-top: 20px;
        @media (min-width: 700px) {
          width: percentage(8/12);
          float: right;
        }
        @media (min-width: 1200px) {
          width: percentage(3/12);
          margin-top: 0;
        }
      }
    }
  • 使用預定義類,一樣的道理通過媒體查詢,然後把需要的類添加到HTML結構即可。

    @media all and (max-width: 768px) {
        .col-sm-1 {
            width: 8.33%;
        }
    
        .col-sm-2 {
            width: 16.66%;
        }
    
        .col-sm-3 {
            width: 25%;
        }
    
        .col-sm-4 {
            width: 33.33%;
        }
    
        .col-sm-5 {
            width: 41.66%;
        }
    
        .col-sm-6 {
            width: 50%;
        }
    
        .col-sm-7 {
            width: 58.33%;
        }
    
        .col-sm-8 {
            width: 66.66%;
        }
    
        .col-sm-9 {
            width: 75%;
        }
    
        .col-sm-10 {
            width: 83.33%;
        }
    
        .col-sm-11 {
            width: 91.66%;
        }
    
        .col-sm-12 {
            width: 100%;
        }
    }

實例應用

Demo

拓展閱讀

參考資料


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用!!操作符轉換布爾值 有時候我們需要對一個變數查檢其是否存在或者檢查值是否有一個有效值,如果存在就返回true值。為了做這樣的驗證,我們可以使用!!操作符來實現是非常的方便與簡單。對於變數可以使用!!variable做檢測,只要變數的值為:0、null、" "、undefined或者NaN都將返 ...
  • 大圖輪播完整流程代碼操作: <style> * { margin: 0px; padding: 0px; } .stage { width: 500px; height: 300px; border: 5px solid black; margin: 200px; position: relativ ...
  • get請求代碼: api.ajax({ url:'http://m.weather.com.cn/data/101010100.html' //天氣預報網站的WebService介面},function(ret,err){ if (ret) { api.alert({msg:JSON.stringi ...
  • canvas背景效果: ...
  • 一、css簡介 css(Cascading Style Sheets)層疊樣式表,是一種為html文檔添加樣式的語言,主要有兩個功能:渲染和佈局。使用css主要關註兩個點:查找到標簽,屬性操作 二、css的引入方式 (1)行內式引入: 直接在html語句的屬性中設置,這種方法的缺點是html代碼和c ...
  • Babel是一個廣泛使用的轉碼器,可以將ES6代碼轉譯為ES5代碼,從而在現有環境下執行。 舉例說明: 轉譯前(ES6格式)代碼如下: 轉譯後(ES5格式)代碼如下: 如上用Babel轉譯為ES5格式後就可以在現有的javascript環境下運行了。 babel安裝與項目部署步驟如下: 1.新建一個 ...
  • 1.封裝$函數 2.取色器 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 <script src="js/select.js"></script> ...
  • 新建項目 開始(確認已經安裝node環境和npm包管理工具) 1、新建項目文件名為start_vuedemo 2、npm init -y 初始化項目,我的win7系統,工程在d盤的vue_test_project文件夾下的名為start_vuedemo的工程文件夾 如圖所示: 在該工程下自動生成一個 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...