心态好好
摆脱懒惰和拖延(๑>◡<๑)

前端开发CSS 实现 height: 0 → auto 平滑过渡动画

方法一:max-height 模拟法

核心原理:

固定的超大 max-height 替代 height: auto,配合 height: 0 + overflow: hidden 实现动画。

  • 收起状态:height: 0; max-height: 0;(元素完全隐藏)
  • 展开状态:height: auto; max-height: [足够大的数值];(元素自适应高度,动画由 max-height 完成)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>height 0→auto 动画(max-height版)</title>
  <style>
    /* 动画容器核心样式 */
    .box {
      width: 300px;
      background: #f0f7ff;
      border: 1px solid #409eff;
      border-radius: 6px;
      /* 核心1:隐藏溢出内容,否则收起时内容会外露 */
      overflow: hidden;
      /* 核心2:设置过渡动画,作用于max-height */
      transition: max-height 0.3s ease-in-out;
      /* 收起状态:高度0、最大高度0 */
      height: 0;
      max-height: 0;
    }

    /* 展开状态(添加active类触发) */
    .box.active {
      height: auto; /* 恢复自适应高度 */
      max-height: 1000px; /* 设为比内容最大高度大的值即可 */
    }

    /* 触发按钮样式(辅助) */
    .toggle-btn {
      margin: 20px 0;
      padding: 8px 16px;
      cursor: pointer;
      background: #409eff;
      color: white;
      border: none;
      border-radius: 4px;
    }
  </style>
</head>
<body>
  <button class="toggle-btn" onclick="document.querySelector('.box').classList.toggle('active')">
    点击展开/收起
  </button>
  <div class="box">
    <div style="padding: 16px;">
      这是自适应高度的内容<br>
      内容可以任意多少行<br>
      高度会自动跟随内容变化<br>
      展开/收起都有平滑动画 ✅
    </div>
  </div>
</body>
</html>

注意事项:

  • max-height 值建议设为 页面中元素可能的最大高度(如 500px/1000px),只要超过内容实际高度即可,不影响动画效果
  • 动画时长和max-height匹配:如果max-height设得很大(如2000px),建议把过渡时长调至0.5s,避免动画 “卡顿感”

方法二:JS+CSS 精准计算

核心原理:

如果追求绝对精准、无延迟的动画效果,用 JS 实时计算元素「真实内容高度」,再配合 CSS transition 过渡,完美解决 auto 不支持动画的问题。

  1. 收起状态:CSS 固定 height: 0 + overflow: hidden
  2. 展开时:JS 获取元素的 scrollHeight(真实内容高度),赋值给 height
  3. 收起时:JS 再把 height 重置为 0
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>height 0→auto 动画(JS精准版)</title>
  <style>
    /* 动画容器核心样式 */
    .box {
      width: 300px;
      background: #f0f7ff;
      border: 1px solid #409eff;
      border-radius: 6px;
      overflow: hidden;
      /* 核心:过渡动画作用于height,时长自定义 */
      transition: height 0.3s ease-in-out;
      /* 初始收起状态 */
      height: 0;
    }

    /* 触发按钮样式(辅助) */
    .toggle-btn {
      margin: 20px 0;
      padding: 8px 16px;
      cursor: pointer;
      background: #67c23a;
      color: white;
      border: none;
      border-radius: 4px;
    }
  </style>
</head>
<body>
  <button class="toggle-btn" onclick="toggleBox()">点击展开/收起</button>
  <div class="box" id="animateBox">
    <div style="padding: 16px;">
      JS精准计算高度 ✨<br>
      动画无延迟、无卡顿<br>
      适配任意内容高度<br>
      极致丝滑体验
    </div>
  </div>

  <script>
    const box = document.getElementById('animateBox');
    let isOpen = false; // 标记展开/收起状态

    function toggleBox() {
      if (!isOpen) {
        // ✅ 展开:赋值真实内容高度 scrollHeight
        box.style.height = box.scrollHeight + 'px';
        isOpen = true;
      } else {
        // ✅ 收起:重置高度为0
        box.style.height = '0';
        isOpen = false;
      }
    }
  </script>
</body>
</html>
赞(2) 打赏
未经允许不得转载:东东的小屋 » 前端开发CSS 实现 height: 0 → auto 平滑过渡动画

评论 1

  1. #1

    看不懂

    砾川美玖4周前 (01-26)回复

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册