动画学习之Animate.css的使用与解析[通俗易懂]

动画学习之Animate.css的使用与解析[通俗易懂]近况近期生活比较单一。const提升自己=true;while(提升自己){写码…看书…思考…睡觉}既单一也充实,单一使我平静,充实使我保持向上的感觉,希望自己真难做到“持续学习,保持思考,不断进步”。最近看到腾讯ISUX团

大家好,又见面了,我是你们的朋友全栈君。

近况

近期生活比较单一。

    const 提升自己 = true;
    while( 提升自己 ) {
        写码
        ...
        看书
        ...
        思考
        ...
        睡觉
    }

既单一也充实,单一使我平静,充实使我保持向上的感觉,希望自己真难做到“持续学习,保持思考,不断进步”。

最近看到腾讯ISUX团队的一篇博客《H5动效的常见制作手法》,里面简单介绍了现在H5开发中实现动画效果的几种方式(GIF,逐帧动画,css3,canvas,svg,video…),实际的内容不多,但对我多少有点启发意义,感兴趣的同学不妨看看。

作为一只前端小菜鸟,前端的各个细分领域都能吸引到我,于是看了上面的博客后,挑了最感兴趣的CSS3动画来学习。对于CSS3动画,我第一个想起的就是animate.css,于是便有了这篇博客。

快速上手animate.css

animate.css

animate.css的主页简单明了,能演示各个动画的效果,目的也很简单,“just-add-water css animations”。那天好奇去搜索了一下作者Daniel Eden,真是酷到不行。

不多说,直接上学习资料:

官方github

估计读完github里面的README.md之后就不用往下看了吧,对于animate.css的用法早已了然于心,如果你还有兴趣,想看看我这个无聊的博主能写些什么东西,希望不会让你失望。

一,静态使用动画(很绕吧…)

  1. 引用animate.css

  2. 给需要动画的元素添加class

    <!-- animated是必须添加的;bounce是动画效果;infinite从语义来看也秒懂,无限循环,不添加infinite默认播放一次 -->
    <div class="animated bounce infinite">动画</div>
  3. 刷新页面就能看到动画这两个字在上下蹦。done,静态使用就这么简单

总结一下场景和优缺点吧,优点是简单呀,添加个类名就一劳永逸了,一行js代码都不用写,缺点是不能人为控制开始和停止。我能想到的场景:

①loading动画

②新开页面某些元素动一次,能吸引用户注意(如注册按钮等)

二,动态使用

掌握了上述用法之后,动态使用也不过小菜一碟。基本思路如下:

给动画对象添加类,然后监听动画结束事件,一旦监听到动画结束,立即移除前面添加的类。

这样一来,想什么时候开始和结束动画都随你了。对于这种用法(也是实际开发中最多的用法),官方给出了jQuery的封装:

//扩展$对象,添加方法animateCss
    $.fn.extend({
        animateCss: function (animationName) { 
   
            var animationEnd = 'webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend';
            $(this).addClass('animated ' + animationName).one(animationEnd, function() { 
   
                $(this).removeClass('animated ' + animationName);
            });
    }
});

//使用示例:
$('#yourElement').animateCss('bounce');

因为手上有个小项目没用jQuery这么高大上的库,于是自己写了个js原生的实现,也扩展了一些功能:

    //animate("选择器","动画","次数","时延")
    function animate(seletor, animation_name, count, delay) { 
   
            var target = document.querySelectorAll(seletor)
            var timer = null;
            timer = setInterval( function() { 
   
                target.forEach( function(x) { 
   
                    x.className += " animated " + animation_name;
                    x.addEventListener("animationend", function(){ 
   
                    x.className = x.className.replace(" animated " + animation_name, "");
                    });
                } )
                count --;
                if( count <= 0 ) {
                    clearInterval( timer );
                }
            }, delay)
        }
    //使用示例
    animate('.haha', "bounce", 2, 1000);

上面的代码也就是个半成品:

  1. 只监听了”animationend”事件,兼容性不好(可多次调用addEventListener监听其他事件);
  2. 先延时,再执行(将回调函数封装一下,先调用回调函数一次,再进入间隔循环)

源码解析

源码只有一份animate.css,相对简单,下面主要说说三个关键类。

一,animated
设置了动画时长和动画执行前后元素应该怎样应用样式(animation-fill-mode

.animated { -webkit-animation-duration: 1s; animation-duration: 1s; -webkit-animation-fill-mode: both; animation-fill-mode: both; }

二,infinite

设置了动画次数(无限次)

.infinite { -webkit-animation-iteration-count: infinite; animation-iteration-count: infinite; }

三,动画类名(如:bounce)

设置使用的动画,及一些动画的初始化属性。
.bounce { -webkit-animation-name: bounce; animation-name: bounce; -webkit-transform-origin: center bottom; transform-origin: center bottom; }

@keyframes bounce {
  from, 20%, 53%, 80%, to { -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); -webkit-transform: translate3d(0,0,0); transform: translate3d(0,0,0); }

  40%, 43% { -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); -webkit-transform: translate3d(0, -30px, 0); transform: translate3d(0, -30px, 0); }

  70% { -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); -webkit-transform: translate3d(0, -15px, 0); transform: translate3d(0, -15px, 0); }

  90% { -webkit-transform: translate3d(0,-4px,0); transform: translate3d(0,-4px,0); }
}

总的来说实现的原理比较简单,业务组织也很明确,就是三个类,比较有意思的是去研究各个动画的keyframes是怎样的,很有意思(细节远比我想象的要多),例如上面那个bounce动画,从关键帧就能看出很多细节,随意蹦两下那么粗糙。

自定义选项

这个放在最后是因为看了源码之后很自然就无师自通懂得怎么自定义了,例如想用css来控制动画次数等。

#yourElement { -vendor-animation-duration: 3s; -vendor-animation-delay: 2s; -vendor-animation-iteration-count: infinite; }

else

内联元素(如a标签)不支持bounce动画。

动画学习的最大感悟是,好想去学动画设计呀,好动感。

该博客比较浅显,适合茶余饭后随便读读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/158209.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 前端程序员简历模板整理和下载

    前端程序员简历模板整理和下载大家好,我是漫步端午安康,今天晚上抽奖了,去看看参与一下吧。昨天分享了关于制作简历的一些建议,总的来说有这几个方面要点要记住:排版工整:不要出现错别字,版面清晰,段落自然,字体适中,简洁工…

    2022年10月7日
    3
  • xgboost分类算法_python分类统计

    xgboost分类算法_python分类统计今天我们一起来学习一下如何用Python来实现XGBoost分类,这个是一个监督学习的过程,首先我们需要导入两个Python库:importxgboostasxgbfromsklearn.metricsimportaccuracy_score这里的accuracy_score是用来计算分类的正确率的。我们这个分类是通过蘑菇的若干属性来判断蘑菇是否有毒的分类,我们来看看数据…

    2022年9月1日
    4
  • CSS 图片去色处理

    CSS 图片去色处理说到对图片进行处理,我们经常会想到PhotoShop这类的图像处理工具。作为前端开发者,我们经常会需要处理一些特效,例如根据不同的状态,让图标显示不同的颜色。或者是hover的时候,对图片的对比度,阴影进行处理。//黑白色img{transition:all.3sease;filter:grayscale(100%);opacity:.6;}//正常颜色img:hover{filter:none;opacity:1;

    2022年10月6日
    2
  • vscode创建html文件夹_vscode怎么新建js文件

    vscode创建html文件夹_vscode怎么新建js文件vscode:创建html文件一.创建html文件:1.创建后缀名为.html文档2.创建html的文档结构

    2022年8月22日
    6
  • LaTeX数学公式编辑(1)——行内公式&行间公式「建议收藏」

    LaTeX数学公式编辑(1)——行内公式&行间公式「建议收藏」1.行内公式2.行间公式2.1单行编号2.2单行不编号2.3多行编号2.4多行不编号3.说明4.参考文献对数学公式的排版,可以说是LaTeX中最精彩的部分.首先说需要注意的问题.数学公式中有时候会出现文字(中文或英文),需要将文字用命令\text{…}包起来.如果将文字不加处理,直接写到公式里面会出现如下问题:如果…

    2022年6月18日
    45
  • android的surfaceflinger原理学习「建议收藏」

    android的surfaceflinger原理学习「建议收藏」概念SurfaceFlinger是一个系统服务,如:audioflinger,audiopolicyservice等等,系统的主要服务通过这个文章进行了解,Android的系统服务一览。这个系统服务主要实现了Surface的建立、控制、管理等功能。换种说法就是,在Android的实现中它是一个service,提供系统范围内的surfacecomposer功能,它能够将各种应用程序的2D、3…

    2022年4月18日
    56

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号