jquery - Angular - 如何用正确的 Angular 代码替换这个 jQuery 状态变化?
问题描述
在一个组件中,我有一个触发 a 的主题,.next(value)
它触发了这个 jQuery 逻辑:
if (this.isOpen) {
jQuery(`#preview-${this.index}`).
stop().slideDown('fast');
} else {
jQuery(`#preview-${this.index}`).
stop().css('display', 'block').slideUp('fast');
};
你可以看到它以一个 id 为目标,所以我知道我必须用@ViewChild
装饰器构造替换它。
如何将 @ViewChild 与 scss 关键帧结合使用来实现相同的功能,以便删除 JQuery。
因为这是一个非常简单的 CSS 过渡,所以我正在寻找一种方法来做到这一点,而不必使用角度动画库(当然,除非那是唯一的方法)。
请注意,我在这里发现了针对 AngularJS 提出并回答的相同问题,但不是 Angular(无论如何!)
解决方案
完成这项工作有几个问题:
请注意,最后代码正在应用“显示:无”来隐藏元素。jQuery 在动画结束后应用它。所以这里的问题是你不能为 display:none 设置动画(显然,因为那里什么都没有!)。这个问题帮助我理解了这一点。
jQuery 向下滑动只是简单地为元素的高度设置动画,将其设置为 0。
因此,有了这些知识,它变得非常容易。首先用 css 类和动画设置两个状态:
.fb-card-open {
display: block;
}
.fb-card-closed {
display: block;
overflow: hidden;
animation: slideup;
padding-top: 0;
padding-bottom: 0;
animation-duration: 0.3s;
animation-fill-mode: forwards;
}
@keyframes slideup {
0% { height:inherit; }
100% { height:0; }
}
这意味着我们有 100% 的打开状态和关闭状态,这基本上将高度设置为 0 并删除顶部和底部的填充(因为动画元素内部有填充文本,所以即使高度为 0,您仍然会看到一些垂直空间)
然后使用 [ngClass] 指令在两个类之间切换:
[ngClass]="{'fb-card-open': isOpen, 'fb-card-closed' : !isOpen }"
感谢这篇文章,它帮助理解了如何做到这一点(这篇文章是关于 AngularJS,而不是 Angular,但原理与 [ngClass] 指令的行为方式相同)
注意 如果你设置 padding:0 而不仅仅是顶部和底部,你会为元素的子元素获得一个很酷的“飞入”效果,这是我通过这样做发现的一个不错的奖励!
推荐阅读
- c# - 如何使用 etw nlog 将日志写入自定义事件源
- python - `.iloc()` 与 dask 数据帧 groupby 一起使用时返回奇怪的结果
- python - 我如何在树莓派 3 中解决这个问题
- php - Laravel 6 采摘 hasManyThrough
- java - WSWS7263E: 发生以下异常:org.apache.axis2.AxisFault: HTTP(503) Unavailable address
- java - 无法单击复选框
- visual-studio-code - VS Code API - 远程调用
- websocket - 码头 websocket 客户端问题
- php - file_get_contents 是否存在具有偏移量和长度的开销与拆分原始文件并在需要时读取这些单个文件?
- swift - RealityKit 实体同步始终为零