日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

CSS Grid構(gòu)建圣杯布局

 quasiceo 2016-08-03

小編推薦:掘金是一個(gè)高質(zhì)量的技術(shù)社區(qū),從 ECMAScript 6 到 Vue.js,性能優(yōu)化到開源類庫,讓你不錯(cuò)過前端開發(fā)的每一個(gè)技術(shù)干貨。各大應(yīng)用市場搜索「掘金」即可下載APP,技術(shù)干貨盡在掌握中。

CSS 網(wǎng)格布局模塊,雖然現(xiàn)在仍處于編譯者的草案之中但是即將定稿。我們現(xiàn)在可以在一些瀏覽器中進(jìn)行測試并可以檢測其潛在的bug。

有關(guān)于CSS Grid布局模塊更多的教程,可以點(diǎn)擊這里閱讀

CSS 網(wǎng)格布局是真的很復(fù)雜,相較于 Flexbox 更是如此。它具有17個(gè)新屬性并且在如何使用CSS書寫方面介紹了很多新概念。為了嘗試如何使用縈繞在我腦海中的這些新規(guī)范,我決定創(chuàng)建一個(gè)圣杯布局嘗試新規(guī)范工作原理。

什么是圣杯布局?

圣杯布局是一種包括頁眉、頁腳和一個(gè)包含兩個(gè)左右邊欄的主內(nèi)容區(qū)的網(wǎng)頁布局。其布局遵循以下規(guī)則:

  • 固定寬度側(cè)邊欄自適應(yīng)主內(nèi)容區(qū)域
  • 中間一列應(yīng)該在標(biāo)記中最先出現(xiàn),早于兩個(gè)側(cè)邊欄(但在頁眉后)
  • 不管三列中包含的是什么,都應(yīng)該具有相同的高度
  • 頁腳應(yīng)該總是處于瀏覽器視窗的底部,即使內(nèi)容不能填滿視區(qū)高度
  • 布局應(yīng)該是響應(yīng)的,在小視窗中所有的部分應(yīng)該在一列中顯示

大家都知道如果不使用hacks這是很難用CSS來實(shí)現(xiàn)的。

CSS Grid解決方案

下面是我用 CSS 網(wǎng)格布局想出的的解決方案。第一,標(biāo)記--

<body class="hg">  
    <header class="hg__header">Title</header>
    <main class="hg__main">Content</main>
    <aside class="hg__left">Menu</aside>
    <aside class="hg__right">Ads</aside>
    <footer class="hg__footer">Footer</footer>
</body>  

CSS樣式的代碼只有 31 行:

.hg__header {
    grid-area: header;
}
.hg__footer {
    grid-area: footer;
}
.hg__main {
    grid-area: main;
}
.hg__left {
    grid-area: navigation;
}
.hg__right {
    grid-area: ads;
}
.hg {
    display: grid;
    grid-template-areas: "header header header"
                         "navigation main ads"
                         "footer footer footer";
    grid-template-columns: 150px 1fr 150px;
    grid-template-rows: 100px 
                        1fr
                        30px;
    min-height: 100vh;
}
@media screen and (max-width: 600px) {
    .hg {
        grid-template-areas: "header"
                             "navigation"
                             "main"
                             "ads"
                             "footer";
        grid-template-columns: 100%;
        grid-template-rows: 100px 
                            50px 
                            1fr
                            50px 
                            30px;
    }
}

Grid構(gòu)建圣杯布局

把它分解

如前所述,CSS 網(wǎng)格布局可能非常復(fù)雜。然而,創(chuàng)建此布局我只用 17 個(gè)新屬性中的4個(gè):

  • grid-area
  • grid-template-areas
  • grid-template-columns
  • grid-template-rows

使用這些 CSS 網(wǎng)格屬性創(chuàng)建圣杯布局可以分解成五個(gè)步驟。

定義網(wǎng)格

我們想要做的第一件事是定義網(wǎng)格區(qū)域,創(chuàng)建網(wǎng)格時(shí)我們可以引用它們的別名。這里用到的是grid-area屬性。

.hg__header {
    grid-area: header;
}
.hg__footer {
    grid-area: footer;
}
.hg__main {
    grid-area: main;
}
.hg__left {
    grid-area: navigation;
}
.hg__right {
    grid-area: ads;
}

然后,使用grid-template-areas屬性,我們可以真正直觀的指定網(wǎng)格的布局。grid-template-areas屬性接受一個(gè)以空格分隔的字符串。每個(gè)字符串表示一行,利用每個(gè)字符串,我們就可以獲取以一個(gè)空格分隔的網(wǎng)格區(qū)域列表值,每一個(gè)值均定義網(wǎng)格區(qū)域的一列。所以如果我們要跨越兩列區(qū)域,我們需要定義兩次。

在我們圣杯布局中有 33 行。頁眉和頁腳行跨越 3 列,其他跨越 1 列。

.hg {
    display: grid;
    grid-template-areas: "header header header"
                         "navigation main ads"
                         "footer footer footer";
}

利用此標(biāo)記我們可以得到以下結(jié)果。

Grid構(gòu)建圣杯布局

定義列寬

接下來,我們想要定義列的寬度。這里我們利用grid-template-columns屬性定義列的寬度。此屬性接受一個(gè)空格分隔的寬度列表,每一個(gè)值均表示網(wǎng)格中的一列。因?yàn)樵谖覀兊牟季种杏?code>3列,我們可以指定3個(gè)寬度:

grid-template-columns: [column 1 width]  [column 2 width]  [column 3 width];  

對于圣杯布局,我們想要將2個(gè)側(cè)欄的寬度設(shè)置為150px

.hg {
    grid-template-columns: 150px  [column 2 width] 150px;
}

對于中間列,我們想要其占據(jù)其余的全部空間。這里我們可以使用新單位fr。這個(gè)單位表示網(wǎng)格中剩余的全部空間。在我們的例子表示網(wǎng)格減去300px(兩個(gè)側(cè)邊欄的寬度)后的寬度。

.hg {
    grid-template-columns: 150px 1fr 150px;
}

設(shè)置完網(wǎng)格列之后, 布局看起來如下所示-

Grid構(gòu)建圣杯布局

定義行高

接下來,我們就要定義行的高度了。類似于我們用grid-template-columns屬性定義列的寬度,我們使用grid-template-rows屬性定義行高。此屬性也是接受以空格分隔的一行高度列表。雖然我們可以把它寫在同一行中,但是我認(rèn)為為了使其更加清晰直觀將一值寫一行。

.hg {
    grid-template-rows: 100px
                        1fr
                        30px;
}

所以布局中的頁眉高度為100px,頁腳高度為30px,中間一行(主要內(nèi)容和兩個(gè)側(cè)邊欄)占據(jù).hg元素中其余的可用空間。

Grid構(gòu)建圣杯布局

定位頁腳

在圣杯布局中,即使頁面內(nèi)容十分稀疏,我們也想要頁腳總是處于視窗的底部。要實(shí)現(xiàn)這一目標(biāo),我們可以在.hg元素中設(shè)置一個(gè)最小的視窗高度。

.hg {
    min-height: 100vh;
}

因?yàn)槲覀儗⒅虚g一列的寬度和高度設(shè)置為占據(jù).hg元素的剩余空間,所以它就會(huì)適應(yīng)于整個(gè)屏幕。

Grid構(gòu)建圣杯布局

響應(yīng)式

最后,我們想要布局具有響應(yīng)性。在較小的設(shè)備上所有網(wǎng)格項(xiàng)應(yīng)該一個(gè)接一個(gè)的以單列顯示。為此,我們需要重新定義之前的-grid-template-areasgrid-template-columnsgrid-template-rows3個(gè)屬性.

首先,我們想要所有的網(wǎng)格項(xiàng)按照特定順序在一列中顯示:

@media screen and (max-width: 600px) {
    .hg {
        grid-template-areas: "header"
                             "navigation"
                             "main"
                             "ads"
                             "footer";
    }
}

接下來,我們想要所有的網(wǎng)格項(xiàng)跨越整個(gè)寬度:

@media screen and (max-width: 600px) {
    .hg {
        grid-template-columns: 100%;
    }
}

最后,我們需要重置每個(gè)行的高度。除了main之外的所有行都有一個(gè)已定義的高度:

@media screen and (max-width: 600px) {
    .hg {
        grid-template-rows: 100px /* Header */
                            50px /* Navigation */
                            1fr /* Main Content */
                            50px /* Ads */
                            30px; /* Footer */
    }
}

Grid構(gòu)建圣杯布局

就是這樣!你可以看看這里的演示以及源碼(nb:你可能需要在瀏覽器中啟用網(wǎng)絡(luò)功能才可以看到)。

瀏覽器支持

本文根據(jù)@Ire Aderinokun的《The Holy Grail Layout with CSS Grid》所譯,整個(gè)譯文帶有我們自己的理解與思想,如果譯得不好或有不對之處還請同行朋友指點(diǎn)。如需轉(zhuǎn)載此譯文,需注明英文出處:http:///holy-grail-layout-css-grid/。

靜子

在校學(xué)生,本科計(jì)算機(jī)專業(yè)。一個(gè)積極進(jìn)取、愛笑的女生,熱愛前端,喜歡與人交流分享。想要通過自己的努力做到心中的那個(gè)自己。微博:@靜-如秋葉

如需轉(zhuǎn)載,煩請注明出處:http://www./css3/holy-grail-layout-css-grid.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多