Grid 布局

作者: 邢烽朔 | 来源:发表于2018-02-05 00:35 被阅读237次
    Can I Use

    Grid 是CSS中最强大的布局系统。它是2-Dimensional System,这意味着它可以同时处理列和行.——(PS:Flex布局主要是1-Dimensional System)

    使用基础:

    1.必须先定义一个容器元素:display: grid
    2.设置列与行:grid-template-columns | grid-template-rows
    3.将它的子元素也融入到Grid中:grid-column | grid-row

    与Flex布局类似,Grid的属性顺序无关紧要。您的CSS可以以任意顺序放置它们,这使得使用媒体查询重新排列网格变得非常容易。想象一下,定义整个页面的布局,然后完全重新排列它,以适应不同的屏幕宽度,只需要几行CSS。网格是有史以来最强大的CSS模块之一。

    Can I Use

    重要术语的理解

    应用 display: grid 的元素,是为所有 grid items 的父元素:如例子中的container.

    //Example:
    <div class="container">  //Gird Container
      <div class="item item-1"></div>
      <div class="item item-2"></div>
      <div class="item item-3"></div>
    </div>
    

    Grid items 是 GridContainer 的直接后代! 而像 sub-items 则不属于 Grid-items

    Example:
    <div class="container">
      <div class="item"></div> 
      <div class="item">
        <p class="sub-item"></p>
      </div>
      <div class="item"></div>
    </div>
    

    线 (Grid Line)

    构成 Grid Line 的分界线,可以是垂直的(columns grid line)也可以是水平的(rows grid line),并可位于行/列的任一侧..

    轨道 (Grid Track)

    两条相邻的 Grid Line 中间的空间(中间的空间就是轨道),可以想象成Grid的 行或列!
    Example中, 第二第三条Grid Line 中间就是Grid-Track


    Grid-Track

    单元格 (Grid Cell)

    两个相邻的 列和行的 Grid Line..组成一个 Grid Cell..
    Example中,黄色部分由 1/2行与2/3列 构成的Grid-Cell


    Grid-Cell

    区域 (Area)

    Grid Area 可以由任意数量的 Grid Cell 组成。由四条 Grid Line 包围的总空间
    Example:由行和列的1/3 Grid Line 包围形成


    Grid-Area

    Grid 属性目录

    Properties for the Grid Container Properties for the Grid Items
    display grid-column-start
    grid-template-columns grid-column-end
    grid-template-rows grid-row-start
    grid-template-areas grid-row-end
    grid-template grid-column
    grid-column-gap grid-row
    grid-row-gap grid-area
    grid-gap justify-self
    justify-items align-self
    align-items
    justify-content
    align-content
    grid-auto-columns
    grid-auto-rows
    grid-auto-flow
    grid

    属性功能

    display
    

    可将元素定义为Grid容器,并为其内容建立新的Grid 格式上下文。

    • Grid 生成块级Grid
    • inline-grid 生成内联Grid
    • subgrid 如果 Grid Container 本身就是一个 Grid Items (嵌套的Grid)..那可使用这个值来根据父元素的行&列来调整大小.
    .container {
      display: grid | inline-grid | subgrid;
    }
    

    行 & 列:

    grid-template-columns 
    grid-template-rows
    

    使用空格分隔的值 列表定义网格的列和行。这些值表示轨道大小,它们之间的空间表示网格线。

    • <track-size> - 可以是Grid中的空闲空间的长度,百分比或小部分(使用fr单位)
    • <line-name> - Grid Line 的任意名称
    .container {
      grid-template-columns: <track-size> ... | <line-name> <track-size> ...;
      grid-template-rows: <track-size> ... | <line-name> <track-size> ...;
    }
    
    Example
    // 在轨迹值之间留出空白区域时,网格线会自动分配数字名称:
    .container {
      grid-template-columns: 40px 50px auto 50px 40px;
      grid-template-rows: 25% 100px auto;
    }
    
    自动分配LineName

    当然也可以命名GridLine..(需要注意的是:名称 需要带括号)

    .container {
      grid-template-columns: [first] 40px [line2] 50px [line3] auto [col4-start] 50px [five] 40px [end];
      grid-template-rows: [row1-start] 25% [row1-end] 100px [third-line] auto [last-line];
    }
    
    命名Grid-Line

    一行中可以多个名称,如第二行有 row1-end 和 row2-start:它既是Grid Track 1 的结尾Grid Line 又是 Grid Track 2 的开头Grid Line

    .container {
      grid-template-rows: [row1-start] 25% [row1-end row2-start] 25% [row2-end];
    }
    

    如果定义包含重复的部分...可以使用repeat()来简化..

    grid-template-columns: repeat(3, 20px [col-start]) 5%;
    //等于:
    grid-template-columns: 20px [col-start] 20px [col-start] 20px [col-start] 5%;
    

    fr单位允许设置的Track的大小为Grid Container的空间的一小部分。例如,这会将每个项目设置为网格容器宽度的三分之一:

    .container {
      grid-template-columns: 1fr 1fr 1fr;
    }
    

    如果像下面这种情况...分为4列..拥有fr单位的3列将平分总长度(减去50px):

    .container {
      grid-template-columns: 1fr 50px 1fr 1fr;
    }
    

    区域:

    grid-template-ares
    

    通过引用由 grid-area 属性 指定的GridArea 的名称 来定义 Grid 模板.
    重复GridArea 的名称 会让内容跨越这些 Grid Cell ..使用. 则代表一个空的Grid Cell

    • <grid-area-name> - 指定的Grid Area的名称 -> grid-area
    • . 表示一个空的 Grid Cell
    • none 没有定义Grid Area
    .container {
      grid-template-areas: 
        "<grid-area-name> | . | none | ..."
        "...";
    }
    
    //Example:
    .item-a {
      grid-area: header;  //定义Grid Area 名称
    }
    .item-b {
      grid-area: main;
    }
    .item-c {
      grid-area: sidebar;
    }
    .item-d {
      grid-area: footer;
    }
    
    .container {
      grid-template-columns: 50px 50px 50px 50px;
      grid-template-rows: auto;
      grid-template-areas: 
        "header header header header"
        "main main . sidebar"
        "footer footer footer footer";
    }
    

    创建:
    列 :4列
    行 :自动
    区域 第一行四个Grid Cell 均为 Header GridArea
    区域 第二行两个Grid Cell 为 Main. 一个Cell为空.. 最后一个Cell为 Sidebar.
    区域 第三行四个Grid Cell 均为 Footer

    Grid Area
    每一行都需要相同数量的GridCell

    Grid-Template

    这是一个 省略写法.
    可以把 grid-template-rows/grid-template-columnsgrid-template-areas.写在同一个声明中。

    • none - 将所有三个属性设置为其初始值
    • subgrid - 设置 grid-template-rowsgrid-template-columns 到 子Grid中去,和将 grid-template-areas 作为它的初始值.
    • <grid-template-rows>/<grid-template-columns> 分别设置 grid-template-columnsgrid-template-rows 指定的值,并设置 grid-template-areas为none。
    .container {
      grid-template: none | subgrid | <grid-template-rows> / <grid-template-columns>;
    }
    

    它接受一个更复杂但相当方便的语法来指定这三个

    Example:
    .container {
      grid-template:
        [row1-start] "header header header" 25px [row1-end]
        [row2-start] "footer footer footer" 25px [row2-end]
        / auto 50px auto;
    }
    //  相当:
    .container {
      grid-template-rows: [row1-start] 25px [row1-end row2-start] 25px [row2-end];
      grid-template-columns: auto 50px auto;
      grid-template-areas: 
        "header header header" 
        "footer footer footer";
    }
    

    由于grid-template不会重置隐式Grid属性(grid-auto-columns, grid-auto-rows, 和 grid-auto-flow),所以建议尽量使用 grid 属性...


    Grid-cloumns-gap | Grid-row-gap

    指定 Grid-Line 的宽度...
    可以想想成 列 & 行 之间的宽度..
    只能在 行/列 之间(如 row 1 start 或 colum 1 start 就没法设置-。-因为在边缘)

    • <line-size> - Length Value.
    .container {
      grid-column-gap: <line-size>;
      grid-row-gap: <line-size>;
    }
    
    .container {
      grid-template-columns: 100px 50px 100px;
      grid-template-rows: 80px auto 80px; 
      grid-column-gap: 10px;
      grid-row-gap: 15px;
    }
    

    Grid-Gap

    又一种简写速记:grid-colunm-gap||grid-row-gap

    • <grid-row-gap> <grid-colunm-gap> - Length Value
    .container {
      grid-gap: <grid-row-gap> <grid-column-gap>;
    }
    
    .container {
      grid-template-columns: 100px 50px 100px;
      grid-template-rows: 80px auto 80px; 
      grid-gap: 10px 15px;
    }
    //  如果无设置 grid-row-gap..它的值会设置为grid-column-gap
    

    Justify-Items

    沿着 轴 对齐Grid内的内容。该值适用于Container内的所有Grid Items。

    • start - 将内容对齐到Grid区域的左端
    • end - 将内容对齐到Grid区域的右端
    • center - 将Grid区域中心的内容对齐
    • stretch - 填充Grid区域的整个宽度(这是默认值)
    .container {
      justify-items: start | end | center | stretch;
    }
    

    Align-Items

    沿 轴 对齐Grid内的内容。该值适用于Container内的所有Grid Items。

    • start - 将内容对齐到Grid区域的顶部
    • end - 将内容对齐到Grid区域的底部
    • center - 将Grid区域中心的内容对齐
    • stretch - 填充Grid区域的整个高度(这是默认值)
    .container {
      align-items: start | end | center | stretch;
    }
    

    Justify-Content

    有时,Grid 的总大小可能小于其Grid Container的大小。如果所有Grid-Items都使用非灵活单位(fr)进行调整,就可能发生这种情况px。在这种情况下,可以设置Grid Container 内的Grid的对齐方式。此属性沿着轴对齐Grid.

    • start - 将Grid对齐到Grid Container的左端
    • end - 将Grid对齐到Grid Container的右端
    • center - 将Grid对齐到Grid Container的中心
    • stretch - 调整Grid Items的大小以允许Grid填充Grid Container的整个宽度
    • space-around - 在每个Grid物体之间放置一定量的空间。
    • space-between - 在每个Grid物品之间放置一个均匀的空间。
    • space-evenly - 在每个Grid Items之间放置一个均匀的空间.
    .container {
      justify-content: start | end | center | stretch | space-around | space-between | space-evenly;    
    }
    

    align-content

    justify-content 差不多..
    唯一不同的是 align-content 是设置水平方向

    • start - 将Grid对齐到Container的顶部
    • end - 将Grid对齐到Container的底部
    • center - 将Grid对齐到Container的中心
    • stretch - 调整Grid Items的大小,以允许网格填充Container的整个高度
    • space-around - 在每个Grid物体之间放置一定量的空间。
    • space-between - 在每个Grid物品之间放置一个均匀的空间
    • space-evenly - 在每个Grid-Items之间放置一个均匀的空间。
    .container {
      align-content: start | end | center | stretch | space-around | space-between | space-evenly;  
    }
    

    Grid-auto-columns & Grid-auto-rows

    指定任何自动生成的Grid Track(又名Implicit
    Grid Track
    )的大小。当明确定位超出定义的Grid范围的行或列(通过grid-template-rows/ grid-template-columns)时,会创建Implicit Grid Track。

    • <track-size> - 可以是Grid中的空闲空间的长度,百分比或是小部分(使用fr单位)
    .container {
      grid-auto-columns: <track-size> ...;
      grid-auto-rows: <track-size> ...;
    }
    

    Example :理解 Implicit Grid Track ↓

    .container {
      grid-template-columns: 60px 60px;
      grid-template-rows: 90px 90px
    }
    
    创建2 × 2的Grid

    现在设想使用 grid-columngrid-row 定位这个Grid Items 是:

    // 元素的属性知识.后面有讲,下面数字指 Grid Line 默认名
    .item-a {
      grid-column: 1 / 2;
      grid-row: 2 / 3;
    }
    .item-b {
      grid-column: 5 / 6;
      grid-row: 2 / 3;
    }
    
    Grid-Items

    我们设置 .item -b 从列5行开始,到列6行结束,但是我们没有定义列5或6
    因为引用了不存在的行!所以创建了宽度为0的隐式轨道来填补空白。可以使用grid-auto-columnsgrid-auto-rows指定这些隐式轨道的宽度:

    .container {
      grid-auto-columns: 60px;
    }
    
    Result

    Grid-auto-flow

    如果没有明确放置在Grid上的Grid Items,则自动放置算法会自动放置这些Items。该属性控制自动布局算法的。
    可以理解是一种设置排序方向的属性(默认row
    从左到右,或从上到下的排序[流动方向].)

    • row - 告诉自动布局算法依次填充每行,根据需要添加新行
    • column - 告诉自动布局算法依次填充每列,根据需要添加新列
    • dense - 告诉自动布局算法,如果稍后出现较小的items,则尝试在Grid中的填充空位。(dense 可能导致项目出现乱序)
    .container {
      grid-auto-flow: row | column | row dense | column dense
    }
    
    Example:
    <section class="container">
      <div class="item-a">item-a</div>
      <div class="item-b">item-b</div>
      <div class="item-c">item-c</div>
      <div class="item-d">item-d</div>
      <div class="item-e">item-e</div>
    </section>
    

    定义一个五行两行的Grid,并设置grid-auto-flow为row(默认值):

    .container {
      display: grid;
      grid-template-columns: 60px 60px 60px 60px 60px;
      grid-template-rows: 30px 30px;
      grid-auto-flow: row;
    }
    
    .item-a {
      grid-column: 1;
      grid-row: 1 / 3;
    }
    .item-e {
      grid-column: 5;
      grid-row: 1 / 3;
    }
    

    因为设置了 grid-auto-flow 为 row...Grid会呈现这个样子:


    Row

    如果是设置 grid-auto-flow 为column 那么则会呈现如下:


    Column

    Grid

    简写模式:
    可以设置的属性有:

    grid-template-rows
    grid-template-columns
    grid-template-areas
    grid-auto-rows
    grid-auto-columns
    grid-auto-flow
    grid-column-gap
    grid-row-gap
    

    可设置值:

    • none - 将所有子属性设置为初始值
    • <grid-template-rows>/<grid-template-columns> - 分别设置指定值,并将所有其他属性设置为其初始值
    • <grid-auto-flow>[<grid-auto-rows>[/<grid-auto-columns>]] - 接收所有相同的值 grid-auto-flow, grid-auto-rowsgrid-auto-columns.. 如果省略grid-auto-columns ,那么将其设置为grid-auto-rows指定的值. 如果两者都省略,那他们被设置为它们的初始值.
    .container {
        grid: none | <grid-template-rows> / <grid-template-columns> | <grid-auto-flow> [<grid-auto-rows> [/ <grid-auto-columns>]];
    }
    
    Example:
    .container {
      grid: 200px auto / 1fr auto 1fr;
    }
    //  等于:
    .container {
      grid-template-rows: 200px auto;
      grid-template-columns: 1fr auto 1fr;
      grid-template-areas: none;
    }
    
    Example:
    .container {
      grid: column 1fr / auto;
    }
    //  等于
    .container {
      grid-auto-flow: column;
      grid-auto-rows: 1fr;
      grid-auto-columns: auto;
    }
    

    Grid 也接收一个更复杂 但相当方便的语法来一次性设置所有内容。
    指定grid-template-areas,grid-template-rowsgrid-template-columns 所有其他子属性都设置为其初始值...指定Line名称和Track 大小 与 它们各自的Grid Areas ...

    Example:
    .container {
      grid: [row1-start] "header header header" 1fr [row1-end]
            [row2-start] "footer footer footer" 25px [row2-end]
            / auto 50px auto;
    }
    //  等于:
    .container {
      grid-template-areas: 
        "header header header"
        "footer footer footer";
      grid-template-rows: [row1-start] 1fr [row1-end row2-start] 25px [row2-end];
      grid-template-columns: auto 50px auto;    
    }
    

    父级属性(Grid Container) End


    子元素属性 (Grid Items)

    grid-column-start | grid-column-end | grid-row-start | grid-row-end

    通过引用特定的Grid-Line来确定Grid内Grid的位置。grid-column-start/ grid-row-start是Items开始的行/列,grid-column-end/ grid-row-end是Items结束的行/列。

    • <Number> - 可以是一个数字来引用一个编号的Grid Line,或者一个名称来引用一个命名的Grid Line
    • span <number> - Items 将跨越提供的Grid
      Track 数量
    • span <Name> - Items 将跨越,直到它与提供的名称符合
    • auto - 指示自动放置,自动跨度或默认跨度

    Ps: Items可以相互重叠。可以使用 z-index 来控制其堆叠顺序。

    Example:
    .item-a {
      grid-column-start: 2;
      grid-column-end: five;
      grid-row-start: row1-start
      grid-row-end: 3
    }
    
    Example
    .item-b {
      grid-column-start: 1;
      grid-column-end: span col4-start;
      grid-row-start: 2
      grid-row-end: span 2 // 跨越2个 Grid Track
    }
    
    Example

    grid-column | grid-row

    简写速记分别为grid-column-start+ grid-column-endgrid-row-start+ grid-row-end

    • <start-line> / <end-line> - 每一个都接受相同的值,包括span
    .item {
      grid-column: <start-line> / <end-line> | <start-line> / span <value>;
      grid-row: <start-line> / <end-line> | <start-line> / span <value>;
    }
    
    .item-c {
      grid-column: 3 / span 2;
      grid-row: third-line / 4;
    }
    
    如果没有声明结束行值,则该项目默认跨越1个轨道。

    Grid Areas

    为Items提供一个名称,以便可以通过使用该grid-template-areas属性创建的模板来引用它。
    或者,此属性可以用作grid-row-start+ grid-column-start+ grid-row-end+ grid-column-end的更简短的缩写。

    • <Name> - 选择的名称
    • <row-start> / <column-start> / <row-end> / <column-end>- 可以是数字或命名行
    .item {
      grid-area: <name> | <row-start> / <column-start> / <row-end> / <column-end>;
    }
    
    // 方法一:可为 Items 分配名称
    .item-d {
      grid-area: header
    }
    
    //  方法二: 可作为 row start + column start + row end + column end 的一次性简写
    .item-d {
      grid-area: 1 / col4-start / last-line / 6
    }
    
    grid area 简写

    Justify-self

    沿着轴对齐Grid内的内容。此值适用于单个Grid Items 内的内容。

    • start - 将内容对齐到Grid区域的左端
    • end - 将内容对齐到Grid区域的右端
    • center - 将Grid区域中心的内容对齐
    • stretch - 填充Grid区域的整个宽度(Default)
    .item {
      justify-self: start | end | center | stretch;
    }
    
    Example:
    .item-a {
      justify-self: start;
    }
    

    align-self

    沿轴对齐网格内的内容。此值适用于单个Grid Item内的内容。

    价值观:

    • start - 将内容对齐到Grid区域的顶部
    • end - 将内容对齐到Grid区域的底部
    • center - 将Grid区域中心的内容对齐
    • stretch - 填充Grid区域的整个高度(Default)

    子元素属性 结束——End


    移植地点:Links
    移植地点:Links2

    相关文章

      网友评论

        本文标题:Grid 布局

        本文链接:https://www.haomeiwen.com/subject/wximzxtx.html