以下代码段中的代码呈现了一个共鸣网格,该网格展开了一个被单击的元素.

const Demo = () => {

  const Item = ({content}) => {

    const [expanded, setExpanded] = React.useState(false);

    return (<div className = {
        expanded ? "expanded" : "item"
      }
      onClick = {
        () => setExpanded(!expanded)
      }>
        {content}
      </div>)
  }

  return (<div className = "grid" >
      <Item content = "Item 1" / >
      <Item content = "Item 2" / >
      <Item content = "Item 3" / >
      <Item content = "Item 4" / >
      <Item content = "Item 5" / >
      <Item content = "Item 6" / >
    </div>)
}

ReactDOM.render( < Demo / > , document.querySelector("#app"))
.grid {
  display: grid;
  gap: 1rem;
  grid-template-columns: repeat(auto-fit, minmax(min(200px, 100%), 1fr));
}

.item {
  display: flex;
  height: 100px;
  border: 1px solid black;
  justify-content: center;
  align-items: center;
}

.expanded {
  display: flex;
  height: 200px;
  border: 1px solid black;
  justify-content: center;
  align-items: center;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.2/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.2/umd/react-dom.development.js"></script>

<div id="app" />

例如,当点击Item 2时,网格如下所示:

Grid after clicking Item 2

但是,在本例中,我希望网格看起来像:

Expected grid after clicking Item 2

我该如何着手解决这件事呢?该解决方案不必使用css网格.但是,必须保持元素的响应宽度以及响应的行数和列数.

推荐答案

如果您正在寻找密集的网格布局,那么在网格容器上,您需要说明您需要dense auto flow行:

.grid {
  ...
  grid-auto-flow: row dense;
}

要适当增加项目的高度,请同时增加行跨度:

.expanded {
  height: 200px;
  grid-row: span 2;  /* <--- */
}

const Demo = () => {
    const Item = ({content}) => {
        const [expanded, setExpanded] = React.useState(false);
        return ( < div className = {            expanded ? "expanded" : "item" }
          onClick = { () => setExpanded(!expanded)
          } > { content} </div>) }

        return ( < div className = "grid" >
          <Item content = "Item 1" / >
          <Item content = "Item 2" / >
          <Item content = "Item 3" / >
          <Item content = "Item 4" / >
          <Item content = "Item 5" / >
          <Item content = "Item 6" / >
          </div>)
        }
        ReactDOM.render( < Demo / > , document.querySelector("#app"))
.grid {
  display: grid;
  gap: 1rem;
  grid-template-columns: repeat(auto-fit, minmax(min(200px, 100%), 1fr));

  /* use dense layout */
  grid-auto-flow: row dense;
}

.item {
  display: flex;
  height: 100px;
  border: 1px solid black;
  justify-content: center;
  align-items: center;
}

.expanded {
  display: flex;
  border: 1px solid black;
  justify-content: center;
  align-items: center;

  height: calc(200px + 1rem);
  /* need to increase row span also */
  grid-row: span 2;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.2/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.2/umd/react-dom.development.js"></script>

<div id="app" />

Javascript相关问答推荐

二维数组,过滤并返回带有索引而不是值的新数组

不渲染具有HTML参数的React元素

在JavaScript中检索一些文本

积分计算和 colored颜色 判断错误

Chart.js V4切换图表中的每个条,同时每个条下有不同的标签.怎么做?

为什么ngModel不能在最后一个版本的Angular 17上工作?'

Angular material 拖放堆叠的牌副,悬停时自动展开&

jQuery s data()[storage object]在vanilla JavaScript中?'

当试图显示小部件时,使用者会出现JavaScript错误.

如何使onPaste事件与可拖动的HTML元素一起工作?

优化Google Sheet脚本以将下拉菜单和公式添加到多行

400 bad request error posting through node-fetch

回溯替代方式

在JS中动态创建对象,并将其追加到HTML表中

AJAX POST在控制器中返回空(ASP.NET MVC)

无法读取未定义的属性(正在读取合并)-react RTK

使用jQuery find()获取元素的属性

如何组合Multer上传?

FireBase FiRestore安全规则-嵌套对象的MapDiff

如何在Web项目中同步语音合成和文本 colored颜色 更改