【问题标题】:Grid area with responsive not works as expect具有响应性的网格区域无法按预期工作
【发布时间】:2021-11-02 05:27:45
【问题描述】:

:root {
  --min-screen-height:100px;
}

.App {
  display: grid;
  grid-template-columns: 0.7fr 0.9fr 1.5fr 0.9fr;
  grid-template-rows: 2.75rem 3fr;
  grid-template-areas:
    'nav nav nav nav'
    'sidebar leftmenu content rightmenu';
  gap: 0.75rem 0.4rem;
}

.navigation {
  grid-area: nav;
  background-color: yellow;
}

.sidebar {
  min-height: var(--min-screen-height);
  grid-area: sidebar;
  background-color: aliceblue;
}

.leftmenu {
  grid-area: leftmenu;
  background-color: skyblue;
}

.content {
  min-height: var(--min-screen-height);
  grid-area: content;
  background-color: blanchedalmond;
  padding: 0.5em 0.75em 0.5em 0.75em;
}

.rightmenu {
  grid-area: rightmenu;
  background-color: coral;
}

@media screen and (max-width: 768px) {
  .App {
    grid-template-columns: 1fr;
    grid-template-areas:
      'nav'
      'content';
  }
}
  <div class="App">
      <div class="navigation">Nav</div>
      <div class="sidebar">Side bar</div>
      <div class="leftmenu">Left Menu</div>
      <main class="content">Main</main>
      <div class="rightmenu">Right Menu</div>
    </div>

响应直到768px 我只显示navcontainer。但仍然在768 我可以看到rightmenu

这里有什么问题?或者如何解决这个问题?请通过调整大小来查看整页。

【问题讨论】:

  • 这不仅是正确的,而且所有其他人都在那个地方分组。尝试添加.rightmenu { display: none; },你会看到左边的aears。
  • @aerial301,但是其他网格区域怎么会消失呢?要知道,当我不提供grid-area 时,元素是如何出现的?
  • 它们并没有消失,它们只是彼此重叠。将正确元素的不透明度设置为 0.5 之类的值,您将看到它们。显然grid-template-areas 没有隐藏任何指定的元素。

标签: css css-grid


【解决方案1】:

https://www.w3.org/TR/css-grid-2/#explicit-grids

grid-template-rows、grid-template-columns 和 grid-template-areas 这三个属性共同定义了一个网格容器的显式网格,通过指定其显式网格轨迹。由于放置在显式网格之外的网格项,最终网格可能会变大;在这种情况下将创建隐式轨道,这些隐式轨道将由 grid-auto-rows 和 grid-auto-columns 属性调整大小。

grid-auto-flow 属性控制网格项的自动放置,无需明确位置。一旦显式网格被填充(或者如果没有显式网格),自动放置也会导致隐式网格轨迹的生成。

所以grid-template-areas 定义了显式网格。其余区域被置于隐式网格中。
要摆脱这些元素,您可能会使用:

      @media screen and (max-width: 768px) {
        .App {
          grid-template-columns: 1fr;
          grid-template-areas: "nav" "content";
        }
        .App :not(.navigation, .content) {
          display: none;
        }
      }

【讨论】:

    【解决方案2】:

    所有 div 仍然存在,因此网格会尽力容纳它们,尽管它们说它们位于未定义的网格区域中。

    要完全摆脱它们,您需要将它们设置为在媒体查询中不显示。

    :root {
      --min-screen-height: 100px;
    }
    
    .App {
      display: grid;
      grid-template-columns: 0.7fr 0.9fr 1.5fr 0.9fr;
      grid-template-rows: 2.75rem 3fr;
      grid-template-areas: 'nav nav nav nav' 'sidebar leftmenu content rightmenu';
      gap: 0.75rem 0.4rem;
    }
    
    .navigation {
      grid-area: nav;
      background-color: yellow;
    }
    
    .sidebar {
      min-height: var(--min-screen-height);
      grid-area: sidebar;
      background-color: aliceblue;
    }
    
    .leftmenu {
      grid-area: leftmenu;
      background-color: skyblue;
    }
    
    .content {
      min-height: var(--min-screen-height);
      grid-area: content;
      background-color: blanchedalmond;
      padding: 0.5em 0.75em 0.5em 0.75em;
    }
    
    .rightmenu {
      grid-area: rightmenu;
      background-color: coral;
    }
    
    @media screen and (max-width: 768px) {
      .App {
        grid-template-columns: 1fr;
        grid-template-areas: 'nav' 'content';
      }
      .sidebar,
      .rightmenu,
      .leftmenu {
        display: none;
      }
    }
    <div class="App">
      <div class="navigation">Nav</div>
      <div class="sidebar">Side bar</div>
      <div class="leftmenu">Left Menu</div>
      <main class="content">Main</main>
      <div class="rightmenu">Right Menu</div>
    </div>

    【讨论】:

    • 是的,它会起作用的。这不过是我们所做的正常过程。那么保持grid-area..的意思是什么
    • 抱歉,我不明白“保留网格区域的含义是什么”。
    • 我认为'grid-area'用适当的元素定义了屏幕区域。
    • 似乎如果还有其他没有定义网格模板区域的元素,系统会以某种方式尽可能地适应它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多