CSS padding-bottom 大小的盒子上的过渡行为很奇怪

CSS transition on padding-bottom sized box act weird

我正在尝试在相同框的水平列表中为一个大小为 padding-bottom 的框设置动画。

动画包括改变它的比例(让它变宽)和它的一般尺寸(让它比其他的大)。问题是,当动画开始时,它会垂直移动其他框,最后会恢复垂直定位。

我还使用边距将其向上移动(因为它更大)并避免它在底部获得 space。简而言之,我使用边距来保持高度不变。

我注意到问题出在 padding-bottom 上,即使一开始我认为是边距部分。

这是主要的css:

.item {
  display: inline-block;
  width: 20%;
  padding: 0 8px;
  box-sizing: border-box;
  transition: width ease-in-out 150ms;
}
.item:hover {
  width: 28%;
}

.item::after {
  content: "";
  display: block;
  padding-bottom: 166%;
  background: violet;
  transition:
    padding ease-in-out 150ms,
    margin ease-in-out 150ms
  ;
}
.item:hover::after {
  padding-bottom: 130%;
  margin: -8.4% 0; /* this avoids to occupy space vertically */
}

这是我正在尝试做的,另一种类型的动画有同样的问题,但没有把盒子变大,所以问题显然是 padding-bottom 属性.

.container,
.container1 {
  font-size: 0;
  white-space: nowrap;
  overflow: hidden;
  padding: 10% 0;
  margin: -10% 0;
}

.item {
  display: inline-block;
  width: 20%;
  padding: 0 8px;
  box-sizing: border-box;
  transition: width ease-in-out 150ms;
}

.item:hover {
  width: 28%;
}

.item::after {
  content: "";
  display: block;
  padding-bottom: 166%;
  background: violet;
  transition: padding ease-in-out 150ms, margin ease-in-out 150ms;
}

.container .item:hover::after {
  padding-bottom: 130%;
  margin: -8.4% 0;
}

.container1 .item:hover::after {
  padding-bottom: 116.495%;
}
<div style="padding: 100px 0 20px">
  Here the effect should be like scale, but occupying space horizontally
</div>
<div class="container">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
</div>
<div style="padding: 100px 0 20px">
  Here the effect should be like animating the width only, keeping the same height
</div>
<div class="container1">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
</div>

我认为使用 flexbox 是个好主意。我已经为你创建了一个fiddle。

稍后谢谢我。

.container, .container1 {
  font-size: 0;
  white-space: nowrap;
  overflow: hidden;
  padding: 10% 0;
  display: flex;
  flex-wrap: nowrap;
}

.item {
  display: inline-block;
  width: 20%;
  padding: 0 8px;
  box-sizing: border-box;
  transition: width ease-in-out 150ms;
}
.item:hover {
  width: 28%;
}

.item::after {
  content: "";
  display: block;
  padding-bottom: 166px;
  background: violet;
  transition:
    padding ease-in-out 150ms,
    margin ease-in-out 150ms
  ;
}
.container .item:hover::after {
  padding-bottom: 188px;
}
<div class="container1">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
</div>

希望对您有所帮助:)

.container, .container1 {
    font-size: 0;
    white-space: nowrap;
    overflow: hidden;
    padding: 10px 0px;
    display: flex;
    align-items: center;
}
.item {
  display: inline-block;
  width: 20%;
  padding: 0 8px;
  box-sizing: border-box;
  transition: all 0.5s ease;
}
.item:hover {
  transform: scale(1.2);
}

.item::after {
  content: "";
  display: block;
  padding-bottom: 166%;
  background: violet;
  transition:
    padding ease-in-out 150ms,
    margin ease-in-out 150ms
  ;
}
.container1 .item:hover {
  transform: scale(0.8);
}
<div style="padding: 100px 0 20px">
  Here the effect should be like scale, but occupying space horizontally
</div>
<div class="container">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
</div>
<div style="padding: 100px 0 20px">
  Here the effect should be like animating the width only, keeping the same height
</div>
<div class="container1">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
</div>

谢谢

我找到了解决办法!

只是我使用了 vertical-align: middle 和一个更大的底片 margin
这样,在动画播放过程中,由于自动垂直对齐,非同步过渡不会很明显。

它适用于显示的两个示例,即使在后者中更明显。

.container,
.container1 {
  font-size: 0;
  white-space: nowrap;
  overflow: hidden;
  padding: 10% 0;
  margin: -10% 0;
}

.item {
  display: inline-block;
  width: 20%;
  padding: 0 8px;
  box-sizing: border-box;
  transition: width ease-in-out 150ms;
  vertical-align: middle;
}

.item:hover {
  width: 28%;
}

.item::after {
  content: "";
  display: block;
  padding-bottom: 166%;
  background: violet;
  transition: padding ease-in-out 150ms, margin ease-in-out 150ms;
}

.container .item:hover::after {
  padding-bottom: 130%;
  margin: -20% 0;
}

.container1 .item:hover::after {
  padding-bottom: 115%;
  margin: -20% 0;
}
<div style="padding: 100px 0 20px">
  Here the effect should be like scale, but occupying space horizontally
</div>
<div class="container">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
</div>
<div style="padding: 100px 0 20px">
  Here the effect should be like animating the width only, keeping the same height
</div>
<div class="container1">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
</div>