我有一个容器,里面有多个flex元素,用gap分隔.这些元素包装在容器中,并具有基于数组的大小,指定了一行中可以出现的数量(即每行4个= 25%).

现在,因为基于元素的大小没有考虑间隙大小,所以我们必须使用公式来确定元素的大小,同时考虑我们需要的间隙(从here开始):

calc((100% / var(--flex-items)) - (((var(--flex-items) - 1) / var(--flex-items)) * var(--flex-gap)));

这工作得很好,很容易适应每行不同数量的Flex对象.但当改变gap的价值时,问题就出现了,同时进行了转换.

虽然转换前后的外观看起来像他们应该的那样,但在转换过程中,由于某种原因,计算不正确,因此多一个项目比应该的包装,直到确定它应该如何在外观之后看起来.这只会在降低gap的值时发生—当增加gap时,

在动画期间,两个值之间发生了什么导致宽度计算/间隙值不同步?

CodePen

Here

$( "body" ).on( "click", function() {
  $(".flexbox").toggleClass("bigger");
} );
:root {
    --flex-gap: 1rem;
}

.flexbox {
    display: flex;
    flex-wrap: wrap;
    gap: var(--flex-gap);
    justify-content: center;
    transition: gap 0.5s;
}

.flexbox.bigger {
  --flex-gap: 3rem;
}

.flex-items {
    --flex-items: 4;
    aspect-ratio: 2 / 1;
    display: flex;
    background: red;
    flex: 1 1 calc((100% / var(--flex-items)) - (((var(--flex-items) - 1) / var(--flex-items)) * var(--flex-gap)));
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<html>
  <body>
    <div class="flexbox">
      <div class="flex-items"></div>
      <div class="flex-items"></div>
      <div class="flex-items"></div>
      <div class="flex-items"></div>
      <div class="flex-items"></div>
      <div class="flex-items"></div>
      <div class="flex-items"></div>
      <div class="flex-items"></div>
      <div class="flex-items"></div>
      <div class="flex-items"></div>
      <div class="flex-items"></div>
      <div class="flex-items"></div>
    </div>
  </body>
</html>

推荐答案

您还需要对Flex项目上的flex-basis应用一个过渡.

$( "body" ).on( "click", function() {
  $(".flexbox").toggleClass("bigger");
} );
:root {
    --flex-gap: 1rem;
}

.flexbox {
    display: flex;
    flex-wrap: wrap;
    gap: var(--flex-gap);
    justify-content: center;
    transition: gap 0.5s;
}

.flexbox.bigger {
  --flex-gap: 3rem;
}

.flex-items {
    --flex-items: 4;
    aspect-ratio: 2 / 1;
    display: flex;
    background: red;
    flex: 1 1 calc((100% / var(--flex-items)) - (((var(--flex-items) - 1) / var(--flex-items)) * var(--flex-gap)));
    transition: flex-basis 0.5s;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<html>
  <body>
    <div class="flexbox">
      <div class="flex-items"></div>
      <div class="flex-items"></div>
      <div class="flex-items"></div>
      <div class="flex-items"></div>
      <div class="flex-items"></div>
      <div class="flex-items"></div>
      <div class="flex-items"></div>
      <div class="flex-items"></div>
      <div class="flex-items"></div>
      <div class="flex-items"></div>
      <div class="flex-items"></div>
      <div class="flex-items"></div>
    </div>
  </body>
</html>

Css相关问答推荐

在react native中应用阴影

如何将表格单元格的最后一个子级与单元格底部对齐?

如何为垫子制作圆角- Select 所有角点上的下拉列表

如何在Ionic上更改输入的浮点数名称 colored颜色 ?

在主零部件悬停上对子零部件设置Angular 样式

为什么 CSS Calc() 函数只需要+或-运算符前后有空格

如何减少弹性项目之间的差距

我可以拆分我的 CSS / SASS webpack 加载器规则,还是它们需要成为一个大规则?

如何使用显示网格制作不同大小的列取决于元素的数量

悬停时如何更改 navbarPage 链接的文本 colored颜色 (在shiny 的应用程序中)?

我想在视频上使用混合混合模式的 svg

Bootstrap 5 - 更改列顺序时出现问题

用户代理必须处理(或表现得好像他们这样做)每个链接就好像链接指向单独的样式表这句话是什么意思?

Bootstrap 类似乎没有任何作用

如何更改下拉列表的宽度?

边框半径 + 背景 colored颜色 == 裁剪边框

CSS如何使元素淡入然后淡出?

如何在 CSS 中延迟 :hover 效果?

表格溢出时水平滚动

内联块列表项中不需要的边距