嵌套CSS网格是不好的做法吗?

时间:2018-09-06 22:29:22

标签: html css angular grid css-grid

我正在尝试使用组件驱动的前端框架(例如Angular),最后学习CSS Grid。

我的问题是嵌套 CSS Grids是不明智的做法吗?

我在这里所做的是在我的主/根组件中,我已经使用css网格来完成两件事:导航栏和主要内容区域,因为导航栏将出现在整个应用程序以及主要内容中。

如下所示,在根级别上是网格,然后在<nav-bar>组件中是另一个网格。并且在主要内容区域中,我使用的每个/任何Angular组件中还会有更多的网格,可能是网格。

**********************    ******************************
*       Navbar       * => * img | nav         | logout *
**********************    ******************************
**********************
*                    *
*       Content      *
*                    *
**********************

下面的示例代码:

app.component.html

<div class="container">

    <div class="item-navbar"></div>

    <div class="item-nav">
        <nav-bar></nav-bar>
    </div>

    <div class="item-content">
        <router-outlet></router-outlet>
    </div>

</div>

With this CSS: 
.container {
    display: grid;
    grid: ". nav ." 
        ". content ."
        / 3vh auto 3vh;
    row-gap: 1vh;
}

.item-navbar {
    grid-area: 1 / 1 / 2 / 4;
    position: relative;
    z-index: -1;
    background: #579C87;
    box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);
}

.item-nav {
    grid-area: nav;
}

.item-content {
    grid-area: content;
    background: #D1C7B8;
    box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);
}

然后 nav-bar.component.html

<nav class="navbar" role="navigation" aria-label="main navigation">

    <div class="navbar-brand">
        <a class="navbar-item" routerLink="/">
            <div class="img">
                <img src="logo.jpg">
            </div>
        </a>
    </div>

    <div class="navbar-menu">
        <a routerLink="/dashboard" class="navbar-item">Dashboard</a> 
    </div>

    <div class="navbar-logout">
        <a routerLink="/logout" class="navbar-item">Logout</a> 
    </div>
</nav>

with this CSS: 
.navbar {
    display: grid;
    grid-template-columns: 64px auto auto;
    grid-template-rows: auto;
    grid-template-areas: "image navs logout";
    gap: 1vh;
}

.navbar-brand {
    grid-area: image;
    place-self: center / start;
}

.navbar-menu {
    grid-area: navs;
    place-self: center start;
}

.navbar-logout {
    grid-area: logout;
    place-self: center end;
}

4 个答案:

答案 0 :(得分:4)

嵌套网格容器没有错或无效。 grid specification既不禁止也不反对这种做法。

实际上,规范says this

  

网格容器可以根据需要嵌套或与flex容器混合以创建更复杂的布局。

嵌套网格容器是将网格属性应用于顶级容器的后代所必须执行的操作,因为网格布局仅在父元素和子元素之间起作用。

更多详细信息在这里:

答案 1 :(得分:2)

要回答您的问题,嵌套网格或弹性组件是一种可接受的做法:csswg

下面是一个演示嵌套网格的示例:gridbyexample

答案 2 :(得分:2)

这不是一个坏习惯,建议正确显示。

我要提一个警告,将每个嵌套级别分离到自己的文件中以进行调试。当嵌套多个级别时,单个</div>丢失或放错位置会大大改变输出,并且很难调试。我的建议是,任何进一步的嵌套也应分为单独的组件,以便每个级别都可以独立测试。

答案 3 :(得分:1)

嵌套网格容器是可以接受的做法。