This is the desired layout: enter image description here

我可以用16:9的图像实现固定的长宽比,并将img宽度设置为100%;然而,这样我就失go 了Flexbox的响应性高度zoom ,高度保持不变,只有row1在调整窗口大小时调整其高度.第2行只是溢出,不会zoom 任何高度.为了解决这个问题,我try 在中间引入第三个div,以填补视区高度降低时的剩余空间,这将使Image1和Image2变小,而中间div变宽.

我的问题是:有没有可能用Flexbox来实现这一点,或者我需要使用css grid或js来实现这一点?

Html:

<div id="container">
      <div id="row1">
            <div id="panel1"></div>
            <div id="panel2"></div>
      </div>
      <div id="row2">
            <div id="panel3">
              <img/>
            </div>
            <div id="panel4"></div>
            <div id="panel5">
               <img/>
       </div>
</div>

另请参阅以下内容:

#container {
    height: 100vh;
    width: 100vw;
    display: flex;
    flex-wrap: wrap;
    flex-direction: column;
}

#row1 {
    display: flex;
    flex-wrap: wrap;
    flex: 2;
    gap: 7px;
    width: 100%;
    padding: 7px;
}
#row2 {
    display: flex;
    flex-flow: row nowrap;
    flex: 1;
    gap: 7px;
    width: 100%;
    padding: 0 7px 7px 7px;
}

#panel1 {
    background: white;
    flex: 1;
}

#panel2 {
    background: white;
    width: 100px;
}

#panel3 {
    background: white;
    flex: 1;
}

#panel4 {
    background: white;
    flex: 1;
}

#panel5 {
    background: white;
    flex: 1;
}

#image1 {
width: 100%;
}

推荐答案

从面板3和5中删除flex: 1样式,并将aspect-ratio设置为16/9.

#panel3 {
  aspect-ratio: 16 / 9;
}

#panel4 {
  flex: 1;
}

#panel5 {
  aspect-ratio: 16 / 9;
}

*, *::before, *::after {
  box-sizing: border-box;
}

html, body {
  width: 100%:
  height: 100%;
  margin: 0;
  padding: 0;
}

#container {
  height: 100vh;
  width: 100vw;
  display: flex;
  flex-wrap: wrap;
  flex-direction: column;
}

#row1 {
  display: flex;
  flex-wrap: wrap;
  flex: 2;
  gap: 7px;
  width: 100%;
  padding: 7px;
}

#row2 {
  display: flex;
  flex-flow: row nowrap;
  flex: 1;
  gap: 7px;
  width: 100%;
  padding: 0 7px 7px 7px;
}

#panel1 {
  background: red;
  flex: 1;
}

#panel2 {
  background: orange;
  width: 100px;
}

#panel3 {
  background: yellow;
  aspect-ratio: 16 / 9;
}

#panel4 {
  background: green;
  flex: 1;
}

#panel5 {
  background: blue;
  aspect-ratio: 16 / 9;
}

#image1 {
  width: 100%;
}
<div id="container">
  <div id="row1">
    <div id="panel1"></div>
    <div id="panel2"></div>
  </div>
  <div id="row2">
    <div id="panel3">
      <img/>
    </div>
    <div id="panel4"></div>
    <div id="panel5">
      <img/>
    </div>
  </div>
</div>

Javascript相关问答推荐

如何在不使用类型化数组的情况下将32位浮点数按位转换为整值?

在具有焦点和上下文的d3多线图表中,如何将上下文的刷新限制在特定日期?

如何保持子画布元素的1:1宽高比?

如何访问react路由v6加载器函数中的查询参数/搜索参数

一次仅播放一个音频

我可以使用CSS有效地实现最大宽度=100%和最大高度=100%,而无需父母有明确的/固定的宽度和高度,替代方法吗?

jQuery提交按钮重新加载页面,即使在WordPress中使用preventDefault()

Phaser 3 console. log()特定游戏角色的瓷砖属性

为什么promise对js中的错误有一个奇怪的优先级?

cypress中e2e测试上的Click()事件在Switch Element Plus组件上使用时不起作用

如何避免页面第一次加载时由于CSS样式通过JavaScript更改而出现闪烁

编剧如何获得一个div内的所有链接,然后判断每个链接是否都会得到200?

如何修复我的数据表,以使stateSave正常工作?

如何在ASP.NET项目中使用Google Chart API JavaScript将二次轴线值格式化为百分比

基于props 类型的不同props ,根据来自接口的值扩展类型

Jest toHaveBeenNthCalledWith返回当前设置的变量值,而不是调用时的值

为什么我的按钮没有从&q;1更改为&q;X&q;?

使用父标签中的Find函数查找元素

使用线性插值法旋转直线以查看鼠标会导致 skip

在JavaScript中将Base64转换为JSON