将不连续的内容块扩展到 XL 屏幕上的侧边栏,而无需复制源代码块

Jar*_*rad 6 html css flexbox bootstrap-4

我只是不确定如何做我想要实现的目标。

前置上下文

  1. sheriffderek 在下面的回答似乎是用 css grid 解决这个问题的一个很好的尝试。这种方法的一个缺点是,当内容被添加到 XL 屏幕上的配置文件块时,它会影响该行中的其他单元格,从而导致大的空白。是的,您可以向grid-template-areas布局添加更多行,但我的内容将是可变高度,因此此解决方案似乎可能会导致意外的空白,具体取决于内容。
  2. 鉴于我不复制代码块的限制,我开始认为这不能用纯 Bootstrap 4 和 CSS 解决。
  3. 我有多年的 CSS/HTML。无论如何,我都不是初学者。我不想讨论我的学习旅程“应该”是什么。我使用 Bootstrap 4 有几个对我很重要的原因。我会要求回答者关注这个问题的具体要求。

相关背景

  1. 我正在使用 Bootstrap 4。我更喜欢纯 Bootstrap 4 解决方案(如果可能)。来自 Bootstrap 4 的 Flex 类 OK。在这一点上,我会直接使用 CSS 和 flexbox,如果它能满足我的要求。
  2. 我有一个固定的左侧边栏。我会在小屏幕上隐藏它。左侧边栏不是这个问题的重点;当屏幕宽度在 768 和更大之间时,焦点位于中列和右列。
  3. 在768(MD分钟)之间的屏幕尺寸- 1199(LG最大值),内容块(“卡低位侧”)坐镇之间一个搜索栏,内容块(顶部)和一个主内容区域(如下图)。当屏幕尺寸缩放到 1200px (xl) 或更大时,我希望“Cards Lower Sidebar”块弹出到右侧边栏
  4. 在 768 (md min) - 1199 (lg max) 之间的屏幕宽度上,配置文件内容块位于“主要内容区域”下方。当屏幕缩放到 1200 像素 (xl) 或更大时,我希望此内容块弹出到 “卡片下侧边栏”上方右侧边栏。
  5. 我的要求是,我不能重复 HTML 源代码块两次。例如:在源中复制配置文件块两次,并根据媒体查询的屏幕大小显示一个或另一个不显示。

图1

在下图中,“卡片下部侧边栏”位于搜索框区域和“主要内容区域”之间。当屏幕转换为 xl (1200px) 时,“卡片下侧边栏”内容块会弹出,成为右下侧边栏区域。搜索框和主要内容区域保持原样。

个人资料区域弹出成为右上角的侧边栏区域。

我什至不知道这是否可能。

lg到xl的过渡

之前(lg 屏幕)

大屏幕

之后(xl 屏幕)

超大屏幕

我不想用我尝试过的许多错误的事情来混淆这个问题。我已经尝试了很多。

这是最小的示例代码:

html {
    height: 100%;
}
body {
    min-height: 100%;
    padding-top: 56px;
}

.sidebar {
    display: none;
}

@media (min-width: 768px) {
    .main {
        padding-left: 370px;
    }

    .sidebar {
        position: fixed;
        width: 350px;
        top: 56px;
        bottom: 0;
        left: 0;
        z-index: 1000;
        display: block;
        padding: 20px;
        overflow-x: hidden;
        overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */
        background-color: #f5f5f5;
        border-right: 1px solid #eee;
    }
}

#profile-img {
    width: 150px;
    height: 150px;
    background-color: #c9c9c9;
}
Run Code Online (Sandbox Code Playgroud)
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
        <title>Responsive Scalable Layout</title>
        <link rel="stylesheet"
              href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
              integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm"
              crossorigin="anonymous">
        <link rel="stylesheet" href="css/custom2.css">
    </head>
    <body>
        
        <nav class="navbar navbar-expand-md navbar-light bg-light fixed-top">
            <a class="navbar-brand" href="#">Navbar</a>
            <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav"
                    aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
            </button>
            <div class="collapse navbar-collapse" id="navbarNav">
                <ul class="navbar-nav">
                    <li class="nav-item">
                        <a class="nav-link" href="#">Link</a>
                    </li>
                </ul>
            </div>
        </nav>
        
        <div class="container-fluid">
            <div class="row">
                <div class="sidebar">
                    <h1>Left Sidebar</h1>
                </div>
                <div class="col-sm-12 main">
                    
                    <div id="breadcrumbs">
                        <nav aria-label="breadcrumb">
                            <ol class="breadcrumb">
                                <li class="breadcrumb-item">
                                    <a href="#">Home</a>
                                </li>
                                <li class="breadcrumb-item">
                                    <a href="#">Library</a>
                                </li>
                                <li class="breadcrumb-item active" aria-current="page">Data</li>
                            </ol>
                        </nav>
                    </div>
                    
                    <div id="search">
                        <div class="input-group mb-3">
                            <input type="text" class="form-control" placeholder="Search..."
                                   aria-label="Recipient's username" aria-describedby="button-addon2">
                            <div class="input-group-append">
                                <button class="btn btn-outline-secondary" type="button" id="button-addon2">Button
                                </button>
                            </div>
                        </div>
                    </div>
                    
                    <div id="cards-block">
                        <div class="card">
                            <div class="card-body">
                                <h5 class="card-title">Card title</h5>
                                <h6 class="card-subtitle mb-2 text-muted">Card subtitle</h6>
                                <p class="card-text">Some quick example text to build on the card title and make up
                                    the bulk of the card's content.
                                </p>
                                <a href="#" class="card-link">Card link</a>
                                <a href="#" class="card-link">Another link</a>
                            </div>
                        </div>
                        <div class="card">
                            <div class="card-body">
                                <h5 class="card-title">Card title</h5>
                                <h6 class="card-subtitle mb-2 text-muted">Card subtitle</h6>
                                <p class="card-text">Some quick example text to build on the card title and make up
                                    the bulk of the card's content.
                                </p>
                                <a href="#" class="card-link">Card link</a>
                                <a href="#" class="card-link">Another link</a>
                            </div>
                        </div>
                    </div>
                    
                    <div id="content" class="border rounded">
                        <div class="p-2">
                            <h1>Main Content</h1>
                            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusantium aspernatur aut
                                debitis ipsa maiores molestiae qui suscipit vitae? Accusamus consequatur consequuntur
                                corporis cumque delectus, deserunt dolor doloremque dolorum eaque enim esse facere
                                facilis illo impedit incidunt ipsa laborum molestiae natus nihil praesentium quia quis
                                quo repellat repudiandae, rerum suscipit tempore totam velit voluptatem voluptatum?
                                Accusamus alias aliquam aperiam consectetur doloremque iste labore recusandae sed.
                                Accusamus accusantium ad beatae cumque deserunt eaque hic ipsum laudantium, magni
                                minima odit quas quos tempore tenetur voluptas. A, adipisci autem deserunt ducimus est
                                facilis fugiat itaque iusto minus, nam, nobis quas rerum sint totam voluptatum?
                            </p>
                        </div>
                    </div>
                    
                    <div class="border rounded" id="profile">
                        <div class="card p-2">
                            <div id="profile-img"></div>
                            <div class="card-body">
                                <h5>Profile</h5>
                            </div>
                        </div>
                    </div>
                    
                </div>
            </div>
        </div>
        
        <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"
                integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN"
                crossorigin="anonymous"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"
                integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q"
                crossorigin="anonymous"></script>
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"
                integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl"
                crossorigin="anonymous"></script>

    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

注意:我不久前发布了一个类似的问题,但我回答了我自己的问题,我自己的回答很差。长话短说,我不能在 Django 中重复一个内容块两次(在模板中抛出重复的标签错误)。因此,我想为此找到一个解决方案,该解决方案不会在 HTML 中两次复制相同的代码块。

更新

谦虚恭敬地回答如下:

  1. 将真实内容输入内容块时失败(例如:主要内容可以包含短内容或长内容)
  2. 建议使用 CSS 网格,但不要解决 XL 屏幕上的配置文件区域和卡片之间的间隙。

案例:

在此处输入图片说明

更新最终版:

@focus.style 提供了解决此问题要求的最完整和创新的答案。特别感谢@sherrifdereck 等,因为它激励我深入研究响应式 CSS 设计。

she*_*rek 5

我要做的第一件事就是确定碎片。

(我打了很长时间……但 CSS 网格很神奇!)

大布局

超大布局

因此,您可以确保这些部分不会发生冲突。现在,你在这里(可能)有一些疯狂的技巧和利润魔法...... - 但可能不是/所以,这是 CSS 网格来救援的时候了。这就是它的用途!

第一部分:https : //codepen.io/sheriffderek/pen/8e7bf2469b0cd16515f1278fa0519eea?editors=1100

您可能也应该在中等断点处做一些事情......

第二部分:https : //codepen.io/sheriffderek/pen/3d57b839cf62d00b4bdc46af698218ca?editors=1100

第三部分:https : //codepen.io/sheriffderek/pen/215e14b16e1a8af05bce4ab236dab465

<header>
    <nav>
        app header / nav-bar
    </nav>
</header>

<aside class="sidebar">
    sidebar
</aside>

<nav class="actions">
    bread-crumbs and search
</nav>

<section class="cards">
    cards
</section>

<main>
    main stuffs
</main>

<aside class="profile">
    profile stuff
</aside>
Run Code Online (Sandbox Code Playgroud)

.

* {
    box-sizing: border-box;
}

body {
    margin: 0;
}

header {
    border: 5px solid lightblue;
    padding: 10px;
}

.sidebar {
    border: 5px solid #ff0066;
    padding: 10px;
}

.actions {
    border: 5px solid lime;
    padding: 10px;
}

.cards {
    border: 5px solid orange;
    padding: 10px;
}

main {
    border: 5px solid yellow;
    padding: 10px;
}

.profile {
    border: 5px solid black;
    padding: 10px;
}

/* with flex-box... you COULD reorder these a bit on small screens if you wanted */


/* your 'medium' size */
@media (min-width: 600px) {

}

/* your 'large' size */
@media (min-width: 900px) {
    
    body { /* look! it's like a little drawing of the layout!" */
        display: grid;
        grid-template-areas: 
            "header header header"
            "sidebar  actions  actions"
            "sidebar  cards    cards"
            "sidebar  main     main"
            "sidebar profile  profile";
    }

    header {
        grid-area: header; /* note! no quotes " " */
    }

    .sidebar {
        grid-area: sidebar;
    }

    .actions {
        grid-area: actions;
    }

    .cards {
        grid-area: cards;
    }

    main {
        grid-area: main;
    }

    .profile {
        grid-area: profile;
    }
}

/* your 'extra-large' size */
@media (min-width: 1300px) {
    body { /* look! it's another drawing of the layout!" */
        display: grid;
        grid-template-areas: 
            "header   header   header  header"
            "sidebar  actions  actions profile"
            "sidebar   main     main   cards"
            "sidebar   main     main   cards";
    }
}
Run Code Online (Sandbox Code Playgroud)

疯狂的!对!???

注意:请记住,还有更多问题,这肯定是快乐路径示例。您可能在内容父级上有一个最大宽度 - 并且事情可能会根据您在每个区域中放置的内容而改变 - 但这应该可以帮助您前进。


foc*_*yle 5

这是如何使用 99% Bootstrap 解决此任务的示例(.break无论如何必须添加一个额外的类)。我这样做是因为我很好奇 BS 是否可以处理它。

html {
  height: 100%;
}

body {
  height: 100%;
}

.break {
  flex-basis: 100%;
  width: 0;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.min.js"></script>

<div class="bg-primary">Navbar</div>
<div class="d-flex flex-wrap flex-column h-75">
  <div class="col-3 flex-fill bg-danger">Fixed</div>
  <div class="break"></div>
  <div class="col-lg-6 col-9 flex-fill flex-grow-0 bg-success order-1">Search</div>
  <div class="col-lg-3 col-9 flex-fill bg-warning order-lg-4 order-1">Cards Lower Sidebar</div>
  <div class="col-lg-6 col-9 flex-fill bg-info order-1">Main Content Area</div>
  <div class="col-lg-3 col-9 flex-fill flex-grow-0 bg-dark order-lg-3 order-1">User</div>
  <div class="break order-2"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

或者在Codepan 上,以动态方式查看它。

更新

我已经测试了所有答案,确实没有针对此任务的简单 CSS 解决方案。但!在您使用 Bootstrap 4 时登录 - 我没有看到使用 jQuery 的任何障碍。干得好。一个防弹的答案,现在可以正常工作。那天并没有提供任何一个额外的 CSS。

transferBlocks(); // calling function

window.addEventListener('resize', () => {
  transferBlocks(); // calling function on resize
});

function transferBlocks() {
  if ($(window).width() < 992) { /* checking for bootstrap LG breakpoint */
    // placing #cardsLowerSidebar and #user in center column
    $('#search').after($('#cardsLowerSidebar'));
    $('#mainContentArea').after($('#user'));
  } else {
    // placing #cardsLowerSidebar and #user in right column
    $('#colRight').append($('#user'));
    $('#colRight').append($('#cardsLowerSidebar'));
  }
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.min.js"></script> 

<div class="d-flex flex-nowrap flex-column min-vh-100">
  <div class="bg-primary">Navbar</div>
  <div class="flex-fill d-flex flex-nowrap">
    <div class="col-3 px-0 bg-danger">Fixed</div>
    <div class="col-lg-6 col-9 px-0 d-flex flex-nowrap flex-column">
      <div id="search" class="bg-success">Search</div>
      <div id="cardsLowerSidebar" class="flex-fill bg-warning">Cards Lower Sidebar</div>
      <div id="mainContentArea" class="flex-fill bg-info">Main Content Area Main Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content Area</div>
      <div id="user" class="bg-dark">User<br>Subuser</div>
    </div>
    <div id="colRight" class="col-lg-3 px-0 d-flex flex-nowrap flex-column">
    </div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

或者在Codepan 上,以动态方式查看它。

更新 2

Bootstrap 和display: grid自由形式 JS 的组合。它也很有用。

对于宽度超过 992 像素的屏幕,假设我们有grid2 列和 24 行。

第一列由#searchwith grid-row: 1 / span 1;(从间隙 #1 开始,跨越 1 行)和#mainContentAreawith grid-row: 2 / span 23;(从间隙 #2 开始,跨越 23 行)组成。1+23=24 行。

第二列由#userwith grid-row: 1 / span 2; (从间隙 #1 开始,跨越 2 行,高于#search) 和#cardsLowerSidebarwith grid-row: 3 / span 22;(从间隙 #3 开始,跨越 22 行,因为#user跨越 2 行不同于#search)。2+22=24 行。

24 行不是常数,可以使用其他值。在这里,它需要设置#cardsLowerSidebar#mainContentArea与 gossible 一样高。

更多关于Grid Row

.d-grid {
  display: grid;
  grid-template-columns: 2fr 1fr;
  grid-auto-rows: auto;
}

#search {
  order: 1;
  grid-row: 1 / span 1;
}

#cardsLowerSidebar {
  order: 4;
  grid-row: 3 / span 22;
}

#mainContentArea {
  order: 2;
  grid-row: 2 / span 23;
}

#user {
  order: 3;
  grid-row: 1 / span 2;
}

@media (max-width: 991.99px) {
  .d-grid {
    grid-template-columns: 1fr;
    grid-auto-rows: auto auto 1fr auto;
  }
  #search {
    order: 1;
    grid-row: auto;
  }
  #cardsLowerSidebar {
    order: 2;
    grid-row: auto;
  }
  #mainContentArea {
    order: 3;
    grid-row: auto;
  }
  #user {
    order: 4;
    grid-row: auto;
  }
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.min.js"></script>

<div class="d-flex flex-nowrap flex-column min-vh-100">
  <div class="bg-primary">Navbar</div>
  <div class="flex-fill d-flex flex-nowrap">
    <div class="col-3 px-0 bg-danger">Fixed</div>
    <div class="col-9 px-0 d-grid">
      <div id="search" class="bg-success">Search</div>
      <div id="cardsLowerSidebar" class="flex-fill bg-warning">Cards Lower Sidebar</div>
      <div id="mainContentArea" class="flex-fill bg-info">Main Content Area Main Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content
        AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain
        Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content
        AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain Content AreaMain
        Content AreaMain Content AreaMain Content AreaMain Content Area</div>
      <div id="user" class="bg-dark">User<br>Subuser</div>
    </div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 实际上我还是印象深刻。但是,这不是一个有效的答案,我现在是) (2认同)
  • 还有一种解决方案。现在结合了 CSS 网格和 Bootstrap。它涉及您上次更新中的那些巨大深渊。 (2认同)

Bry*_*son 5

@sheriffderek 的回答是一个非常好的整体解决方案。但是,您可以稍微简化它以混合flexboxgrid。这将允许您继续使用 Bootstrap 进行某些布局。

Bootstrap 的问题

我怀疑您是否会找到完整的 Bootstrap 4 解决方案。问题是,Bootstrap 没有使用 CSS Grid 进行布局。如果您使用 Bootstrap 创建一个 Grid,那么 Grid 功能只是使用嵌套的 flex 元素来伪造。

这就是我将如何处理这个问题。

弹性盒 + 网格

使用传统的布局规则和 flexbox 布局页面的主要部分。我会将标题完全排除在外,因为它不会移动/更改,并且默认值是display:block根据需要向下推送其他内容。

------------------------------------------------------------------
|                     header (display block)                     |
------------------------------------------------------------------
|                       |                                        |
|                       |                                        |
|      nav (flex)       |                 content (flex)         |
|                       |                                        |
------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

注意:如果你愿意,你可以在这部分使用 Bootstrap,但我将display:flex在我的例子中简单地使用它,因为它更容易编写,以后其他人也更容易遵循。

------------------------------------------------------------------
|                     header (display block)                     |
------------------------------------------------------------------
|                       |                                        |
|                       |                                        |
|      nav (flex)       |                 content (flex)         |
|                       |                                        |
------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
header {
  background-color: lightGray;
  padding: 10px;
  text-align: center;
}

#mainContent {
  display:flex;
}

nav {
  background-color: aqua;
  padding: 10px;
  text-align: center;
  flex-basis: 33.3333%;
  min-height: 100px;
}
#content {
  background-color: tan;
  padding: 10px;
  text-align: center;
  flex-basis: 66.6666%;
}
Run Code Online (Sandbox Code Playgroud)

正常显示内容

正常显示不需要任何花哨的网格或 flexbox 东西。默认情况下,块元素会将其他所有内容都推低,这就是您所模拟的。

<header>Header Content</header>
<div id="mainContent">
  <nav>Nav Bar</nav>
  <section id="content">Content</section>
</div>
Run Code Online (Sandbox Code Playgroud)
header {
  background-color: lightGray;
  padding: 10px;
  text-align: center;
}

header {
  background-color: lightGray;
  padding: 10px;
  text-align: center;
}

#mainContent {
  display:flex;
}

nav {
  background-color: aqua;
  padding: 10px;
  text-align: center;
  flex-basis: 33.3333%;
  min-height: 100px;
}
#content {
  background-color: tan;
  padding: 5px 10px;
  text-align: center;
  flex-basis: 66.6666%;
}

.search, .cards, .content, .profile {
    background: rgba(0,0,0,0.2);
    padding: 10px;
    margin: 5px 0;
}
Run Code Online (Sandbox Code Playgroud)

巨幕

这是您使用媒体查询应用 CSS 网格来覆盖块级布局的地方。

<header>Header Content</header>
<div id="mainContent">
  <nav>Nav Bar</nav>
  <section id="content">
      <div class="search">Search</div>
      <div class="cards">Cards</div>
      <div class="content">Main Content</div>
      <div class="profile">Profile</div>
  </section>
</div>
Run Code Online (Sandbox Code Playgroud)
header {
        background-color: lightGray;
        padding: 10px;
        text-align: center;
    }
    
    #mainContent {
        display: flex;
    }
    
    nav {
        background-color: aqua;
        padding: 10px;
        text-align: center;
        flex-basis: 33.3333%;
        min-height: 100px;
    }
    
    #content {
        background-color: tan;
        padding: 5px 10px;
        text-align: center;
        flex-basis: 66.6666%;
    }
    
    .search,
    .cards,
    .content,
    .profile {
        background: rgba(0, 0, 0, 0.2);
        padding: 10px;
        margin: 5px 0;
    }

    @media screen {
        /* normally you would have sizes here but we're just showing the media query effect */
        #content {
            padding: 5px;
            display: grid;
            grid-template-areas: "search profile"
                                 "content profile" 
                                 "content cards"
                                 "content cards";
        }
        .search,
        .cards,
        .content,
        .profile {
            margin: 5px;
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果您想显式更改大小,您可以使用Grid 的大小调整系统grid-template-areas使用多个相同名称的行/列更新