display:flex彈性布局

一、背景

前段時間幫公司運維小姑娘調整她自己寫的頁面樣式時發現她用了display: flex,我這個后端老古董還不太懂flex,自愧不如啊,所以寫篇博客記錄學習下。

現在寫的前端頁面還停留在依賴?display?屬性 +?position屬性 +?float屬性的布局方式,這種布局對一些特殊布局非常不方便,比如,垂直居中等等。

2009年,W3C 提出了一種新的方案----Flex 布局,可以簡便、完整、響應式地實現各種頁面布局。目前,它已經得到了所有瀏覽器的支持,這意味著,現在就能很安全地使用這項功能。

二、概念

Flex 是 Flexible Box 的縮寫,意為"彈性布局",用來為盒狀模型提供最大的靈活性。任何一個容器都可以指定為 Flex 布局(包括塊狀和行內元素)。在設置Flex布局后,子元素的floatclearvertical-align屬性將失效。

采用 Flex 布局的元素,稱為 Flex 容器(flex container),簡稱"容器"。它的所有子元素自動成為容器成員,稱為 Flex 項目(flex item),簡稱"項目"。

容器默認存在兩根軸:水平的主軸(main axis)和垂直的交叉軸(cross axis)。主軸的開始位置(與邊框的交叉點)叫做main start,結束位置叫做main end;交叉軸的開始位置叫做cross start,結束位置叫做cross end

項目默認沿主軸排列。單個項目占據的主軸空間叫做main size,占據的交叉軸空間叫做cross size

三、基本屬性

以下容器的6個屬性設置:

3.1、flex-direction  容器內項目的排序方式,屬性值如下:

row//默認值,沿水平主軸由左向右排列
row-reverse//沿水平主軸由右向左排列
column//沿垂直的交叉軸由上向下排列
column-reverse //沿垂直的交叉軸由下向上排列  

3.2、flex-wrap  容器內項目的換行方式,值如下:

nowrap //(默認):不換行。
wrap://換行,第一行在上方。
wrap-reverse://換行,第一行在下方。 

?

3.3、flex-flow  以上兩種屬性的簡寫 寫法:

div{flex-flow: <flex-direction> || <flex-wrap>; 
}

3.4、justify-content  項目在主軸上的對齊方式

flex-start//(默認值):左對齊
flex-end//右對齊
center//居中
space-between//兩端對齊,項目之間的間隔都相等。
space-around//每個項目兩側的間隔相等。所以,項目之間的間隔比項目與邊框的間隔大一倍。

  

3.5、align-item  項目在垂直交叉軸上的對齊方式

flex-start//交叉軸的起點對齊。
flex-end//交叉軸的終點對齊。
center//交叉軸的中點對齊。
baseline//項目的第一行文字的基線對齊。
stretch//(默認值):如果項目未設置高度或設為auto,將占滿整個容器的高度。

3.6、align-content  在多根軸線的情況下的對齊方式,一根軸線下不起作用

flex-start//與交叉軸的起點對齊。
flex-end//與交叉軸的終點對齊。
center//與交叉軸的中點對齊。
space-between//與交叉軸兩端對齊,軸線之間的間隔平均分布。
space-around//每根軸線兩側的間隔都相等。所以,軸線之間的間隔比軸線與邊框的間隔大一倍。
stretch(默認值)//軸線占滿整個交叉軸。

四、項目的屬性

4.1、order?屬性定義項目的排列順序。數值越小,排列越靠前,默認為0

?

4.2、flex-grow屬性定義項目的放大比例,默認為0,即如果存在剩余空間,也不放大。

如果所有項目的flex-grow屬性都為1,則它們將等分剩余空間(如果有的話)。如果一個項目的flex-grow屬性為2,其他項目都為1,則前者占據的剩余空間將比其他項多一倍。

4.3、flex-shrink屬性定義了項目的縮小比例,默認為1,即如果空間不足,該項目將縮小

如果所有項目的flex-shrink屬性都為1,當空間不足時,都將等比例縮小。如果一個項目的flex-shrink屬性為0,其他項目都為1,則空間不足時,前者不縮小。

?

4.4、flex-basis屬性定義了在分配多余空間之前,項目占據的主軸空間(main size)。

瀏覽器根據這個屬性,計算主軸是否有多余空間。它的默認值為auto,即項目的本來大小。它可以設為跟widthheight屬性一樣的值(比如350px),則項目將占據固定空間。

4.5、flex屬性是flex-grow,?flex-shrink?和?flex-basis的簡寫,默認值為0 1 auto。后兩個屬性可選。

該屬性有兩個快捷值:auto?(1 1 auto) 和 none (0 0 auto)。

建議優先使用這個屬性,而不是單獨寫三個分離的屬性,因為瀏覽器會推算相關值

4.6、align-self屬性允許單個項目有與其他項目不一樣的對齊方式。

可覆蓋align-items屬性。默認值為auto,表示繼承父元素的align-items屬性,如果沒有父元素,則等同于stretch

該屬性可能取6個值,除了auto,其他都與align-items屬性完全一致。

?

五、常用布局

5.1網格布局

5.11 基本網格布局

最簡單的網格布局,就是平均分布。在容器里面平均分配空間,需要設置項目的自動縮放。

HTML代碼如下:

<div class="Grid"><div class="Grid-cell">...</div><div class="Grid-cell">...</div><div class="Grid-cell">...</div>
</div>

CSS代碼如下:

.Grid {display: flex;
}.Grid-cell {flex: 1;
}

5.12 百分比布局

某個網格的寬度為固定的百分比,其余網格平均分配剩余的空間。

HTML代碼如下。

<div class="Grid"><div class="Grid-cell u-1of4">...</div><div class="Grid-cell">...</div><div class="Grid-cell u-1of3">...</div>
</div>
.Grid {display: flex;
}.Grid-cell {flex: 1;
}.Grid-cell.u-full {flex: 0 0 100%;
}.Grid-cell.u-1of2 {flex: 0 0 50%;
}.Grid-cell.u-1of3 {flex: 0 0 33.3333%;
}.Grid-cell.u-1of4 {flex: 0 0 25%;
} 

5.2、圣杯布局

圣杯布局(Holy Grail Layout)指的是一種最常見的網站布局。頁面從上到下,分成三個部分:頭部(header),軀干(body),尾部(footer)。其中軀干又水平分成三欄,從左到右為:導航、主欄、副欄。

HTML代碼如下:

<body class="HolyGrail"><header>...</header><div class="HolyGrail-body"><main class="HolyGrail-content">...</main><nav class="HolyGrail-nav">...</nav><aside class="HolyGrail-ads">...</aside></div><footer>...</footer>
</body>

  

CSS代碼如下:

.HolyGrail {display: flex;min-height: 100vh;flex-direction: column;
}header,
footer {flex: 1;
}.HolyGrail-body {display: flex;flex: 1;
}.HolyGrail-content {flex: 1;
}.HolyGrail-nav, .HolyGrail-ads {/* 兩個邊欄的寬度設為12em */flex: 0 0 12em;
}.HolyGrail-nav {/* 導航放到最左邊 */order: -1;
}

如果是小屏幕,軀干的三欄自動變為垂直疊加。

@media (max-width: 768px) {.HolyGrail-body {flex-direction: column;flex: 1;}.HolyGrail-nav,.HolyGrail-ads,.HolyGrail-content {flex: auto;}
}

  

5.3、輸入框的布局

我們常常需要在輸入框的前方添加提示,后方添加按鈕。

HTML代碼如下。

<div class="InputAddOn"><span class="InputAddOn-item">...</span><input class="InputAddOn-field"><button class="InputAddOn-item">...</button>
</div>

  

CSS代碼如下。

.InputAddOn {display: flex;
}.InputAddOn-field {flex: 1;
}

  

5.4、懸掛式布局

有時,主欄的左側或右側,需要添加一個圖片欄。

HTML代碼如下。

<div class="Media"><img class="Media-figure" src="" alt=""><p class="Media-body">...</p>
</div>

  

CSS代碼如下。

.Media {display: flex;align-items: flex-start;
}.Media-figure {margin-right: 1em;
}.Media-body {flex: 1;
}

  

5.5、固定的底欄

有時,頁面內容太少,無法占滿一屏的高度,底欄就會抬高到頁面的中間。這時可以采用Flex布局,讓底欄總是出現在頁面的底部。

HTML代碼如下。

<body class="Site"><header>...</header><main class="Site-content">...</main><footer>...</footer>
</body>

  

CSS代碼如下。

.Site {display: flex;min-height: 100vh;flex-direction: column;
}.Site-content {flex: 1;
}

  

5.6、流式布局

每行的項目數固定,會自動分行。

CSS的寫法。

.parent {width: 200px;height: 150px;background-color: black;display: flex;flex-flow: row wrap;align-content: flex-start;
}.child {box-sizing: border-box;background-color: white;flex: 0 0 25%;height: 50px;border: 1px solid red;
}

  

以上文章主要摘自阮一峰的《Flex 布局教程》,鏈接:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html?utm_source=tuicool

轉載于:https://www.cnblogs.com/qingxuit/p/10136739.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248808.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248808.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248808.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一些好的思維方式

定理s 一、墨菲定律 觀點&#xff1a;1.任何事都沒有表面看起來那么簡單&#xff1b;2.所有的事都會比你預計的時間長&#xff1b;3.會出錯的事總會出錯&#xff1b;4.如果你擔心某種情況發生&#xff0c;那么它就更有可能發生。 墨菲定律的核心觀點就4點&#xff0c;不算復雜&…

Vue組件通信原理剖析(二)全局狀態管理Vuex

首先我們先從一個面試題入手。 面試官問&#xff1a; “Vue中組件通信的常用方式有哪些&#xff1f;” 我答&#xff1a; 1. props 2. 自定義事件 3. eventbus 4. vuex 5. 還有常見的邊界情況$parent、$children、$root、$refs、provide/inject 6. 此外還有一些非props特性$att…

初識單點登錄及JWT實現

單點登錄 多系統&#xff0c;單一位置登錄&#xff0c;實現多系統同時登錄的一種技術 &#xff08;三方登錄&#xff1a;某系統使用其他系統的用戶&#xff0c;實現本系統登錄的方式。如微信登錄、支付寶登錄&#xff09; 單點登錄一般是用于互相授信的系統&#xff0c;實現單一…

Vue組件通信原理剖析(三)provide/inject原理分析

首先我們先從一個面試題入手。 面試官問&#xff1a; “Vue中組件通信的常用方式有哪些&#xff1f;” 我答&#xff1a; 1. props 2. 自定義事件 3. eventbus 4. vuex 5. 還有常見的邊界情況$parent、$children、$root、$refs、provide/inject 6. 此外還有一些非props特性$att…

iMX6開發板-uboot-網絡設置和測試

本文章基于迅為IMX6開發板 將iMX6開發板通過網線連接到路由器&#xff0c;同時連接好調試串口&#xff0c;上電立即按 enter&#xff0c;即可進入 uboot。然后輸入命令 pri&#xff0c;查看開發板當前的配置&#xff0c;如下圖所示可以看到 ip 地址、子網掩碼 等信息。 本文檔測…

Django ajax 檢測用戶名是否已被注冊

添加一個 register.html 頁面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <form><p>用戶名<input id"username" type&…

pyqt5控件

背景色設置 self.tab.setStyleSheet("background: rgb(238, 233, 233)") self.but_0.setStyleSheet("background: rgb(0, 255, 255)")樣式&#xff1a; self.but_0.setStyle(QStyleFactory.create("Windows"))字體&#xff1a; self.lineEdit.se…

詳解JDBC連接數據庫

一、概念 1. 為了能讓程序操作數據庫&#xff0c;對數據庫中的表進行操作&#xff0c;每一種數據庫都會提供一套連接和操作該數據庫的驅動&#xff0c;而且每種數據庫的驅動都各不相同&#xff0c;例如mysql數據庫使用mysql驅動&#xff0c;oracle數據庫使用oracle驅動&#xf…

ASP.NET MVC 自定義模型綁定1 - 自動把以英文逗號分隔的 ID 字符串綁定成 Listint...

直接貼代碼了&#xff1a; CommaSeparatedModelBinder.cs using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Web.Mvc;namespace MvcSample.Extensions {public class CommaSeparatedMode…

ZOJ4024 Peak

題意 給出一個數組 判斷這個數組是否形成了一個“山峰” 即中間有個數最大 從第一個數到這個數遞增 從這個數到最后一個數遞減 模擬 從兩端分別以遞增和遞減判斷 看第一個不滿足遞增或遞減的數是否相等并且沒越界就可以了 AC代碼&#xff1a; 1 #include<bits/stdc.h>2 u…

基本數據類型與String之間的轉換

字符串轉基本數據類型 調用基本數據類型對應的包裝類中的方法parseXXX(String)或valueOf(String)即可返回相應基本類型。 基本數據類型轉字符串 一種方法是將基本數據類型與空字符串&#xff08;""&#xff09;連接&#xff08;&#xff09;即可獲得其所對應的字符串…

springmvc跨域問題

1、跨域問題&#xff1a; 按照網上所有的方法試了一遍&#xff0c;都沒跨過去&#xff0c;正在無助之際&#xff0c;使用filter按照下面的方法解決的時候出現了轉機&#xff1a; 添加filter&#xff1a; package com.thc.bpm.filter;import javax.servlet.*; import javax.serv…

柳傳志給年輕人的建議:比起過日子,更要奔日子

改革開放的 40 年&#xff0c;是柳傳志實現人生價值的 40 年。 十一屆三中全會后&#xff0c;伴隨“科學的春天”&#xff0c;迎著改革開放的大潮&#xff0c;柳傳志“下海”了。但他并沒想到&#xff0c;自己選擇的電腦行業&#xff0c;讓他和聯想集團站在了潮頭。 從 1984 年…

成功秀了一波scala spark ML邏輯斯蒂回歸

1、直接上官方代碼&#xff0c;調整過的&#xff0c;方可使用 package com.test import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.mllib.classification.{LogisticRegressionModel, LogisticRegressionWithLBFGS} import org.apache.spark.mllib.e…

記錄一次查詢log的經歷

一大早發現生產數據庫的基礎資料被刪除。 由于每天都做了差異備份&#xff0c;而且是基礎資料&#xff0c;這樣數據就不會擔心找不回來。 首先通過每天的差異本分文件進行查看數據丟失的大概時間&#xff0c;查到數據丟失是在17晚上備份過后18丟失的。 然后找18號的數據庫執行記…

移動端輪播圖

1. 頁面布局 1.1 頁面框架 <body><div class"box"><div class"tupian"><img src"4.webp" alt""><img src"1.webp" alt""><img src"2.webp" alt""><…

Boost 序列化

原文鏈接&#xff1a; https://blog.csdn.net/qq2399431200/article/details/45621921 1. 編譯器 gcc, boost 1.55 2.1第一個簡單的例子 —— Hello World &#xff0c;將字符串內容歸檔到文本文件中 #include <iostream>#include <fstream>#include <string>…

docker CE 的安裝

一、Docker CE的安裝1.先決條件運行環境&#xff1a;Ubuntu 64位或者其他支持Docker的64位系統運行配置&#xff0c;linux內核版本必須大于 3.10&#xff0c;否則會因為缺少容器運行所需的功能而出錯。 2.在ubuntu下安裝Docker CEUbuntu版本? Cosmic 18.10 ? Bionic 18.04 (…

nodeJS中的異步編程

nodejs 不是單線程 在博客項目中關于異步問題&#xff1a; 1.當用戶添加一條博客時 需要通過post方式向服務器發送數據 后臺獲取用戶以post方式拿到傳送過來的數據 然后存入數據庫&#xff1a; 上面的代碼&#xff1a;創建一個空字符串 當用戶向服務器發送請求時出發data事件將…

day01筆記

linux基本命令的學習&#xff1a; 1.查看主機名hostname 2.修改主機名hostnamectl set-hostname s16ds 3.linux命令提示符 [roots16ds ~]# # 超級用戶的身份提示符 $ 普通用戶的身份提示符4.修改命令提示符 PS1變量控制 [roots16ds ~]# echo $PS1 [\u\h \W]\$PS1[\u\h \w \t]…