8102 年,如何实现带动画的折叠面板

作为一个经常写后端代码的程序员,偶尔写写前端代码也是勉强可以应付的。最近在重构某网站的时候,需要重新实现一个折叠面板。因为用了 Angular 这样酷炫的前端框架,我相信,就算没有 jQuery 这样的工具,手撸一个折叠面板应该没啥问题。就当我按照自己的直觉写完第一版代码之后,简单的运行了一下,我就发现事情好像并没有那么简单。

如果你愿意动手尝试的话,可以把下面的代码复制到 这里,在线预览效果

// v1 in less
.panel-content {
    margin: .4rem 1.2rem;
    overflow: hidden;
    transition: height .5s;
    &.collapsed {
        height: 0;
    }
    &.expanded {
        height: auto;
    }
}

我通过 JavaScript 让一个 div 的类在 collapsedexpanded 之间切换。折叠的时候设置元素高度为 0,展开的时候设置高度为 auto。这样运行出来的效果就是,虽然面板在展开与折叠状态之间切换了,但是并没有出现我想要的动画效果。经过一番检索,我发现,即使已经 8102 年了,我们还是无法为 height: 0height:auto 设置 transition

经过爆栈网上大佬的指点,我们可以使用 max-height 来实现这样的折叠效果:https://stackoverflow.com/a/8331169/6120806 。然后我就写出了第二版 LESS:

// v2 in less
.panel-content {
  background:tan;
  margin-top: 10px;
  overflow: hidden;

  &.collapsed {
    transition: max-height 0.50s;
    max-height: 0;
  }

  &.expanded {
    max-height: 9999px;
    transition: max-height 0.50s;
  }
}

这里有一个需要注意的地方,在展开状态下,需要把 max-height 设置为一个较大的值,避免面板内部的元素因为溢出而被隐藏。这下,动画效果就有了。

不过要是只有这么一点坑是对不起这个标题的,如果你使用的是第二版的代码,那么你就会发现一个诡异的问题,当收起面板的时候,会产生明显的延迟,跟那个答案中的演示效果出入很大,难道是因为他用的是 :hover 触发动画而我使用切换 class 触发动画这点不同吗?

再次经过一番检索,在爆栈网发现了对应的解决方案:https://stackoverflow.com/a/39103740/6120806。如果要通过切换 class 实现动画,我们需要显式的为收起的动画指定一个时间函数 cubic-bezier(0, 1, 0, 1),于是便有了下面的第三版。

.panel-content {
  background:tan;
  margin-top: 10px;
  overflow: hidden;

  &.collapsed {
    transition: max-height 0.50s cubic-bezier(0, 1, 0, 1);
    max-height: 0;
  }

  &.expanded {
    max-height: 999px;
    transition: max-height 0.50s cubic-bezier(1, 0, 1, 0);
  }
}

这下已经接近完美了,展开与收起的动画都十分流畅,没有任何延迟。不过,我看着这个动画突然感觉有些不对劲,为什么收起的时候动画的速度会感觉比较慢而展开的时候速度那么快?后来仔细阅读了上面提到的 Issue 下面的讨论,找到了答案:因为我们把展开状态下的 max-height 设置的太大了,所以 transition 中设置的动画时间并不是我们观察到的动画时间。为了应对这个问题,我们需要稍微延长一下展开的动画时间。

虽然已经 8102 年了,但是自己实现一个折叠面板,确实不太容易啊。

原文地址:https://www.cnblogs.com/JacZhu/p/9021040.html

时间: 2025-01-17 13:38:20

8102 年,如何实现带动画的折叠面板的相关文章

IOS的一个带动画的多项选择的控件(二)

然后我们来写:TypeSelectView 这个比较简单,我们只要只要每个TypeView的位置,然后作为自己的subview就好了 @interface TypeSelectView : UIView @property(nonatomic) BOOL bShown; @property(nonatomic, strong) TypeView* curSelectedView; -(id)initWithFrame:(CGRect)frame searchType:(int)type; @en

matlab中使用正弦波合成方波(带动画)

x=0:0.1:6*pi; for step=1:2:100 s=0; for i=1:2:step s = s+1/i*sin(i*x); end plot(s);set(figure(1),'visible','off'); filename=[num2str(step, '%04d'),'.png']; print(1, '-dpng',filename); end matlab中使用正弦波合成方波(带动画),布布扣,bubuko.com

/*带动画效果的hover*/

1 <!DOCTYPE html> 2 /*带动画效果的hover*/ 3 <html lang="en"> 4 <head> 5 <meta charset="UTF-8"> 6 <title>Title</title> 7 <style> 8 .ele{ 9 background-color: #dddddd;/*带动画效果的hover*/ 10 } 11 .ele:hover{

07---关于动态创建和销毁带动画的UIVew

在我们做开发的过程中经常会遇到在你触发了某个动作之后,需要动态添加一个带动画的UIView,执行完以后就销毁这个UIView #pragma mark 展示最新微博的数目 - (void)showNewStatusCount:(int)count { // 1.创建按钮 UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; btn.enabled = NO; // 设置按钮禁用 btn.adjustsImageWhenDisa

IOS的一个带动画的多项选择的控件(一)

先上效果图: 这个程序分2个层次,一个是顶部的带UITextField的bar,一个是下拉选择的view,下拉选择的view带有4个自定义的UIView 我们先定义一个UIViewController叫MyViewController,然后顶部的bar叫TopBarView,下拉选择的view叫TypeSelectView,像UIButton的自定义的view叫做TypeView TypeView有两种状态,如果手指触摸到的item就是选中状态,所以TypeSelectView应该有个属性表示当

UITableVIew与UICollectionView带动画删除cell时崩溃的处理

-会崩溃的原因是因为没有处理好数据源与cell之间的协调关系- 效果: tableView的源码: ModelCell.h + ModelCell.m // // ModelCell.h // Set // // Created by YouXianMing on 14/11/24. // Copyright (c) 2014年 YouXianMing. All rights reserved. // #import <UIKit/UIKit.h> @class ModelCell; @pro

Android带动画效果的弹窗

在网络加载数据的时候通常需要很多时间,这个时候程序里面经常需要写一个提示正在加载数据的弹窗,这篇文章用两种方式实现带动画效果的Dialog:帧动画实现和GIF动态图实现,它们都能达到动画的效果 第一种.帧动画实现 自定义一个Dialog,先看一下布局文件dialog_animation.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width=

Android开发:带动画的分享效果

这几天做了个带动画的分享页面,现在把它分享出来,如果你觉得有用,请直接使用,避免重复造轮子 先看下效果图 觉得只是看效果图不明显,那么用手机扫描下面的二维码下载安装包: 这个效果本身没有什么特别的难度,都是用Animator实现的,只是动画效果的代码量有点多,因为分享模块一般都会做,把这个分享出来,想要用的话,就不要重复写这么多行代码了 对于熟悉Animator的人,下面的代码可以略过了 我来看下主要的实现代码,完整的代码看底部的项目Github地址 1. 我用了一个方法,实现进入的效果,加上判

带动画效果的抽屉菜单栏

带动画效果的抽屉菜单栏 带动画效果的抽屉菜单栏,将android L 中drawer-indicator/back-arrow移植到低版本Android系统中. 下载地址:http://www.devstore.cn/code/info/960.html 运行截图: