You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chrome中HTML details元素内动画无法重复播放的解决咨询

解决Chrome中details元素开闭重复触发动画的问题

Chrome浏览器中,details元素的open属性变化时,仅第一次打开会触发动画,后续开闭不再生效——这是因为Chrome不会自动重置已完成的动画状态。以下是两种可靠的解决方案:

方法一:JavaScript辅助重置动画

通过监听details的toggle事件,强制重置动画状态,确保每次打开都重新触发动画:

修改后的代码

HTML

<details id="animated-details">
  <summary>Click me to open an animated list of items</summary>
  <ul>
    <li>These elements</li>
    <li>should ease in</li>
    <li>with a duration of 1s.</li>
  </ul>
</details>

CSS

details {
  font-size: x-large;
}

.details-open ul li {
  animation: expand-details 1s ease-in-out;
  position: relative; /* 必须添加,否则left属性不生效 */
}

.details-open ul li:nth-child(1) {
  animation-fill-mode: backwards;
  animation-delay: 100ms;
}
.details-open ul li:nth-child(2) {
  animation-fill-mode: backwards;
  animation-delay: 200ms;
}
.details-open ul li:nth-child(3) {
  animation-fill-mode: backwards;
  animation-delay: 300ms;
}

@keyframes expand-details {
  from {
    opacity: 0;
    left: -20px;
  }
  to {
    opacity: 1;
    left: 0;
  }
}

JavaScript

const details = document.getElementById('animated-details');
const listContainer = details.querySelector('ul');

details.addEventListener('toggle', () => {
  if (details.open) {
    // 先移除动画类,强制浏览器重绘后再重新添加
    listContainer.classList.remove('details-open');
    void listContainer.offsetWidth; // 触发重绘的关键步骤
    listContainer.classList.add('details-open');
  } else {
    // 关闭时移除动画类,避免下次打开时状态冲突
    listContainer.classList.remove('details-open');
  }
});

方法二:纯CSS过渡替代动画(简化方案)

如果不需要复杂的动画序列,也可以用transition替代animation,利用details[open]的状态变化触发过渡:

details {
  font-size: x-large;
}

ul li {
  opacity: 0;
  transform: translateX(-20px);
  transition: all 1s ease-in-out;
  position: relative;
}

details[open] ul li:nth-child(1) {
  transition-delay: 100ms;
  opacity: 1;
  transform: translateX(0);
}
details[open] ul li:nth-child(2) {
  transition-delay: 200ms;
  opacity: 1;
  transform: translateX(0);
}
details[open] ul li:nth-child(3) {
  transition-delay: 300ms;
  opacity: 1;
  transform: translateX(0);
}

这种方法在Chrome中能自动触发过渡,因为每次open状态变化时,元素的样式会被重新计算,过渡会重新执行。

内容的提问来源于stack exchange,提问作者cringe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 19:22:39