【问题标题】:Why does transition-delay not work on a child element when parent is shown?为什么显示父元素时,transition-delay 对子元素不起作用?
【发布时间】:2021-09-24 14:19:07
【问题描述】:

这可能最好用一个例子来说明。我有一个parent 和一个child。默认情况下,父级是隐藏的,除非它具有 in 类。只有在父级收到in 类后,其子级才应在 3 秒延迟后将其background-color 从绿色转换为白色。

所以当显示父级时,子级的背景色已经是白色了。没有 3 秒的橙色,过渡到白色。有人可以解释这里发生了什么吗?

$('button.show').on('click', () => {
  $('.parent').addClass('in');
});

$('button.hide').on('click', () => {
  $('.parent').removeClass('in');
});
.parent, .child {
  display: flex;
  align-items: center;
  justify-content: center;
}

.parent {
  background-color: orange;
  width: 300px;
  height: 300px;
}

.child {
  background-color: green;
  padding: 20px;
  width: 150px;
  height: 150px;
  transition: background-color 1s linear;
}

.parent:not(.in) {
  display: none;
}

.parent.in .child {
  background-color: white;
  transition-delay: 3s;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div class="parent">
  <div class="child">
    <span>Background should start green, then turn white, but transition isn't happening.</span>
  </div>
</div>

<br>
<button type="button" class="show">Show parent</button>
<button type="button" class="hide">Hide parent</button>

【问题讨论】:

    标签: css css-transitions css-transforms


    【解决方案1】:

    在给定父级的 display:none 起始条件的情况下,我对设置发生的确切时间有点困惑。

    这个 sn-p 采用稍微不同的路径 - 使用我发现更容易控制的 CSS 动画。在显示父级之前不会设置动画,因此在时间上没有混淆的余地。

    $('button.show').on('click', () => {
      $('.parent').addClass('in');
    });
    
    $('button.hide').on('click', () => {
      $('.parent').removeClass('in');
    });
    .parent,
    .child {
      display: flex;
      align-items: center;
      justify-content: center;
    }
    
    .parent {
      background-color: orange;
      width: 300px;
      height: 300px;
    }
    
    .child {
      background-color: green;
      padding: 20px;
      width: 150px;
      height: 150px;
      animation-name: none;
    }
    
    .parent:not(.in) {
      display: none;
    }
    
    .parent.in .child {
      animation-name: change;
      animation-duration: 1s;
      animation-iteration-count: 1;
      animation-delay: 3s;
      animation-fill-mode: forwards;
    }
    
    @keyframes change {
      0% {
        background-color: green;
      }
      100% {
        background-color: white;
      }
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <div class="parent">
      <div class="child">
        <span>Background should start green, then turn white, but transition isn't happening.</span>
      </div>
    </div>
    
    <br>
    <button type="button" class="show">Show parent</button>
    <button type="button" class="hide">Hide parent</button>

    【讨论】:

    • 很好的解决方案。我尽量使用过渡,但这个动画似乎是唯一的选择,不需要额外的类和 JS。
    【解决方案2】:

    您看不到过渡的原因是因为子项从未以第一种背景颜色显示。从父级继承的display:none 开始,然后同时切换到父级显示和新颜色。

    您需要先显示父项(以及通过继承的子项),然后更改子项的颜色。

    JS

     $('button').on('click', () => {
         $('.parent').addClass('in');
         //Without settimeout this will run same time as first added class
         setTimeout(() => $('.parent').addClass('color'), 0);
     });
    

    那么你就是css

    .parent.in.color .child {
        background-color: white;
        transition-delay: 3s;
    }
    

    【讨论】:

    • 好的,我明白你在说什么,但我的偏好不是严格地为父元素添加第二个类来转换子元素。在我的真实世界项目中,父级通过任何旨在处理子元素的代码之外的操作来获取类。该代码担心超出其权限范围的子元素感觉不正确。有没有不需要父母第二课的解决方案?
    • 根据定义,任何显示父项的代码都是显示子项的代码...在您的真实世界项目中,当父项显示无时显示子项?如果您愿意,可以将课程添加到孩子
    • 我应该澄清一下。我的父元素是一个页面范围的容器,它使用 CSS 类来控制应用程序当前显示的“页面”。每个页面都是父页面的子页面。因此,如果父级获得settings 的类,则会显示设置页面。处理这些页面切换的代码是高级代码,而不是包含在 settings.js 模块中的代码。所以说我希望设置中的某个元素在显示设置时转换到视图中,我不希望高级代码必须向页面范围的容器添加随机类只是为了在设置中生成转换。跨度>
    • 好吧,有道理
    • 触发页面变化的代码(或按钮)在哪里?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多