【问题标题】:CSS Grid Layout 2 * 3 with multilevel groups具有多级组的 CSS 网格布局 2 * 3
【发布时间】:2017-08-05 22:41:38
【问题描述】:

我尝试使用 CSS 网格布局创建具有未定义行数(有时为 2,有时为 3)的两列布局 [参数 - 渲染]。

无论行数如何,渲染列都有特定的背景,但列之间的行高相等。我想我需要添加另一个标签来做到这一点。

我给你这个布局的截图。这是我能举出的更好的例子。粉红色的框是网格布局。对于“渲染”列,我有一个可以在 CSS 中创建的特定背景(白色和阴影)。我不想为此使用图片。

看来我想做的就是这个例子隐式命名网格线https://gridbyexample.com/examples/example22/

【问题讨论】:

  • 您可以使用felxbox 来满足您的要求。
  • 行高是否等于内容?列的宽度是多少?是否需要支持 IE/Edge?
  • 行不相等,并且关于内容是自动的。列的宽度将接近 20%(参数)/80%(渲染)。我不需要支持 IE,但如果可能的话,Edge 会很棒。
  • @BenoitHenry 支持 Edge 的 CSS 网格布局与 IE 相同(使用旧规范)。也许将来会有所改变。如果您对我对其他浏览器的回答感到满意,我将添加将我的布局用于 IE/Edge 的方法。
  • 它也可以在没有 grid-template-areas 的情况下工作:演示:codepen.io/gc-nomade/pen/xLRvwx(悬停在它的行增长)

标签: html css css-grid


【解决方案1】:

我终于找到了一种方法,但我并没有真正使用我的代码。 我必须在网格的每个元素上添加计数器修饰符才能将其放在正确的空间上。

HTML:

<main class="render render--2 container">
    <div class="render__view--bg"></div>

    <div class="render__params render__params--1">
        <span class="font-name">Maven Pro</span>
    </div>

    <div class="render__view render__view--1">
        <h1>Lorem ipsum dolor sit amet consectetur adipiscing elit.</h1>    </div>


    <div class="render__params render__params--2">
        <span class="font-name">Quintessential</span>
    </div>

    <div class="render__view render__view--2">
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce egestas vestibulum mauris, id accumsan dolor. Fusce interdum sit amet purus et imperdiet. Nulla porta tortor ante, a cursus nisi varius vitae. Maecenas eu faucibus velit. Sed varius nulla ac facilisis tempus. Vestibulum aliquet varius consequat. Nullam augue dui, auctor non vehicula quis, eleifend et ex. Curabitur sit amet purus rutrum, rhoncus est non, ornare ex. Aenean lobortis nibh ut ante vestibulum ornare. Maecenas posuere odio nec mollis consectetur. Quisque non leo nec quam congue commodo eu non est.</p>

<p>In sit amet nisi urna. Integer vehicula massa quis risus tristique, eu condimentum metus fringilla. Nunc ex ipsum, suscipit eget ullamcorper ut, faucibus non risus. Fusce consectetur risus nec tellus malesuada posuere. Curabitur quam libero, efficitur at malesuada a, venenatis in lectus. Ut aliquam auctor ullamcorper. In pretium, elit vel mollis ultrices, sem leo dignissim turpis, in blandit nunc dui et leo.</p>

<p>Suspendisse potenti. Sed sit amet velit id nunc placerat aliquet et in quam. Praesent eu laoreet felis. Nulla non nibh libero. Nulla in tellus ac mauris lacinia vulputate ac vitae mi. Pellentesque eleifend non massa id pellentesque. Nam fermentum, ante eget consectetur sodales, dui augue faucibus justo, eu posuere est sapien eu sapien.</p>    </div>

</main>

还有 CSS :

//CSS Grid
.render{
    display: grid;
    grid-gap: 10px;
    grid-template-columns: 20% 80%;

    &.render--2{
        grid-template-rows: auto auto;
        grid-template-areas: 
    "params view"
    "params view";
    }

    &.render--3{
        grid-template-rows: auto auto auto;
        grid-template-areas: 
    "params view"
    "params view"
    "params view";
    }

    .render__view--bg{
        z-index: 1;
        grid-column: view-start / view-end;
    grid-row: view 1 / view 3;
        background: #fff none;
        box-shadow: 0 8px 20px rgba(0,0,0,.1);
    }

    .render__params,
    .render__view{
        padding: 16px;
        z-index: 2;
    }

    .render__params{
        grid-column: params / span 1;

    &--1{
          grid-row: params 1;
    }

    &--2{
          grid-row: params 2;
    }

    &--3{
          grid-row: params 3;
    }
    }

    .render__view{
        grid-column: view / span 1;

        &--1{
          grid-row: view 1;
    }

    &--2{
          grid-row: view 2;
    }

    &--3{
          grid-row: view 3;
    }
    }
}

这是Codepen preview

感谢大家的帮助!

【讨论】:

    【解决方案2】:

    不要指定行高,因为默认情况下会使用自动高度创建它们。添加带有背景的绝对定位伪元素以将背景添加到右列并保留元素自动放置。

    .grid {
      box-sizing: border-box;
      display: grid;
      
      /* get 20% and remaining width for columns */
      grid-template-columns: 20% 1fr;
      
      /* gap between rows and columns */
      grid-gap: 15px;
      
      /* just styles for demo */
      color: #ada0b9;
      padding: 40px;
      
      position: relative;
    }
    
    .grid__item {
      padding: 30px;
    }
    
    .grid__item--params {
      background-color: #e8d7eb;
    }
    
    .grid__item--render {
      background-color: #f8e7fb;
    }
    
    .grid:after {
      content: "";
      position: absolute;
      
      /* also add padding to positioning values */
      left: calc(20% + 40px);
      right: 40px;
      bottom: 40px;
      top: 40px;
      
      /* add negative to prevent content overlapping */
      z-index: -1;
      
      /* add needed background styles here */
      background: lime none;
      box-shadow: 0 8px 20px rgba(0,0,0,.1); 
    }
    <div class="grid">
      <div class="grid__item grid__item--params">Params#1</div>
      <div class="grid__item grid__item--render">Render#1</div>
      <div class="grid__item grid__item--params">Params#2</div>
      <div class="grid__item grid__item--render">Render#2</div>
      <div class="grid__item grid__item--params">Params#3</div>
      <div class="grid__item grid__item--render">Render#3</div>
    </div>

    【讨论】:

    • 感谢您的回答。我遇到的问题是,无论行如何,整个渲染列都只有一个渲染。这就是为什么我认为我可以在 .grid__item--render 元素之前添加另一个 div 元素来模拟这个“组”。
    • @BenoitHenry 对不起,我不明白你的要求。您能否提供一些您的问题的小提琴(例如 jsFiddle)。
    • 我用第二个例子编辑了我的帖子。希望它会帮助你。你的 HTML 结构没问题。我只是认为我需要添加一个新的 div.grid__item--renderbackground 以在整个“渲染”列上添加一个空白和阴影背景。
    • @BenoitHenry 我只是为此而为整个网格缠绕和背景。
    • 对不起,我不明白你的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多