CSS技巧:从高度0过渡到自动高度

本文翻译自 CSS trick: transition from height 0 to auto!,作者:Francesco Vetere, 略有删改。

如果你在CSS上花了足够长的时间,很可能你曾尝试过从height:0auto的平滑过渡。。。却发现它不起作用!😢

️幸运的是现在有一个解决这个问题的方法:使用CSS Grid布局可以解决这个问题,而且代码简单,运行的很完美。

让我们从一个实际的例子开始。我做了这个简单的手风琴效果:

它的HTML非常简单:

html 复制代码
<div class="accordion">
  <div class="accordion-title">Hover me!</div>
  <div class="accordion-body">
    <div>
      <p>Lorem ipsum ...</p>
    </div>
  </div>
</div>

如果你将鼠标悬停在手风琴上,你会注意到有一个下拉菜单出现。效果不错,但如果我们想要添加一个漂亮的平滑过渡效果呢?

实际上,我在前面演示的效果中的CSS代码里面对height属性上添加了一个小过渡:

css 复制代码
.accordion-body {
  height: 0;
  transition: 500ms height ease;
}

.accordion:hover .accordion-body {
  height: auto;
}

不幸的是,从height: 0转换到height: auto不起作用,正如我之前所说的,是CSS不可能实现的。

🤔如何解决这个问题?

第一个解决方案是将height属性设置为一个固定的数字,而不是auto

这是可行的,但它不是一个很好的方法:为了计算这个固定的数字,我们必须求助于JavaScript,以计算我们的.accordion-body实际上有多高。这不是我们的目标。

💡事实上,为什么不直接用max-height呢?

css 复制代码
.accordion-body {
  max-height: 0;
  transition: 500ms max-height ease;
}

.accordion:hover .accordion-body {
  max-height: 200px;
}

由于我们为max-height定义了一个固定值,浏览器现在可以正确地执行转换。

😕唯一的问题是,由于我们为max-height定义了一个固定值,现在内容可能会溢出。

如果你确信你的内容永远不会达到一定的高度...那么用这个方法完全可以!只要为max-height使用一个合适的值,就可以了。

但是要注意,max-height的值越高,过渡就越奇怪。

🤔我们能做得更好吗?我们可以避免任何固定的height/max-height值吗?

🎉 CSS Grid 来拯救

我们实际上可以使用一个简单的技巧,就是用一个网格项制作一个CSS网格。

然后真正要做的就是把我们的grid-template-rows0fr过渡到1fr。这样我们的网格项将从0过渡到它的"自然"高度。

css 复制代码
.accordion-body {
  display: grid; 
  grid-template-rows: 0fr;
  transition: 250ms grid-template-rows ease;
}

.accordion:hover .accordion-body {
  grid-template-rows: 1fr;
}

.accordion-body > div {
  overflow: hidden;
}

感觉干净多了。没有固定的高度,没有花哨的东西,我们的手风琴效果依然按预期工作。好极了!😄

这个解决方案的一个警告是需要设置一个overflow: hidden.accordion-body的内部div,以便使这个方案正常工作。在我看来这一点额外的CSS是完全值得的,你可以在评论中说出你对它的看法!

🎁 额外提示

这个技巧之所以有效,是因为grid-template-rows的可动性,这是一些浏览器最近才有的功能。在我写这篇文章的时候,所有主流的浏览器都支持这个特性,但是如果你想在生产代码中使用这个特性,一定要先检查兼容性!


看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~

专注前端开发,分享前端相关技术干货,公众号:南城大前端(ID: nanchengfe)

相关推荐
jvxiao1 小时前
你真的懂作用域吗?从编译原理角度深度 JS 的作用域
前端·javascript
Darling噜啦啦1 小时前
二叉树与递归算法实战:从树结构到 LeetCode 爬楼梯,一文吃透前端数据结构与递归思维
前端·javascript·数据结构
星栈1 小时前
Rust + Makepad 应用怎么打包发布:Windows、macOS、Linux 全平台交付
前端·rust
Aolith1 小时前
React 路由守卫:我用一个组件替代了 Vue 的 beforeEach
前端·react.js
Daybreak1 小时前
从 PDD、DDD、SDD 到 TDD:我是如何用一套 Agent 工程方法论推进 My-Notion 的
前端
HjhIron2 小时前
从零实现一个待办事项应用:前端必学的Ajax与Node.js实战
前端·后端
yingyima2 小时前
JavaScript 正则表达式:从零开始的实战对比
前端
Sammyyyyy2 小时前
月之暗面 Kimi Code 0.4.0 发布,终端 AI 编码助手全面采用 TypeScript,实现毫秒级启动
前端·javascript·人工智能·ai·typescript·servbay
范什么特西2 小时前
配置文件xml和properties
xml·前端
jnene2 小时前
html 时间、价格筛选样式处理
前端·css·html