用纯JS动画最大高度?

2023-11-21

我想要为 div 的高度设置动画。这通常在 CSS 中通过动画来完成max-height财产。

但是我需要在 JS 中执行此操作。 div 填充了经常变化的动态内容,因此无法提前知道实际高度。

这是一个jsfiddle:https://jsfiddle.net/vpknxuk8/

var box = document.getElementById("box");
var button = document.getElementById("button");
var expanded = true;

button.addEventListener('click', function() {
    if (expanded) {
        box.style.maxHeight = 0;
        expanded = false;
    } else {
        box.style.maxHeight = "";
        expanded = true;
    }
});
#box {
  margin-top: 20px;
  border: 1px solid black;
  background-color: #4f88ff;
  width: 200px;
  transition: max-height 0.25s linear;
  overflow: hidden;
}
<button id="button">Click</button>

<div id="box">
  Hello World<br>
  This is dynamic content<br>
  The actual height won't be known ahead of time
</div>

该框应在高度 0 和默认高度之间转换,但由于某种原因它没有动画。

StackOverflow 上此问题的唯一其他版本涉及纯 CSS 解决方案或 jQuery 解决方案。


Don't use max-height...好吧,除非你想采用CSS-only草率的解决方案会产生延迟间隙问题 - ...这就是您首先再次使用 JS 的原因,希望如此

so, use height and transition: height instead

function slidetoggle() {

  document.querySelectorAll(this.getAttribute('data-slidetoggle')).forEach(el => {
    const ch = el.clientHeight,
      sh = el.scrollHeight,
      isCollapsed = !ch,
      noHeightSet = !el.style.height;

    el.style.height = (isCollapsed || noHeightSet ? sh : 0) + "px";
    if (noHeightSet) return slidetoggle.call(this);
  });
}


document.querySelectorAll("[data-slidetoggle]").forEach(el => el.addEventListener('click', slidetoggle));
#box1,
#box2 {
  overflow: hidden;
  margin-bottom: 20px;
  background-color: #4f88ff;
  width: 200px;
  transition: height 0.5s;
}
<button data-slidetoggle="#box1">Toggle Box 1</button>

<div id="box1">
  Hello World<br> This is dynamic content<br> The actual height won't be<br> known ahead of time
</div>

<button data-slidetoggle="#box2">Toggle Box 2</button>


<div id="box2">
  Hello World<br> This is dynamic content<br> The actual height won't be<br> known ahead of time<br> bla
  <br> bla
  <br> bla
</div>

TIP:如果你需要paddings,我的建议是将您的内容包装到另一个子框中 - 带填充。

上面的代码是一个概念性的和最小的代码 - 有很大的改进空间,但希望您明白了。

解释为什么上述以及为什么不使用以下内容:

如果我们不设置初始高度,CSS 高度过渡将无法工作。
所以基本上在点击时 - 如果这样的高度不存在,我们需要通过 JS 设置它。
设置这样的高度后,过渡仍然不起作用,因为浏览器没有时间计算盒子模型这种元素的 - 到过渡自:

// (INVALID DEMO) 
//
// Say the element is expanded.
// We need a height to transition-from
el.height = calculatedHeight +"px";  // set CSS height to the calculated value
// Transition to 0px height....
el.height = 0 +"px";
// NO DEAL. our element just snapped to 0 without transition

因此我们需要居住在某种callback.
一种常见的(但草率的方式)是使用setTimeout()打回来

// (INVALID DEMO) 
//
// Say the element is expanded.
// We need a height to transition-from
el.height = calculatedHeight +"px";  // set CSS height to the calculated value
// Transition to 0px height giving the browser some ready-state hack
setTimeout(function() {
    // Eventually the box model will be calculated 
    el.height = 0 +"px";
}, 0);   // <<< PROBLEM: Should we use 0 ? 10? 100? 1000? 
// and our element beautifully transitioned to 0 height.
// Eventually :(
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用纯JS动画最大高度? 的相关文章

  • IntersectionObserver是否支持水平滚动观察?

    我制作了几个垂直滚动 IntersectionObserver 模块 但我对水平滚动感兴趣 根将是 div 观察目标将是 img 我想观察当 img 放大但 div 保持视口宽度时的变化 我什至不确定移动 Safari 是否会将缩放后的图片
  • JavaScript 验证和 PHP 验证?

    我正在使用 jquery 验证插件来验证空表单 我还应该在 PHP 中检查一下以确保 100 正确吗 或者用 javascript 验证就可以了 谢谢 您应该始终在服务器上进行验证 如果用户以某种方式不使用 Javascript 提交表单
  • 删除 IE9 边缘周围的 2px 灰色边框

    我正在尝试对这个网站进行编码 尝试关键字 并且我正在尝试找出如何删除这个阴影2px灰色边框延伸到 IE9 窗口的内部 至少顶部 左侧和底部 我的边距设置为零 因此所有页面元素都到达页面的最边缘 但使用 IE9 它们会停在这个灰色边框处 我没
  • ReactTransitionGroup 不适用于 React-redux 连接组件

    我正在开发一个更大的项目 但我创建了这个简短的示例来说明问题 如果我使用Box组件 它的工作原理 它在控制台中输出componentWillEnter and componentWillLeave当我们点击按钮时 如果我使用BoxConta
  • React autoFocus 将光标设置为输入值的开头

    我有一个受控输入 最初显示一个值 我已将该输入设置为自动聚焦 但当我希望它出现在末尾时 光标出现在输入的开头 我知道这可能是因为自动对焦是在值之前添加的 但我不能 100 确定 在输入字段末尾完成光标初始化的最佳方法是什么 var Test
  • 如何使用角度材料在具有可扩展行的表格中创建嵌套垫表

    我有以下数据 id c9d5ab1a subdomain wing domain aircraft part id c9d5ab1a info mimetype application json info dependent parent
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • JavaScript RegEx:不同的结果:使用字符串和使用正则表达式“文字”构建模式?

    使用 RegExp 文字与字符串之间有什么区别吗 http jsfiddle net yMMrk http jsfiddle net yMMrk String prototype lastIndexOf function pattern p
  • CSS 到底如何计算相对尺寸

    我想更好地理解某些 CSS 行为 这与具体问题无关 我只是在调试网站时遇到的 让我们在固定位置的 div 中放置一个全宽图像 div img style width 100 src https via placeholder com 150
  • 如何正确取消引用然后删除 JavaScript 对象?

    我想知道从内存中完全取消引用 JavaScript 对象的正确方法 确保删除时不会在内存中悬空 并且垃圾收集器会删除该对象 当我看这个问题时在 JavaScript 中删除对象 https stackoverflow com questio
  • JavaScript eval("{}") 返回行为?

    根据ECMA 262 规范 http www ecma international org publications files ECMA ST Ecma 262 pdf 以下语句返回1 eval 1 eval 1 eval 1 var a
  • 如何从浏览器向服务器发送“页面将关闭”消息?

    我想向每个 html 文档添加一个脚本 JavaScript 该脚本向服务器发送两条消息 页面确实打开了 页面将关闭 此消息包含页面打开的时间 打开消息应在文档加载时 或加载完成时 发送 这是简单的部分 The close message
  • 使用 Jade 评估自定义 javascript 方法 (CircularJSON)

    我想通过 Jade 将一个对象解析为客户端 JavaScript 通常这会起作用 script var object JSON parse JSON stringify object but my object is circular ht
  • 从 PHP 数组生成 HTML 表

    我不明白这一点 我需要解决看似简单的问题 但这超出了我的逻辑 我需要编写一个函数 table columns input cols 它将输出一个表 示例 input array apple orange monkey potato chee
  • 有没有办法使用 ko.observableArray 作为地图?

    有没有办法使用ko observableArray http knockoutjs com documentation observableArrays html像地图 字典一样 例如 var arr ko observableArray
  • css3按钮背景颜色无限过渡

    有没有办法仅使用 css3 使按钮的背景颜色从灰色渐变为蓝色 然后又回到灰色 一个很好的例子是默认操作按钮是可可 我知道这可以在 javascript 中完成 但我宁愿只使用 css 来完成此操作 您好 我已经通过 CSS3 动画制作了按钮
  • 什么是 WKWebView 中的 WKErrorDomain 错误 4

    fatal error LPWebView encounters an error Error Domain WKErrorDomain Code 4 A JavaScript exception occurred UserInfo 0x7
  • 将数组从 jquery ajax 传递到代码后面

    我必须将二维数组传递给在asp net网页代码后面编写的页面方法我有一个变量objList作为二维数组 我使用以下代码来实现此目的 但没有成功 并且未调用页面方法 脚本语言 function BindTable objList ajax u
  • 测量窗口偏移

    有没有一种方法可以测量 jQuery 中窗口的偏移量 以便我可以比较 固定 元素和相对定位元素的位置 我需要能够知道窗口滚动了多远 以便我可以使用该图来计算固定元素的高度 相对于视口顶部 和相对对象的高度 相对于顶部 之间的差异文件的内容
  • 没有输入的 jQuery 日期选择器

    我有一个相当复杂的网络应用程序 我想向其中添加一些日期选择 UI 我遇到的问题是我无法从文档中弄清楚如何真正控制日期选择器的出现方式和时间 不涉及任何表单元素 不 我不会添加秘密表单字段 因此简单的开箱即用方法根本行不通 我希望有人可以提供

随机推荐

  • JAXB 文档注释

    我有以下带有 JAXB XMLRootElement 注释的 java 类 XmlRootElement name ClientData public class ClientData The first address field of
  • 由于内存问题导致realloc失败时如何处理?

    问题说明了一切 但这是一个例子 typedef struct mutable t int count max void data mutable t void pushMutable mutable t m void object if m
  • 将字符串中的一些小写字母更改为大写

    index 0 2 5 s I am like stackoverflow python for i in index s s i upper print s IndexError string index out of range 我知道
  • 使用 getopt 向命令行选项提供两个参数[重复]

    这个问题在这里已经有答案了 使用时是否有其他方法将两个参数作为单个字符串传递给选项getopt 通常我会执行以下操作 command o key value command arguments 然后我必须明确地分割参数字符串 while o
  • 如何获取ng-bootstrap中Dropdown的值?

    我正在使用 ng bootstrap 我想在选择时获取下拉列表的值 div class col text right div class d inline block div div
  • 如何从部分视图获取父视图

    我有一个部分视图作为 Layout cshtml 的一部分 以便它可以在多个页面上呈现 将部分视图视为显示在网站每个页面上的菜单 当单击部分视图菜单中的这些链接之一时 我只能在称为部分视图的操作方法中访问 查看 如它的名称等 但我真正需要的
  • 无法更改视图的默认布局边距

    从ios 8 0开始 视图有额外的layoutMargins默认情况下 每边都有 8 分值 当我尝试更改边距时viewDidLoad它似乎对孩子的看法没有影响 override func viewDidLoad super viewDidL
  • Python lambda函数打印 at 0x7fcbbc740668>而不是值

    我是 python 的初学者 我正在研究 lambda 函数 我正在编写一个程序 使用 lambda 函数来打印输入字符的 ascii 值 1 的字符 我的代码是 usr bin python import sys try word sys
  • NoClassDefFoundError:org/slf4j/Logger

    我将 Log4J2 添加到我的应用程序中 我将所有 Log4J2 jar 文件复制到 LIB 目录并创建 Log4J2 xml 文件来支持它 我的代码已更新以导入必要的日志管理器和记录器 API 然后 我添加了静态最终记录器方法 并在代码中
  • 什么时候可以捕获 NullPointerException?

    有效的java建议我们不应该catch NullPointerException 总是对的吗 在很多抓捕的情况下NullPointerException 仅捕获正文调用printStackTrace 如果我没抓住NullPointerExc
  • Azure管道根据条件设置任务的显示名称

    在构建管道中 我有一个使用 powershell 脚本的工作 该脚本根据如下变量设置应用程序名称 applicationName If configuration eq Release Appname Else Appname Test W
  • Plotly:如何设置 x 轴上时间序列的主要刻度/网格线的值?

    背景 这个问题与以下问题相关 但不完全相同 Plotly 如何检索主要刻度线和网格线的值 类似的问题也被问过但没有得到解答绘图库 here 如何将主要刻度显示为每月的第一天 将次要刻度显示为每天 情节太棒了 也许唯一困扰我的是刻度线 网格线
  • Android 上的 Scala:java.lang.NoSuchMethodError:java.lang.String.isEmpty

    我在 Android 2 2 1 上遇到以下异常 java lang NoSuchMethodError java lang String isEmpty 我正在打电话text isEmpty来自斯卡拉 任何想法 如何解决这个问题 java
  • HashicorpVault - 客户端向 HTTPS 服务器发送 HTTP 请求 - 准备探针

    目前存在一个问题 即部署 Vault Helm 图表时就绪探针失败 Vault 正在工作 但每当我描述 Pod 时都会出现此错误 我如何让探测器使用 HTTPS 而不是 HTTP 如果有人知道如何解决这个问题我会很高兴慢慢失去理智 Kube
  • 同时使用多个Spring PropertyPlaceholderConfigurer

    我有两个项目 其中一个 服务 包括第二个 核心 我在核心项目中定义了下面的 PropertyPlaceholderConfigurer
  • 为什么 C 语言中移位的优先级低于加法和减法?

    我有时在进行位操作时发现这很不方便 尽管我现在不记得任何具体的例子 我还发现它在概念上令人困惑 因为移位基本上是乘法和除以 2 的幂 我发现在 C 中使用 因为这就是 C 语言的作者所决定的 使用括号以避免混淆
  • 如何将 Android 意图传递给除了我自己的应用程序之外的任何人?

    我有一个特定的意图 NDEF DISCOVERED 其中一些我无法正确处理 所以我想将它们重定向到 android 的默认 nfc 处理程序 所以我采取了意图 setComponent null 进而startActivity intent
  • 从 ASP.Net 页面运行批处理文件

    我试图通过 ASP Net 页面在服务器上运行批处理文件 这让我抓狂 当我运行下面的代码时 没有任何反应 我可以从一些日志语句中看到该代码运行 但我传递给该函数的 bat 文件从未运行 有人可以告诉我我做错了什么吗 public void
  • jQuery 无法在 AJAX 加载页面中工作

    我正在使用 jQuery 使用 ajax 假设 test html 通过 AJAX 加载页面 它是一个简单的 HTML 文档 带有一些按钮和单击它们时关联的动画 也使用 jQuery 当我直接加载页面时 关联的 click 属性工作正常 但
  • 用纯JS动画最大高度?

    我想要为 div 的高度设置动画 这通常在 CSS 中通过动画来完成max height财产 但是我需要在 JS 中执行此操作 div 填充了经常变化的动态内容 因此无法提前知道实际高度 这是一个jsfiddle https jsfiddl