老生長談的問題了, 但也是決定性的問題,以下圖:
對於不用兼容ie瀏覽器的工程能夠玩起來了, grid也不算新技術了, 技術的發展須要coder的推進, 有時候問問本身不用grid的原罪是否是'懶得學'哈哈哈哈, 我查了一下 chrome 57版本是 2017.3月發佈的 .
ie使用display: -ms-grid
的寫法也能夠有效, 可是網上看到不少同窗遇到了未知錯誤, 因此若是真的必須兼容ie的話仍是不要使用grid.面試
grid不會代替flex, 相反他兩位是很是棒的搭檔, 配合使用簡直開始螺旋人生, grid佈局能夠打破dom位置的限制,使用很差的話容易形成語義混亂, 致使魯棒性降低, 此次咱們就一塊兒來探究一下grid佈局的實戰場景.
chrome
爛大街的一個面試題, 居中的方法.
你能夠秀出grid了, 那麼分數必定多加一分到兩分.. 此處我介紹'四種'以後的內容會解釋爲何會這樣, 並且還有不少qiyinqiaoji... 能夠說學會了grid佈局那麼你的居中技巧就多出了6種以上!瀏覽器
<div class="wrap"> <div class="box"></div> </div>
.box{ width: 100px; height: 100px; border: 1px solid red; }
實現方法: 有點玩賴, 就是兩個屬性的隨意組合,突出一個'秀'
注意這裏的屬性不是flex的, 他在grid佈局模式下就是屬於grid.dom
.wrap{ // 固然了開啓佈局的方式也與flex同樣 display: inline-grid | grid; width: 300px; height: 300px; // 第一種 align-items: center; justify-items: center; // 第二種 align-items: center; justify-content: center; // 第三種 align-content: center; justify-items: center; // 第四種 align-content: center; justify-content: center; }
<style> /* 只是開啓grid佈局不會有變化, 不像flex佈局默認把內部的元素排成一排 */ .wrap{ display: grid; height: 100px; width: 300px; border: 1px solid; } .box{ height: 50px; width: 50px; border: 1px solid red; } </style> </head> <body> <div class="wrap"> <div class="box">1</div> <div class="box">2</div> <div class="box">3</div> </div> </body>
這裏就是把dom分爲4段, 每段100px寬, 而後咱們就能夠往裏面放內容了.grid-template-columns: 100px 100px 100px 100px;
ide
<style> .wrap{ display: grid; height: 100px; width: 300px; border: 1px solid; /* 1: 成爲一行, 開啓這個 */ /* 總共3列, 每列100px */ grid-template-columns: 100px 100px 100px; } .box{ height: 50px; /* 子組件不設置寬度就會自動填充單元格 */ /* 與上面的3個100px相對應*/ border: 1px solid red; } </style> </head> <body> <div class="wrap"> <div class="box">1</div> <div class="box">2</div> <div class="box">3</div> </div> </body>
repeat
定義重複的部分好比咱們要把橫排分紅10份, 那咱們寫10個100px顯然很笨拙,可使用以下的方式:grid-template-columns: repeat(10, 100px);
佈局
grid-template-columns: 100px 100px 100px 100px 100px 100px 200px 100px 100px 100px 100px;
能夠這樣寫:grid-template-columns: repeat(6, 100px) 200px repeat(4, 100px);
學習
grid-template-columns: 100px 200px 100px 200px 100px 200px 100px 200px 100px 200px 100px 200px
能夠以下的方式書寫:(要注意這裏只有一個'逗號')grid-template-columns: repeat(6, 100px 200px);
flex
好比我dom的寬度是400px 那麼下面的代碼就會生成 10個 40px寬的格子, 固然若是dom寬是390px, 它只會生成9個;grid-template-columns: repeat(auto-fill, 40px);
spa
<style> .wrap{ display: grid; height: 100px; width: 300px; border: 1px solid; grid-template-columns: 100px 100px 100px 100px; } .box{ height: 50px; border: 1px solid red; } </style> </head> <body> <div class="wrap"> <div class="box">1</div> <br> <div class="box">3</div> </div> </body>
咱們知道在flex佈局裏面, 好比我寫flex:1, 他表明着在flex佈局裏面佔總份數裏面的一份, grid裏面也有相似的屬性, 並且更加的定製化語義化, 他就是fr.設計
grid-template-columns: repeat(5,1fr);
grid-template-columns: 120px 1fr 2fr 3fr 1fr;
auto關鍵字, 單獨存在時功能與1fr差很少, 可是語義化更明顯grid-template-columns: 20px 20px auto 20px 20px;
auto與1fr的區別, 他不參與fr的計算規則, 因此與fr同時使用會被擠成自身寬度 grid-template-columns: 20px 2fr auto 1fr 20px;
下圖裏面的3就是靠自身撐起的寬度
minmax
限定範圍下面設置最小寬與最大寬
<style> .wrap{ display: grid; border: 1px solid; width: 300px; height: 100px; /* 最小值, 最大值, 好比被壓縮的時候要留一個基本寬度*/ /* 裏面能夠填寫fr爲單位的數字, 這就是好處 */ grid-template-columns: 1fr 1fr minmax(300px,1fr); } .box{ border: 1px solid red; } </style> </head> <body> <div class="wrap"> <div class="box">1</div> <div class="box">2</div> <div class="box">3</div> </div>
咱們已經把橫向弄忘了,就像學會了九陽神功的張無忌學乾坤大挪移.grid-template-rows
屬性就是定義列的
固然, 在行能夠用的技巧, 在列上均可以使用
<style> .wrap{ display: grid; border: 1px solid; height: 200px; width: 500px; grid-template-columns: 1fr 1fr 100px; grid-template-rows: 30px 60px 1fr; } .box{ border: 1px solid red; } </style> </head> <body> <div class="wrap"> <div class="box">1</div> <div class="box">2</div> <div class="box">3</div> <div class="box">4</div> <div class="box">5</div> <div class="box">6</div> <div class="box">7</div> <div class="box">8</div> <div class="box">9</div> </div> </body>
距離產生美, 這麼多格子固然須要點距離啦。
<style> .wrap{ display: grid; border: 1px solid; height: 300px; width: 300px; grid-template-columns: 1fr 1fr 1fr; grid-template-rows: 1fr 1fr 1fr; } .box{ border: 1px solid red; } </style> </head> <body> <div class="wrap"> <div class="box">1</div> <div class="box">2</div> <div class="box">3</div> <div class="box">4</div> <div class="box">5</div> <div class="box">6</div> <div class="box">7</div> <div class="box">8</div> <div class="box">9</div> </div> </body>
grid-row-gap: 10px;
grid-column-gap: 10px;
grid-gap:10px;
或者grid-gap:10px 10px;
給父級一個padding:10px
grid-row-gap: 10px 20px;
也就是說不固定的間距須要想別的辦法了。咱們能夠在畫格子的時候, 把間距也當格子畫。
grid-auto-flow: column;
格子的定位從橫向變爲了縱向
<style> .wrap{ display: grid; border: 1px solid; height: 300px; width: 300px; grid-template-columns: 1fr 1fr 1fr; grid-template-rows: 1fr 1fr 1fr; padding: 10px; grid-gap:10px; /* 定義排列的順序, 相似方塊旋轉了 */ /* 好比說豎排的佈局, 相似對聯的效果就簡單實現了 */ grid-auto-flow: column; } .box{ border: 1px solid red; } </style> </head> <body> <div class="wrap"> <div class="box">1</div> <div class="box">2</div> <div class="box">3</div> <div class="box">4</div> <div class="box">5</div> <div class="box">6</div> <div class="box">7</div> <div class="box">8</div> <div class="box">9</div> </div> </body>
這裏咱們就能夠解釋一下最開始說的對齊方式的原理。
<style> .wrap{ display: grid; border: 1px solid; height: 330px; width: 330px; /* 當單元格小於容器時效果顯著 */ grid-template-columns: 80px 80px 80px; grid-template-rows: 80px 80px 80px; grid-gap:10px; } .box{ border: 1px solid red; } </style> </head> <body> <div class="wrap"> <div class="box">1</div> <div class="box">2</div> <div class="box">3</div> <div class="box">4</div> <div class="box">5</div> <div class="box">6</div> <div class="box">7</div> <div class="box">8</div> <div class="box">9</div> </div> </body>
justify-content: center; align-content: center;
justify-content: end; align-content: center;
justify-content: end; align-content: end;
place-content:center
justify-content:
取值範圍:left right flex-end flex-start end start
align-content:
取值範圍:flex-end flex-start end start
真是奇奇怪怪沒有腦殼。。。。我建議採用center end start
這樣專屬grid的意義更加明確。
每一個小網格就像是excel的一個單元格, 那麼這些單元格的排布方式也頗有趣,第一種就總體的排布,第二種是自身的排布。
<style> .wrap{ display: grid; border: 1px solid; height: 300px; width: 300px; grid-template-columns: 1fr 1fr 1fr; grid-template-rows: 1fr 1fr 1fr; grid-gap:10px; justify-items: center; align-items: center; } .box{ height: 50px; width: 50px; border: 1px solid red; } .box4{ justify-self:end; align-self: end; } .box5{ justify-self:start; align-self: start; } .box6{ justify-self:stretch; align-self: stretch; border: 1px solid red; } .box7{ border: 1px solid red; } </style> </head> <body> <div class="wrap"> <div class="box">1</div> <div class="box">2</div> <div class="box">3</div> <div class="box box4">4</div> <div class="box box5">5</div> <div class=" box6">6</div> <div class=" box7">7</div> </div> </body>
justify-items:
` align-items:`影響因此上下左右居中。stretch
屬性致使自身是否被拉伸。stretch
填滿單元格的寬度(默認值)
grid-row-start
<style> /* 只是開啓grid佈局不會有變化, 不像flex佈局默認把內部的元素排成一排 */ .wrap{ display: grid; border: 1px solid; height: 500px; width: 500px; grid-template-columns: 1fr 1fr 1fr; grid-template-rows: 1fr 1fr 1fr; grid-gap:10px; } .box{ /* height: 50px; width: 50px; */ border: 1px solid red; } .box1 { /* 1: 我能夠自由選擇我從網格的哪裏開始, 哪裏結束 */ /* 也就是說打破了自由排列的起始值 */ grid-column-start: 2; /* 2: 結束就是這個元素佔據的’寬度‘ */ /* 注意: 沒法做到跨行的延續 */ grid-column-end: 4; /* 3: 列固然也能夠這麼玩*/ /* 他到了下面去, 而不佔用空間, 就是說他並不會把全體都往下弄一行 */ grid-row-start: 2; grid-row-end: 4; /* 4: 簡潔寫法, 斜槓挺假的 */ /* 討論一下, 爲啥要用 斜槓??? 而不是空格 */ /* 不寫就是默認跨越一個 */ grid-column: 1 / 3; grid-row: 1 / 3; } </style> </head> <body> <div class="wrap"> <div class="box box1">1:第一格開始, 第三格結束</div> <div class="box">2</div> <div class="box">3</div> <div class="box">4</div> </div> </body>
這種寫法忽然出現 '/'斜線, 我感受挺不舒服的, 不知道爲啥這麼設計.
grid-column: 1 / 3; grid-row: 1 / 3;
中規中矩的思惟無法走的更快, 讓我來拋磚引如一下。
<style> .wrap{ display: grid; border: 1px solid; height: 300px; width: 300px; grid-template-columns: 1fr 1fr 1fr; grid-template-rows: 1fr 1fr 1fr; /* 1: 把單元格內的項目居中 */ justify-items: center; align-items: center; } .box{ /* 能夠知足大於單元格的物體居中 */ height: 250px; width: 250px; border: 1px solid red; /* 2: 設置了9個單元格, 把他放到中間的單元格就ok了 */ grid-row-start: 2; grid-column-start:2 ; } /* 四個角, 位置被徹底混淆了, 不要這樣用 */ .box1{ grid-column-start: 1; grid-column-end: 2; } .box2{ grid-column-start: 3; grid-column-end: 4; } .box3{ /* 涉及到了網格錯位的知識, 不建議這麼用, 固然你會算別人不必定會算~~~ */ grid-column-start: 1; grid-column-end: 2; grid-row-start: 3; } .box4{ grid-column-start: 3; grid-column-end: 4; grid-row-start: 3; } </style> </head> <body> <div class="wrap"> <div class="box1">角</div> <div class="box2">角</div> <div class="box">***** 這樣居中的好處是, 能夠在四個角作一些文章,這是一種思惟遊戲</div> <div class="box3">角</div> <div class="box4">角</div> </div> </body>
grid-column-start: span 2;
不用寫結尾了, 代表站幾個就行了, 固然也有row屬性能夠設置.
grid-template-areas:
grid-template-columns
爲dom畫格子, 而後爲每一個單元格定義一個名字, 什麼名字均可以, 若是用不上的單元格名字就定義爲'.', 舉個例子以下:grid-template-areas: "header header header header" "main main . sidebar" "footer footer footer footer";
grid-area: header;
屬性, 那麼 dom就會佔據最上面四個格子的位置, 簡直太直接了, 至關於多了個縮略圖.<style> .wrap{ display: grid; border: 1px solid; height: 300px; width: 300px; grid-template-columns: repeat(4,1fr); grid-template-rows: repeat(3,1fr); grid-gap:10px; justify-content: center; align-content: center; padding: 10px; /* 1: 可視化映射, 個人理解這個纔是靈魂, 這個功能纔是沒法取代 */ /* '.'表示一個空的單元格 */ grid-template-areas: "header header header header" "main main . sidebar" "footer footer footer footer"; } .box{ border: 1px solid red; } .box1{ grid-area: header; } .box2{ grid-area: main; } .box3{ grid-area: sidebar; } .box4{ grid-area: footer; } </style> </head> <body> <p>能夠利用可視化作居中, 沒人這樣用, 可是若是是你不敢想那就...</p> <div class="wrap"> <div class="box box1">1</div> <div class="box box2">2</div> <div class="box box3">3</div> <div class="box box4">4</div> </div> </body>
<style> .wrap{ display: grid; height: 600px; width: 600px; margin: 50px auto; /* 用auto的話會致使大小不一致, 由於auto算是自適應裏面的寬高 */ grid-template-columns: repeat(15,1fr); grid-template-rows: repeat(15,1fr); justify-items: stretch; align-items: stretch; grid-template-areas: ". . . . . a a a a a . . . . . " ". . . b b f1 f1 f1 f1 f1 c c . . . " ". . d g5 g5 f1 f1 f1 f1 f1 f2 f2 e . . " ". f g4 g4 g4 f1 f1 f1 f1 f1 f4 f4 f4 g . " ". f g4 g4 g4 f1 f1 f1 f1 f1 f4 f4 f4 g . " "h g3 g4 g4 g4 f1 f1 f1 f1 f1 f4 f4 f4 f3 i " "h g3 g2 q q f1 f1 f1 f1 f1 r r r f3 i " "h g3 g2 q q f1 f1 f1 f1 f1 f6 f6 f5 f3 i " "h g3 g2 f9 f9 f1 f1 f1 f1 f1 f6 f6 f5 f3 i " "h g3 g2 f9 f9 f1 f1 f1 f1 f1 f6 f6 f5 f3 i " ". j g2 f9 f9 g1 s s s f7 f6 f6 f5 p ." ". j g2 f9 f9 f8 f8 f8 f8 f7 f6 f6 f5 p . " ". . k f9 f9 f8 f8 f8 f8 f7 f6 f6 o . . " ". . . m m f8 f8 f8 f8 f7 n n . . . " ". . . . . l l l l l . . . . . " ; } .box { background-color: black; } .box-a{ grid-area: a; } .box-b{ grid-area: b; } .box-c{ grid-area: c; } .box-d{ grid-area: d; } .box-e{ grid-area: e; } .box-f{ grid-area: f; } .box-g{ grid-area: g; } .box-h{ grid-area: h; } .box-i{ grid-area: i; } .box-j{ grid-area: j; } .box-k{ grid-area: k; } .box-l{ grid-area: l; } .box-m{ grid-area: m; } .box-n{ grid-area: n; } .box-o{ grid-area: o; } .box-p{ grid-area: p; } .box-q{ grid-area: q; display: flex; justify-content: center; align-items: center; background-color: rgb(255, 206, 46); } .box-q::after{ content: ''; display: block; height: 70px; width: 70px; border-radius: 50%; background-color: red; } .box-r{ grid-area: r; } .box-s{ grid-area: s; } .box-t{ grid-area: t; } .f{ background-color: rgb(251, 209, 71); } .f1{ grid-area: f1; } .f2{ grid-area: f2; } .f3{ grid-area: f3; } .f4{ grid-area: f4; } .f5{ grid-area: f5; } .f6{ grid-area: f6; } .f7{ grid-area: f7; } .f8{ grid-area: f8; } .f9{ grid-area: f9; } .g1{ grid-area: g1; } .g2{ grid-area: g2; } .g3{ grid-area: g3; } .g4{ grid-area: g4; } .g5{ grid-area: g5; } .g6{ grid-area: g6; } </style> </head> <body> <!-- 採用3個dom拼接,或者採用拼圖板, 拼圖更能體現grid佈局的又優點 --> <div class="wrap"> <div class="box box-a"> v </div> <div class="box box-b"> v </div> <div class="box box-c"> v </div> <div class="box box-d"> v </div> <div class="box box-e"> v </div> <div class="box box-f"> v </div> <div class="box box-g"> v </div> <div class="box box-h"> v </div> <div class="box box-i"> v </div> <div class="box box-j"> v </div> <div class="box box-k"> v </div> <div class="box box-l"> v </div> <div class="box box-m"> v </div> <div class="box box-n"> v </div> <div class="box box-o"> v </div> <div class="box box-p"> v </div> <div class="box box-q"> </div> <div class="box box-r"> v </div> <div class="box box-s"> v </div> <!-- 膚色 --> <div class="f f1"></div> <div class="f f2"></div> <div class="f f3"></div> <div class="f f4"></div> <div class="f f5"></div> <div class="f f6"></div> <div class="f f7"></div> <div class="f f8"></div> <div class="f f9"></div> <div class="f g1"></div> <div class="f g2"></div> <div class="f g3"></div> <div class="f g4"></div> <div class="f g5"></div> <div class="f g6"></div> </div> </body>
本次的分享會就到這裏, 若是有收穫的話點在贊在走嘍....
但願和你一塊兒進步.